--- /srv/reproducible-results/rbuild-debian/r-b-build.NVfv0k6e/b1/dune-common_2.9.0-7_amd64.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.NVfv0k6e/b2/dune-common_2.9.0-7_amd64.changes ├── Files │ @@ -1,4 +1,4 @@ │ │ a3f2d63b71e16238cd9c5ec989981768 517852 debug optional libdune-common-dev-dbgsym_2.9.0-7_amd64.deb │ a4ddc528cbcbbc3612be1d7e7bc1c459 381004 libdevel optional libdune-common-dev_2.9.0-7_amd64.deb │ - 74ef28398112a2752f0a736f6c54ccd3 3066484 doc optional libdune-common-doc_2.9.0-7_all.deb │ + f7baafd17dd488e98ee8087a501431c3 3064376 doc optional libdune-common-doc_2.9.0-7_all.deb ├── libdune-common-doc_2.9.0-7_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2024-10-10 14:59:54.000000 debian-binary │ │ --rw-r--r-- 0 0 0 26900 2024-10-10 14:59:54.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 3039392 2024-10-10 14:59:54.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 26928 2024-10-10 14:59:54.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 3037256 2024-10-10 14:59:54.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -31,65 +31,64 @@ │ │ │ │ │ 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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ │ 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/a00071_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00074_source.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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ │ @@ -127,31 +126,31 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00179_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ │ │ 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 │ │ │ │ │ @@ -171,69 +170,71 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ │ │ +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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ │ @@ -241,22 +242,21 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ │ │ +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/a00380_source.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 │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -26,259 +26,259 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2825 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/search.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 10550 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2004 2024-10-10 14:59:54.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 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3045 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00002.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4993 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31445 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20821 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29928 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8690 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15576 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10687 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 108967 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8828 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15690 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17516 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45459 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5356 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 41539 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6970 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13605 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28676 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4678 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7626 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17652 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42086 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5777 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10089 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4672 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6796 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8943 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4678 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7628 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14506 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 54081 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6856 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 112071 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4748 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10991 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22884 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6240 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6782 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5980 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21115 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 26419 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 61788 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14005 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 86153 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7494 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31467 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8196 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 148986 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4959 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6605 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5275 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11331 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5458 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8314 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7919 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 126603 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4128 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8731 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 61450 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3372 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 88030 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6176 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8812 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15704 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6662 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 52852 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4394 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6435 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4768 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14349 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33175 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5214 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15233 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14288 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 63256 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19607 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 104969 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20708 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 66287 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6556 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18103 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7124 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23206 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7265 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14139 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5767 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16722 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 60433 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 127266 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8170 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 63385 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6819 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 100137 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6158 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19960 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8323 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 40740 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5668 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10965 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4310 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17898 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12096 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 108064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5325 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10220 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5247 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9926 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3949 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5115 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9512 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7345 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18651 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6380 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19421 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4979 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51921 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16097 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7783 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12397 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29707 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3818 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6526 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13585 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 94215 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9721 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 240955 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17902 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 167223 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19865 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 179606 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8399 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 46563 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7409 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33439 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3649 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4983 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11420 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 290483 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9141 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 172723 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5638 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33611 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13149 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 178064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9019 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 52516 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6585 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 46321 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8766 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 71932 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5984 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51317 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6398 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33437 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3658 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4980 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6616 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 58092 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23075 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7592 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 136353 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11616 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 101374 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6505 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 39913 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6612 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19861 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5082 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8080 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6187 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17742 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7721 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5347 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33493 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6807 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12871 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5049 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23176 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5278 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22235 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11654 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55191 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21252 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 132735 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3899 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6713 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11004 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 81300 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 145342 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24039 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13871 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20199 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33483 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 357109 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9861 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20797 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3649 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7356 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9909 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8836 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10533 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9165 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6229 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21246 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9499 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 250589 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5654 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7234 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17882 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 79073 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8194 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 41231 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16771 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48543 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6781 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8264 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5043 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6951 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14995 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 142940 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7195 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 151469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8394 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6586 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44038 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24718 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 121580 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14770 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23217 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4655 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7486 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8704 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 26496 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4366 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5137 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5603 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9347 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6240 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6782 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6781 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8264 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14005 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 86153 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6586 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44038 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19865 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 179606 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9019 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 52516 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6612 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19861 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3649 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4983 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7592 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 136353 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7409 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33439 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23075 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8399 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 46563 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9141 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 172723 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8766 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 71932 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6616 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 58092 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6398 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33437 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5984 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51317 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11616 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 101374 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6505 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 39913 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3658 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4980 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5638 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33611 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6585 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 46321 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11420 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 290483 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13149 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 178064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7783 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12397 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 26419 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 61788 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5247 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9926 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16097 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9165 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33175 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8194 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 41231 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4768 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14349 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16771 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48543 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3899 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5654 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7234 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5356 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 41539 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5777 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10089 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4672 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6796 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4678 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7628 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17652 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42086 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8943 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4678 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7626 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6158 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19960 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4993 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31445 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8731 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 61450 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17516 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45459 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5082 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8080 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9721 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 240955 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17882 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 79073 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6380 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19421 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6187 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17742 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5325 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10220 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7345 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18651 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5347 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33493 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8836 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10533 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33483 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 357109 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9861 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20797 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6713 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11004 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3649 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 81300 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 145342 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13871 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20199 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24039 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3818 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6526 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8170 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 63385 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15704 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3372 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 88030 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8323 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 40740 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9499 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 250589 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6176 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8812 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5125 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29707 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8704 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 26496 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21252 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 132735 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6819 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 100137 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8196 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 148986 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7721 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6229 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21246 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13585 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 94215 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8690 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15576 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8394 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4366 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5137 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5458 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8314 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7356 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9909 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14506 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 54081 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8828 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15690 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5275 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11331 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19607 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 104969 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14770 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23217 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5115 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9512 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5668 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10965 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7494 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31467 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20708 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 66287 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6662 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 52852 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6970 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7919 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 126603 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17902 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 167223 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4748 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5049 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23176 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4655 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7486 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20821 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29928 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6856 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 112071 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4310 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17898 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4394 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6435 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7124 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23206 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12096 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 108064 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24718 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 121580 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5767 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16722 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13605 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28676 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3949 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5043 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6951 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 60433 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 127266 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10991 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22884 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14995 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 142940 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5214 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15233 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5603 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9347 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11654 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55191 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14288 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 63256 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4128 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4959 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6605 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7265 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14139 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6807 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12871 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4979 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5980 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21115 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6556 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18103 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7195 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 151469 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51921 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5278 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22235 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10687 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 108967 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7897 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5736 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00396.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 261282 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 27946 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 39665 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2473 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9343 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00399.html │ │ │ │ @@ -1127,15 +1127,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5016 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_ade7f944fd3a163752f5cc1af55c988a_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4572 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2402 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 48471 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 8980 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3669 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45631 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 149384 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 149369 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7704 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 51296 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1145 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1167 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0_dark.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1153 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_1.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 403 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 422 2024-10-10 14:59:54.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10_dark.png │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parameterizedobject.hh File Reference │ │ │ │ +dune-common: keywords.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,38 +70,63 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
parameterizedobject.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
keywords.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <functional>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Namespaces

namespace  Dune
 Dune namespace.
 

│ │ │ │ +Macros

#define DUNE_INLINE_VARIABLE   inline
 
#define DUNE_GENERALIZED_CONSTEXPR   constexpr
 
│ │ │ │ +

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
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,23 +1,29 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -parameterizedobject.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +_M_a_c_r_o_s │ │ │ │ │ +keywords.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _C_+_+_ _u_t_i_l_i_t_i_e_s_ _a_n_d_ _b_a_c_k_p_o_r_t_s │ │ │ │ │ +Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _> │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E   inline │ │ │ │ │   │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ +#define  _D_U_N_E___G_E_N_E_R_A_L_I_Z_E_D___C_O_N_S_T_E_X_P_R   constexpr │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +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. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEENNEERRAALLIIZZEEDD__CCOONNSSTTEEXXPPRR ********** │ │ │ │ │ +#define DUNE_GENERALIZED_CONSTEXPR   constexpr │ │ │ │ │ +********** _?◆_? DDUUNNEE__IINNLLIINNEE__VVAARRIIAABBLLEE ********** │ │ │ │ │ +#define DUNE_INLINE_VARIABLE   inline │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parameterizedobject.hh Source File │ │ │ │ +dune-common: keywords.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,178 +74,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
parameterizedobject.hh
│ │ │ │ +
keywords.hh
│ │ │ │
│ │ │ │
│ │ │ │ -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_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │ -
6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <functional>
│ │ │ │ -
9#include <map>
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16
│ │ │ │ -
34template<typename Signature,
│ │ │ │ -
35 typename KeyT = std::string>
│ │ │ │ - │ │ │ │ -
37
│ │ │ │ -
38template<typename TypeT,
│ │ │ │ -
39 typename KeyT,
│ │ │ │ -
40 typename... Args>
│ │ │ │ -
│ │ │ │ -
41class ParameterizedObjectFactory<TypeT(Args...), KeyT>
│ │ │ │ -
42{
│ │ │ │ -
43 public:
│ │ │ │ -
44
│ │ │ │ -
46 typedef KeyT Key;
│ │ │ │ -
47
│ │ │ │ -
49 using Type = TypeT;
│ │ │ │ -
50
│ │ │ │ -
51 protected:
│ │ │ │ -
52
│ │ │ │ -
53 using Creator = std::function<Type(Args...)>;
│ │ │ │ -
54
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Utilities for type computations, constraining overloads, ...
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ +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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,200 +1,33 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -parameterizedobject.hh │ │ │ │ │ +keywords.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=4 sts=4: │ │ │ │ │ -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_PARAMETERIZEDOBJECT_HH │ │ │ │ │ -6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16 │ │ │ │ │ -34template │ │ │ │ │ -_3_6class _P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y; │ │ │ │ │ -37 │ │ │ │ │ -38template │ │ │ │ │ -_4_1class _P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y │ │ │ │ │ -42{ │ │ │ │ │ -43 public: │ │ │ │ │ -44 │ │ │ │ │ -_4_6 typedef KeyT _K_e_y; │ │ │ │ │ -47 │ │ │ │ │ -_4_9 using _T_y_p_e = TypeT; │ │ │ │ │ -50 │ │ │ │ │ -51 protected: │ │ │ │ │ -52 │ │ │ │ │ -_5_3 using _C_r_e_a_t_o_r = std::function<_T_y_p_e(Args...)>; │ │ │ │ │ -54 │ │ │ │ │ -55 template │ │ │ │ │ -_5_6 static constexpr auto _h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e(_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_1_>) │ │ │ │ │ -57 -> decltype( std::declval()(std::declval()...), std::true_type()) │ │ │ │ │ -58 { │ │ │ │ │ -59 return {}; │ │ │ │ │ -60 } │ │ │ │ │ -61 │ │ │ │ │ -62 template │ │ │ │ │ -_6_3 static constexpr std::false_type _h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e(_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_0_>) │ │ │ │ │ -64 { │ │ │ │ │ -65 return {}; │ │ │ │ │ -66 } │ │ │ │ │ -67 │ │ │ │ │ -68 public: │ │ │ │ │ -69 │ │ │ │ │ -_7_7 _T_y_p_e _c_r_e_a_t_e(_K_e_y const& key, Args ... args) const { │ │ │ │ │ -78 typename Registry::const_iterator i = registry_.find(key); │ │ │ │ │ -79 if (i == registry_.end()) { │ │ │ │ │ -80 _D_U_N_E___T_H_R_O_W(_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n, │ │ │ │ │ -81 "ParametrizedObjectFactory: key ``" << │ │ │ │ │ -82 key << "'' not registered"); │ │ │ │ │ -83 } │ │ │ │ │ -84 else return i->second(args...); │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -100 template │ │ │ │ │ -_1_0_1 void _d_e_f_i_n_e(_K_e_y const& key) │ │ │ │ │ -102 { │ │ │ │ │ -103 registry_[key] = DefaultCreator(); │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -119 template(_P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()), int>:: │ │ │ │ │ -type = 0> │ │ │ │ │ -_1_2_1 void _d_e_f_i_n_e(_K_e_y 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> │ │ │ │ │ -_1_4_5 void _d_e_f_i_n_e(_K_e_y const& key, Impl&& t) │ │ │ │ │ -146 { │ │ │ │ │ -147 registry_[key] = [=](Args...) { return t;}; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -_1_5_0 bool _c_o_n_t_a_i_n_s(_K_e_y const& key) const │ │ │ │ │ -151 { │ │ │ │ │ -152 return registry_.count(key); │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -155 private: │ │ │ │ │ -156 │ │ │ │ │ -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 │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y │ │ │ │ │ -A factory class for parameterized objects. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_C_r_e_a_t_o_r │ │ │ │ │ -std::function< Type(Args...)> Creator │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e │ │ │ │ │ -static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype │ │ │ │ │ -(std::declval< F >()(std::declval< Args >()...), std::true_type()) │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_T_y_p_e │ │ │ │ │ -TypeT Type │ │ │ │ │ -The type of objects created by the factory. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ -void define(Key const &key, Impl &&t) │ │ │ │ │ -Registers a new type with a key. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_K_e_y │ │ │ │ │ -KeyT Key │ │ │ │ │ -The typ of the keys. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ -Type create(Key const &key, Args ... args) const │ │ │ │ │ -Creates an object identified by a key from given parameters. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ -void define(Key const &key) │ │ │ │ │ -Registers a new type with a key. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ -void define(Key const &key, F &&f) │ │ │ │ │ -Registers a new creator with a key. │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e │ │ │ │ │ -static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >) │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ -bool contains(Key const &key) const │ │ │ │ │ -DDeeffiinniittiioonn parameterizedobject.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ +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 │ │ │ │ │ +_1_9#define DUNE_INLINE_VARIABLE inline │ │ │ │ │ +20#else │ │ │ │ │ +22 │ │ │ │ │ +25#define DUNE_INLINE_VARIABLE │ │ │ │ │ +26#endif │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29#if __cpp_constexpr >= 201304 │ │ │ │ │ +_3_0#define DUNE_GENERALIZED_CONSTEXPR constexpr │ │ │ │ │ +31#else │ │ │ │ │ +33 │ │ │ │ │ +36#define DUNE_GENERALIZED_CONSTEXPR │ │ │ │ │ +37#endif │ │ │ │ │ +38 │ │ │ │ │ +39 │ │ │ │ │ +40#endif // DUNE_COMMON_KEYWORDS_HH │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indices.hh File Reference │ │ │ │ +dune-common: visibility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,114 +70,70 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
indices.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
visibility.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/keywords.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Namespaces

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

│ │ │ │ -Typedefs

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

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

│ │ │ │ -Variables

constexpr index_constant< 0 > Dune::Indices::_0 = {}
 Compile time index with value 0.
 
constexpr index_constant< 1 > Dune::Indices::_1 = {}
 Compile time index with value 1.
 
constexpr index_constant< 2 > Dune::Indices::_2 = {}
 Compile time index with value 2.
 
constexpr index_constant< 3 > Dune::Indices::_3 = {}
 Compile time index with value 3.
 
constexpr index_constant< 4 > Dune::Indices::_4 = {}
 Compile time index with value 4.
 
constexpr index_constant< 5 > Dune::Indices::_5 = {}
 Compile time index with value 5.
 
constexpr index_constant< 6 > Dune::Indices::_6 = {}
 Compile time index with value 6.
 
constexpr index_constant< 7 > Dune::Indices::_7 = {}
 Compile time index with value 7.
 
constexpr index_constant< 8 > Dune::Indices::_8 = {}
 Compile time index with value 8.
 
constexpr index_constant< 9 > Dune::Indices::_9 = {}
 Compile time index with value 9.
 
constexpr index_constant< 10 > Dune::Indices::_10 = {}
 Compile time index with value 10.
 
constexpr index_constant< 11 > Dune::Indices::_11 = {}
 Compile time index with value 11.
 
constexpr index_constant< 12 > Dune::Indices::_12 = {}
 Compile time index with value 12.
 
constexpr index_constant< 13 > Dune::Indices::_13 = {}
 Compile time index with value 13.
 
constexpr index_constant< 14 > Dune::Indices::_14 = {}
 Compile time index with value 14.
 
constexpr index_constant< 15 > Dune::Indices::_15 = {}
 Compile time index with value 15.
 
constexpr index_constant< 16 > Dune::Indices::_16 = {}
 Compile time index with value 16.
 
constexpr index_constant< 17 > Dune::Indices::_17 = {}
 Compile time index with value 17.
 
constexpr index_constant< 18 > Dune::Indices::_18 = {}
 Compile time index with value 18.
 
constexpr index_constant< 19 > Dune::Indices::_19 = {}
 Compile time index with value 19.
 

│ │ │ │ +Macros

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

Detailed Description

│ │ │ │ +

Definition of macros controlling symbol visibility at the ABI level.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_EXPORT

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_EXPORT   implementation_defined
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

Export a symbol as part of the public ABI.

│ │ │ │ +

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

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

◆ DUNE_PRIVATE

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_PRIVATE   implementation_defined
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +

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

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,96 +1,35 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -indices.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_k_e_y_w_o_r_d_s_._h_h> │ │ │ │ │ +_M_a_c_r_o_s │ │ │ │ │ +visibility.hh File Reference │ │ │ │ │ +Definition of macros controlling symbol visibility at the ABI level. _M_o_r_e_._._. │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_n_d_i_c_e_s │ │ │ │ │ -  Namespace with predefined compile time indices for the range │ │ │ │ │ - [0,19]. │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t = std::integral_constant< std::size_t, i > │ │ │ │ │ -  An index constant with value i. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -decltype(auto) constexpr  _D_u_n_e_:_:_u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e (F &&f, std:: │ │ │ │ │ - integer_sequence< I, i... > sequence) │ │ │ │ │ -  Unpack an std::integer_sequence to std:: │ │ │ │ │ - integral_constant... │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 0 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___0 = {} │ │ │ │ │ -  Compile time index with value 0. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 1 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1 = {} │ │ │ │ │ -  Compile time index with value 1. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 2 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___2 = {} │ │ │ │ │ -  Compile time index with value 2. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 3 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___3 = {} │ │ │ │ │ -  Compile time index with value 3. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 4 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___4 = {} │ │ │ │ │ -  Compile time index with value 4. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 5 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___5 = {} │ │ │ │ │ -  Compile time index with value 5. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 6 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___6 = {} │ │ │ │ │ -  Compile time index with value 6. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 7 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___7 = {} │ │ │ │ │ -  Compile time index with value 7. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 8 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___8 = {} │ │ │ │ │ -  Compile time index with value 8. │ │ │ │ │ -  │ │ │ │ │ - constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 9 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___9 = {} │ │ │ │ │ -  Compile time index with value 9. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 10 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_0 = {} │ │ │ │ │ -  Compile time index with value 10. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 11 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_1 = {} │ │ │ │ │ -  Compile time index with value 11. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 12 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_2 = {} │ │ │ │ │ -  Compile time index with value 12. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 13 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_3 = {} │ │ │ │ │ -  Compile time index with value 13. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 14 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_4 = {} │ │ │ │ │ -  Compile time index with value 14. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 15 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_5 = {} │ │ │ │ │ -  Compile time index with value 15. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 16 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_6 = {} │ │ │ │ │ -  Compile time index with value 16. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 17 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_7 = {} │ │ │ │ │ -  Compile time index with value 17. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 18 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_8 = {} │ │ │ │ │ -  Compile time index with value 18. │ │ │ │ │ -  │ │ │ │ │ -constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t< 19 >  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_9 = {} │ │ │ │ │ -  Compile time index with value 19. │ │ │ │ │ -  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___E_X_P_O_R_T   implementation_defined │ │ │ │ │ +  Export a symbol as part of the public ABI. │ │ │ │ │ +  │ │ │ │ │ +#define  _D_U_N_E___P_R_I_V_A_T_E   implementation_defined │ │ │ │ │ +  Mark a symbol as being for internal use within the current DSO only. │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Definition of macros controlling symbol visibility at the ABI level. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__EEXXPPOORRTT ********** │ │ │ │ │ +#define DUNE_EXPORT   implementation_defined │ │ │ │ │ +Export a symbol as part of the public ABI. │ │ │ │ │ +Mark a class, function or static variable as visible outside the current DSO. │ │ │ │ │ +For now, this is mostly important for templated global variables and functions │ │ │ │ │ +that contain static variables. │ │ │ │ │ +********** _?◆_? DDUUNNEE__PPRRIIVVAATTEE ********** │ │ │ │ │ +#define DUNE_PRIVATE   implementation_defined │ │ │ │ │ +Mark a symbol as being for internal use within the current DSO only. │ │ │ │ │ +Mark a class, function or static variable as inaccessible from outside the │ │ │ │ │ +current DSO. Doing so will decrease the size of the symbol table, but you have │ │ │ │ │ +to be sure that the symbol will never have to be accessed from another library │ │ │ │ │ +or the main executable! │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indices.hh Source File │ │ │ │ +dune-common: visibility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,120 +74,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
indices.hh
│ │ │ │ +
visibility.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>;
│ │ │ │ +
5#ifndef DUNE_COMMON_VISIBILITY_HH
│ │ │ │ +
6#define DUNE_COMMON_VISIBILITY_HH
│ │ │ │ +
7
│ │ │ │ +
12#ifdef DOXYGEN
│ │ │ │ +
13
│ │ │ │ +
15
│ │ │ │ +
20#define DUNE_EXPORT implementation_defined
│ │ │ │ +
21
│ │ │ │ +
23
│ │ │ │ +
28#define DUNE_PRIVATE implementation_defined
│ │ │ │ +
29
│ │ │ │ +
30#else // DOXYGEN
│ │ │ │
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
│ │ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
32#if __GNUC__ >= 4
│ │ │ │ +
33// GCC and Clang both define __GNUC__ to 4 and they both support the visibility
│ │ │ │ +
34// attribute
│ │ │ │ +
35#define DUNE_EXPORT __attribute__((visibility("default")))
│ │ │ │ +
36#define DUNE_PRIVATE __attribute__((visibility("hidden")))
│ │ │ │ +
37#else
│ │ │ │ +
38// We don't know about the active compiler, so just turn the visibility macros to no-ops.
│ │ │ │ +
39#define DUNE_EXPORT
│ │ │ │ +
40#define DUNE_PRIVATE
│ │ │ │ +
41#endif
│ │ │ │ +
42
│ │ │ │ +
43#endif // DOXYGEN
│ │ │ │ +
44
│ │ │ │ +
45#endif // DUNE_COMMON_VISIBILITY
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,183 +1,44 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -indices.hh │ │ │ │ │ +visibility.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 <_d_u_n_e_/_c_o_m_m_o_n_/_k_e_y_w_o_r_d_s_._h_h> │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e │ │ │ │ │ -16{ │ │ │ │ │ -29 template │ │ │ │ │ -_3_0 using _i_n_d_e_x___c_o_n_s_t_a_n_t = std::integral_constant; │ │ │ │ │ +5#ifndef DUNE_COMMON_VISIBILITY_HH │ │ │ │ │ +6#define DUNE_COMMON_VISIBILITY_HH │ │ │ │ │ +7 │ │ │ │ │ +12#ifdef DOXYGEN │ │ │ │ │ +13 │ │ │ │ │ +15 │ │ │ │ │ +_2_0#define DUNE_EXPORT implementation_defined │ │ │ │ │ +21 │ │ │ │ │ +23 │ │ │ │ │ +_2_8#define DUNE_PRIVATE implementation_defined │ │ │ │ │ +29 │ │ │ │ │ +30#else // DOXYGEN │ │ │ │ │ 31 │ │ │ │ │ -32 │ │ │ │ │ -33 │ │ │ │ │ -_5_0 namespace Indices │ │ │ │ │ -51 { │ │ │ │ │ -_5_3 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _0_> ___0 = {}; │ │ │ │ │ -54 │ │ │ │ │ -_5_6 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _1_> ___1 = {}; │ │ │ │ │ -57 │ │ │ │ │ -_5_9 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _2_> ___2 = {}; │ │ │ │ │ -60 │ │ │ │ │ -_6_2 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _3_> ___3 = {}; │ │ │ │ │ -63 │ │ │ │ │ -_6_5 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _4_> ___4 = {}; │ │ │ │ │ -66 │ │ │ │ │ -_6_8 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _5_> ___5 = {}; │ │ │ │ │ -69 │ │ │ │ │ -_7_1 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _6_> ___6 = {}; │ │ │ │ │ -72 │ │ │ │ │ -_7_4 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _7_> ___7 = {}; │ │ │ │ │ -75 │ │ │ │ │ -_7_7 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _8_> ___8 = {}; │ │ │ │ │ -78 │ │ │ │ │ -_8_0 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _9_> ___9 = {}; │ │ │ │ │ -81 │ │ │ │ │ -_8_3 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_0_> ___1_0 = {}; │ │ │ │ │ -84 │ │ │ │ │ -_8_6 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_1_> ___1_1 = {}; │ │ │ │ │ -87 │ │ │ │ │ -_8_9 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_2_> ___1_2 = {}; │ │ │ │ │ -90 │ │ │ │ │ -_9_2 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_3_> ___1_3 = {}; │ │ │ │ │ -93 │ │ │ │ │ -_9_5 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_4_> ___1_4 = {}; │ │ │ │ │ -96 │ │ │ │ │ -_9_8 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_5_> ___1_5 = {}; │ │ │ │ │ -99 │ │ │ │ │ -_1_0_1 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_6_> ___1_6 = {}; │ │ │ │ │ -102 │ │ │ │ │ -_1_0_4 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_7_> ___1_7 = {}; │ │ │ │ │ -105 │ │ │ │ │ -_1_0_7 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_8_> ___1_8 = {}; │ │ │ │ │ -108 │ │ │ │ │ -_1_1_0 _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_9_> ___1_9 = {}; │ │ │ │ │ -111 │ │ │ │ │ -112 } // namespace Indices │ │ │ │ │ -113 │ │ │ │ │ -124 template │ │ │ │ │ -_1_2_5 decltype(auto) constexpr _u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e(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 │ │ │ │ │ -_k_e_y_w_o_r_d_s_._h_h │ │ │ │ │ -Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ -_D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E │ │ │ │ │ -#define DUNE_INLINE_VARIABLE │ │ │ │ │ -DDeeffiinniittiioonn keywords.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_6 │ │ │ │ │ -constexpr index_constant< 16 > _16 │ │ │ │ │ -Compile time index with value 16. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_5 │ │ │ │ │ -constexpr index_constant< 15 > _15 │ │ │ │ │ -Compile time index with value 15. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___8 │ │ │ │ │ -constexpr index_constant< 8 > _8 │ │ │ │ │ -Compile time index with value 8. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___7 │ │ │ │ │ -constexpr index_constant< 7 > _7 │ │ │ │ │ -Compile time index with value 7. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___0 │ │ │ │ │ -constexpr index_constant< 0 > _0 │ │ │ │ │ -Compile time index with value 0. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___9 │ │ │ │ │ -constexpr index_constant< 9 > _9 │ │ │ │ │ -Compile time index with value 9. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_4 │ │ │ │ │ -constexpr index_constant< 14 > _14 │ │ │ │ │ -Compile time index with value 14. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1 │ │ │ │ │ -constexpr index_constant< 1 > _1 │ │ │ │ │ -Compile time index with value 1. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___3 │ │ │ │ │ -constexpr index_constant< 3 > _3 │ │ │ │ │ -Compile time index with value 3. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_2 │ │ │ │ │ -constexpr index_constant< 12 > _12 │ │ │ │ │ -Compile time index with value 12. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e │ │ │ │ │ -decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, │ │ │ │ │ -i... > sequence) │ │ │ │ │ -Unpack an std::integer_sequence to std::integral_constant... │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_1 │ │ │ │ │ -constexpr index_constant< 11 > _11 │ │ │ │ │ -Compile time index with value 11. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_8 │ │ │ │ │ -constexpr index_constant< 18 > _18 │ │ │ │ │ -Compile time index with value 18. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:107 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_3 │ │ │ │ │ -constexpr index_constant< 13 > _13 │ │ │ │ │ -Compile time index with value 13. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___5 │ │ │ │ │ -constexpr index_constant< 5 > _5 │ │ │ │ │ -Compile time index with value 5. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_7 │ │ │ │ │ -constexpr index_constant< 17 > _17 │ │ │ │ │ -Compile time index with value 17. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_0 │ │ │ │ │ -constexpr index_constant< 10 > _10 │ │ │ │ │ -Compile time index with value 10. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___2 │ │ │ │ │ -constexpr index_constant< 2 > _2 │ │ │ │ │ -Compile time index with value 2. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_9 │ │ │ │ │ -constexpr index_constant< 19 > _19 │ │ │ │ │ -Compile time index with value 19. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___6 │ │ │ │ │ -constexpr index_constant< 6 > _6 │ │ │ │ │ -Compile time index with value 6. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___4 │ │ │ │ │ -constexpr index_constant< 4 > _4 │ │ │ │ │ -Compile time index with value 4. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:65 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +32#if __GNUC__ >= 4 │ │ │ │ │ +33// GCC and Clang both define __GNUC__ to 4 and they both support the │ │ │ │ │ +visibility │ │ │ │ │ +34// attribute │ │ │ │ │ +35#define DUNE_EXPORT __attribute__((visibility("default"))) │ │ │ │ │ +36#define DUNE_PRIVATE __attribute__((visibility("hidden"))) │ │ │ │ │ +37#else │ │ │ │ │ +38// We don't know about the active compiler, so just turn the visibility │ │ │ │ │ +macros to no-ops. │ │ │ │ │ +39#define DUNE_EXPORT │ │ │ │ │ +40#define DUNE_PRIVATE │ │ │ │ │ +41#endif │ │ │ │ │ +42 │ │ │ │ │ +43#endif // DOXYGEN │ │ │ │ │ +44 │ │ │ │ │ +45#endif // DUNE_COMMON_VISIBILITY │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: referencehelper.hh File Reference │ │ │ │ +dune-common: simd.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,60 +70,96 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
referencehelper.hh File Reference
│ │ │ │ +Functions
│ │ │ │ +
simd.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <functional>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#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::SimdScalarTypeTraits< T >
 
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.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
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.
 
template<typename V >
using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type
 A simd vector of truth values corresponding to a simd vector V.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Functions

template<class T >
constexpr T & Dune::resolveRef (T &gf) noexcept
 Helper function to resolve std::reference_wrapper.
 
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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Variables

template<class T >
constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
 Helper to detect if given type is a std::reference_wrapper.
 
template<class T >
std::size_t Dune::lanes (const T &)
 get the number of lanes of a simd vector (scalar version)
 
template<class T >
Dune::lane (std::size_t l, const T &v)
 access a lane of a simd vector (scalar version)
 
template<class T >
T & Dune::lane (std::size_t l, T &v)
 access a lane of a simd vector (scalar version)
 
template<class T >
void Dune::assign (T &dst, const T &src, bool mask)
 masked Simd assignment (scalar version)
 
template<class T >
void Dune::swap (T &v1, T &v2, bool mask)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

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 {} │ │ │ │ │ @@ -1,40 +1,79 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -referencehelper.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +simd.hh File Reference │ │ │ │ │ +Abstractions for support of dedicated SIMD data types. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_d_i_t_i_o_n_a_l_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_b_u_g_a_l_i_g_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_c_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ +  deduce the underlying scalar data type of an AlignedNumber _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_<_ _V_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_<_ _V_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_R_e_s_o_l_v_e_R_e_f___t = std::remove_reference_t< decltype(_D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f │ │ │ │ │ - (std::declval< T & >()))> │ │ │ │ │ -  Type trait to resolve std::reference_wrapper. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r = typename _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< T >::type │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_S_i_m_d_I_n_d_e_x = typename _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s< V >::type │ │ │ │ │ +  An simd vector of indices corresponding to a simd vector V. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_S_i_m_d_M_a_s_k = typename _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s< V >::type │ │ │ │ │ +  A simd vector of truth values corresponding to a simd vector V. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ template │ │ │ │ │ -constexpr T &  _D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f (T &gf) noexcept │ │ │ │ │ -  Helper function to resolve std::reference_wrapper. │ │ │ │ │ +std::size_t  _D_u_n_e_:_:_l_a_n_e_s (const T &) │ │ │ │ │ +  get the number of lanes of a simd vector (scalar version) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T  _D_u_n_e_:_:_l_a_n_e (std::size_t l, const T &v) │ │ │ │ │ +  access a lane of a simd vector (scalar version) │ │ │ │ │   │ │ │ │ │ template │ │ │ │ │ - const auto &  _D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f (T &&gf)=delete │ │ │ │ │ + T &  _D_u_n_e_:_:_l_a_n_e (std::size_t l, T &v) │ │ │ │ │ +  access a lane of a simd vector (scalar version) │ │ │ │ │   │ │ │ │ │ template │ │ │ │ │ -constexpr T &  _D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f (std::reference_wrapper< T > gf) noexcept │ │ │ │ │ -  Helper function to resolve std::reference_wrapper. │ │ │ │ │ + void  _D_u_n_e_:_:_a_s_s_i_g_n (T &dst, const T &src, bool mask) │ │ │ │ │ +  masked _S_i_m_d assignment (scalar version) │ │ │ │ │   │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ template │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_I_s_R_e_f_e_r_e_n_c_e_W_r_a_p_p_e_r___v = Impl::IsReferenceWrapper::value │ │ │ │ │ -  Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ + void  _D_u_n_e_:_:_s_w_a_p (T &v1, T &v2, bool mask) │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Abstractions for support of dedicated SIMD data types. │ │ │ │ │ +Libraries like Vc (_h_t_t_p_s_:_/_/_g_i_t_h_u_b_._c_o_m_/_V_c_D_e_v_e_l_/_V_c) 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 _c_o_n_d_i_t_i_o_n_a_l_._h_h and range_utils.hh headers. │ │ │ │ │ + _DD_ee_pp_rr_ee_cc_aa_tt_ee_dd_:: │ │ │ │ │ + Use the newer simd architecture from _d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_s_i_m_d_._h_h instead. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: referencehelper.hh Source File │ │ │ │ +dune-common: simd.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,92 +74,518 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referencehelper.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_REFERENCE_HELPER_HH
│ │ │ │ -
6#define DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ -
7
│ │ │ │ -
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
│ │ │ │ +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
│ │ │ │ +
49#if HAVE_VC
│ │ │ │ +
50 namespace VcImpl {
│ │ │ │
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
│ │ │ │ +
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
│ │ │ │ -
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.
│ │ │ │ +
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 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
│ │ │ │ +
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 return Vc::Vector<T, A>::size();
│ │ │ │ +
385 }
│ │ │ │ +
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#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
│ │ │ │ +
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>
│ │ │ │ +
Utilities for reduction like operations on ranges.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ + │ │ │ │ + │ │ │ │
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
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,98 +1,549 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -referencehelper.hh │ │ │ │ │ +simd.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -3// SPDX-FileCopyrightInfo: Copyright (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_REFERENCE_HELPER_HH │ │ │ │ │ -6#define DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11 │ │ │ │ │ -12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14 │ │ │ │ │ -15namespace Impl { │ │ │ │ │ -16 │ │ │ │ │ -17 template │ │ │ │ │ -18 class IsReferenceWrapper : public std::false_type {}; │ │ │ │ │ -19 │ │ │ │ │ -20 template │ │ │ │ │ -21 class IsReferenceWrapper<_s_t_d::reference_wrapper> : public std::true_type │ │ │ │ │ -{}; │ │ │ │ │ -22 │ │ │ │ │ -23 template │ │ │ │ │ -24 class IsReferenceWrapper> : public std:: │ │ │ │ │ -true_type {}; │ │ │ │ │ -25 │ │ │ │ │ -26} // namespace Dune::Impl │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -34template │ │ │ │ │ -_3_5constexpr bool _I_s_R_e_f_e_r_e_n_c_e_W_r_a_p_p_e_r___v = Impl::IsReferenceWrapper::value; │ │ │ │ │ -36 │ │ │ │ │ -37 │ │ │ │ │ -46template │ │ │ │ │ -_4_7constexpr T& _r_e_s_o_l_v_e_R_e_f(T& gf) noexcept │ │ │ │ │ -48{ │ │ │ │ │ -49 return gf; │ │ │ │ │ -50} │ │ │ │ │ -51 │ │ │ │ │ +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 <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_d_i_t_i_o_n_a_l_._h_h> │ │ │ │ │ +36#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_b_u_g_a_l_i_g_n_._h_h> │ │ │ │ │ +37#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +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 <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_v_c_._h_h> │ │ │ │ │ +42#endif │ │ │ │ │ +43#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +44#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_c_._h_h> │ │ │ │ │ +45 │ │ │ │ │ +46namespace _D_u_n_e │ │ │ │ │ +47{ │ │ │ │ │ +48 │ │ │ │ │ +49#if HAVE_VC │ │ │ │ │ +50 namespace VcImpl { │ │ │ │ │ 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 │ │ │ │ │ -_6_0const auto& _r_e_s_o_l_v_e_R_e_f(T&& gf) = delete; │ │ │ │ │ -61 │ │ │ │ │ -62 │ │ │ │ │ -81template │ │ │ │ │ -_8_2constexpr T& _r_e_s_o_l_v_e_R_e_f(std::reference_wrapper gf) noexcept │ │ │ │ │ -83{ │ │ │ │ │ -84 return gf.get(); │ │ │ │ │ -85} │ │ │ │ │ -86 │ │ │ │ │ -87 │ │ │ │ │ -88 │ │ │ │ │ -99template │ │ │ │ │ -_1_0_0using _R_e_s_o_l_v_e_R_e_f___t = std::remove_reference_t()))>; │ │ │ │ │ -101 │ │ │ │ │ -102 │ │ │ │ │ -103} // namespace Dune │ │ │ │ │ +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 │ │ │ │ │ -106 │ │ │ │ │ -107#endif // DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ -_D_u_n_e_:_:_I_s_R_e_f_e_r_e_n_c_e_W_r_a_p_p_e_r___v │ │ │ │ │ -constexpr bool IsReferenceWrapper_v │ │ │ │ │ -Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ -DDeeffiinniittiioonn referencehelper.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f │ │ │ │ │ -constexpr T & resolveRef(T &gf) noexcept │ │ │ │ │ -Helper function to resolve std::reference_wrapper. │ │ │ │ │ -DDeeffiinniittiioonn referencehelper.hh:47 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +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 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(=); │ │ │ │ │ +154 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(*=); │ │ │ │ │ +155 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(/=); │ │ │ │ │ +156 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(%=); │ │ │ │ │ +157 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(+=); │ │ │ │ │ +158 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(-=); │ │ │ │ │ +159 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(<<=); │ │ │ │ │ +160 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(>>=); │ │ │ │ │ +161 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(&=); │ │ │ │ │ +162 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(^=); │ │ │ │ │ +163 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(|=); │ │ │ │ │ +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 _s_w_a_p(Proxy, Proxy); │ │ │ │ │ +170 │ │ │ │ │ +171 template │ │ │ │ │ +172 friend void _s_w_a_p(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 _s_w_a_p(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 │ │ │ │ │ +191 void _s_w_a_p(Proxy p1, Proxy 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 │ │ │ │ │ +_2_0_1 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ +202 { │ │ │ │ │ +_2_0_3 using _t_y_p_e = T; │ │ │ │ │ +204 }; │ │ │ │ │ +205 │ │ │ │ │ +206 template │ │ │ │ │ +_2_0_7 using _S_i_m_d_S_c_a_l_a_r = typename _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_T_>_:_:_t_y_p_e; │ │ │ │ │ +208 │ │ │ │ │ +209#if HAVE_VC │ │ │ │ │ +210 /* │ │ │ │ │ +211 Add Vc specializations for the SimdScalarTypeTraits trais class │ │ │ │ │ +212 */ │ │ │ │ │ +213 template │ │ │ │ │ +214 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< Vc::Vector > │ │ │ │ │ +215 { │ │ │ │ │ +216 using _t_y_p_e = T; │ │ │ │ │ +217 }; │ │ │ │ │ +218 │ │ │ │ │ +219 template │ │ │ │ │ +220 struct SimdScalarTypeTraits< Vc::SimdArray > │ │ │ │ │ +221 { │ │ │ │ │ +222 using _t_y_p_e = T; │ │ │ │ │ +223 }; │ │ │ │ │ +224#endif // HAVE_VC │ │ │ │ │ +225 │ │ │ │ │ +227 template │ │ │ │ │ +_2_2_8 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< _A_l_i_g_n_e_d_N_u_m_b_e_r > │ │ │ │ │ +229 { │ │ │ │ │ +_2_3_0 using _t_y_p_e = T; │ │ │ │ │ +231 }; │ │ │ │ │ +232 │ │ │ │ │ +233 template │ │ │ │ │ +_2_3_4 struct _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s { │ │ │ │ │ +_2_3_5 using _t_y_p_e = std::size_t; │ │ │ │ │ +236 }; │ │ │ │ │ +237 │ │ │ │ │ +239 │ │ │ │ │ +245 template │ │ │ │ │ +_2_4_6 using _S_i_m_d_I_n_d_e_x = typename _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_<_V_>_:_:_t_y_p_e; │ │ │ │ │ +247 │ │ │ │ │ +248#if HAVE_VC │ │ │ │ │ +249 template │ │ │ │ │ +250 struct _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s > { │ │ │ │ │ +251 using _t_y_p_e = typename Vc::Vector::index_type; │ │ │ │ │ +252 }; │ │ │ │ │ +253 │ │ │ │ │ +254 template │ │ │ │ │ +255 struct SimdIndexTypeTraits > { │ │ │ │ │ +256 using _t_y_p_e = typename Vc::SimdArray::index_type; │ │ │ │ │ +257 }; │ │ │ │ │ +258#endif // HAVE_VC │ │ │ │ │ +259 │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 struct _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s { │ │ │ │ │ +_2_6_2 using _t_y_p_e = bool; │ │ │ │ │ +263 }; │ │ │ │ │ +264 │ │ │ │ │ +266 │ │ │ │ │ +269 template │ │ │ │ │ +_2_7_0 using _S_i_m_d_M_a_s_k = typename _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_<_V_>_:_:_t_y_p_e; │ │ │ │ │ +271 │ │ │ │ │ +272#if HAVE_VC │ │ │ │ │ +273 template │ │ │ │ │ +274 struct _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s > { │ │ │ │ │ +275 using _t_y_p_e = typename Vc::Vector::mask_type; │ │ │ │ │ +276 }; │ │ │ │ │ +277 │ │ │ │ │ +278 template │ │ │ │ │ +279 struct SimdMaskTypeTraits > { │ │ │ │ │ +280 using _t_y_p_e = 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 _c_o_n_d(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 _c_o_n_d(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 _m_a_x___v_a_l_u_e(const Vc::Vector & v) │ │ │ │ │ +313 { │ │ │ │ │ +314 return v.max(); │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +317 template │ │ │ │ │ +318 double _m_a_x___v_a_l_u_e(const Vc::SimdArray & v) │ │ │ │ │ +319 { │ │ │ │ │ +320 return v.max(); │ │ │ │ │ +321 } │ │ │ │ │ +322 │ │ │ │ │ +323 template │ │ │ │ │ +324 T _m_i_n___v_a_l_u_e(const Vc::Vector & v) │ │ │ │ │ +325 { │ │ │ │ │ +326 return v.min(); │ │ │ │ │ +327 } │ │ │ │ │ +328 │ │ │ │ │ +329 template │ │ │ │ │ +330 double _m_i_n___v_a_l_u_e(const Vc::SimdArray & v) │ │ │ │ │ +331 { │ │ │ │ │ +332 return v.min(); │ │ │ │ │ +333 } │ │ │ │ │ +334 │ │ │ │ │ +335 template │ │ │ │ │ +336 bool _a_n_y___t_r_u_e(const Vc::Mask & v) │ │ │ │ │ +337 { │ │ │ │ │ +338 return Vc::any_of(v); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +341 template │ │ │ │ │ +342 bool _a_n_y___t_r_u_e(const Vc::SimdMaskArray & v) │ │ │ │ │ +343 { │ │ │ │ │ +344 return Vc::any_of(v); │ │ │ │ │ +345 } │ │ │ │ │ +346 │ │ │ │ │ +347 template │ │ │ │ │ +348 bool _a_l_l___t_r_u_e(const Vc::Mask & v) │ │ │ │ │ +349 { │ │ │ │ │ +350 return Vc::all_of(v); │ │ │ │ │ +351 } │ │ │ │ │ +352 │ │ │ │ │ +353 template │ │ │ │ │ +354 bool _a_l_l___t_r_u_e(const Vc::SimdMaskArray & v) │ │ │ │ │ +355 { │ │ │ │ │ +356 return Vc::all_of(v); │ │ │ │ │ +357 } │ │ │ │ │ +358#endif // HAVE_VC │ │ │ │ │ +359 │ │ │ │ │ +361 template │ │ │ │ │ +_3_6_2 std::size_t _l_a_n_e_s(const T &) { return 1; } │ │ │ │ │ +363 │ │ │ │ │ +365 template │ │ │ │ │ +_3_6_6 T _l_a_n_e(std::size_t l, const T &v) │ │ │ │ │ +367 { │ │ │ │ │ +368 assert(l == 0); │ │ │ │ │ +369 return v; │ │ │ │ │ +370 } │ │ │ │ │ +371 │ │ │ │ │ +373 template │ │ │ │ │ +_3_7_4 T &_l_a_n_e(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 _l_a_n_e_s(const Vc::Vector &) │ │ │ │ │ +383 { │ │ │ │ │ +384 return Vc::Vector::size(); │ │ │ │ │ +385 } │ │ │ │ │ +386 │ │ │ │ │ +387 template │ │ │ │ │ +388 T _l_a_n_e(std::size_t l, const Vc::Vector &v) │ │ │ │ │ +389 { │ │ │ │ │ +390 assert(l < _l_a_n_e_s(v)); │ │ │ │ │ +391 return v[l]; │ │ │ │ │ +392 } │ │ │ │ │ +393 │ │ │ │ │ +394 template │ │ │ │ │ +395 auto _l_a_n_e(std::size_t l, Vc::Vector &v) │ │ │ │ │ +396 { │ │ │ │ │ +397 assert(l < _l_a_n_e_s(v)); │ │ │ │ │ +398 return VcImpl::Proxy >{l, v}; │ │ │ │ │ +399 } │ │ │ │ │ +400 │ │ │ │ │ +401 template │ │ │ │ │ +402 std::size_t _l_a_n_e_s(const Vc::SimdArray &) │ │ │ │ │ +403 { │ │ │ │ │ +404 return n; │ │ │ │ │ +405 } │ │ │ │ │ +406 │ │ │ │ │ +407 template │ │ │ │ │ +408 T _l_a_n_e(std::size_t l, const Vc::SimdArray &v) │ │ │ │ │ +409 { │ │ │ │ │ +410 assert(l < n); │ │ │ │ │ +411 return v[l]; │ │ │ │ │ +412 } │ │ │ │ │ +413 │ │ │ │ │ +414 template │ │ │ │ │ +415 auto _l_a_n_e(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 _l_a_n_e_s(const Vc::SimdMaskArray &) │ │ │ │ │ +423 { │ │ │ │ │ +424 return n; │ │ │ │ │ +425 } │ │ │ │ │ +426 │ │ │ │ │ +427 template │ │ │ │ │ +428 bool _l_a_n_e(std::size_t l, const Vc::SimdMaskArray &v) │ │ │ │ │ +429 { │ │ │ │ │ +430 assert(l < n); │ │ │ │ │ +431 return v[l]; │ │ │ │ │ +432 } │ │ │ │ │ +433 │ │ │ │ │ +434 template │ │ │ │ │ +435 auto _l_a_n_e(std::size_t l, Vc::SimdMaskArray &v) │ │ │ │ │ +436 { │ │ │ │ │ +437 assert(l < n); │ │ │ │ │ +438 return VcImpl::Proxy >{l, v}; │ │ │ │ │ +439 } │ │ │ │ │ +440#endif // HAVE_VC │ │ │ │ │ +441 │ │ │ │ │ +443 │ │ │ │ │ +446 template │ │ │ │ │ +_4_4_7 void _a_s_s_i_g_n(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 _a_s_s_i_g_n(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 _a_s_s_i_g_n(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 │ │ │ │ │ +_4_7_2 void _s_w_a_p(T &v1, T &v2, bool mask) │ │ │ │ │ +473 { │ │ │ │ │ +474 using std::swap; │ │ │ │ │ +475 if(mask) _s_w_a_p(v1, v2); │ │ │ │ │ +476 } │ │ │ │ │ +477 │ │ │ │ │ +478#if HAVE_VC │ │ │ │ │ +479 /* │ │ │ │ │ +480 Add Vc specializations for masked swap │ │ │ │ │ +481 */ │ │ │ │ │ +482 template │ │ │ │ │ +483 void _s_w_a_p(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 │ │ │ │ │ +491 template │ │ │ │ │ +492 void _s_w_a_p(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 │ │ │ │ │ +_v_c_._h_h │ │ │ │ │ +Compatibility header for including │ │ │ │ │ +_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ +Utilities for reduction like operations on ranges. │ │ │ │ │ +_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +_c_o_n_d_i_t_i_o_n_a_l_._h_h │ │ │ │ │ +_d_e_b_u_g_a_l_i_g_n_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_o_l_v_e_R_e_f___t │ │ │ │ │ -std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> │ │ │ │ │ -ResolveRef_t │ │ │ │ │ -Type trait to resolve std::reference_wrapper. │ │ │ │ │ -DDeeffiinniittiioonn referencehelper.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_a_n_y___t_r_u_e │ │ │ │ │ +bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_a_l_l___t_r_u_e │ │ │ │ │ +bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x │ │ │ │ │ +typename SimdIndexTypeTraits< V >::type SimdIndex │ │ │ │ │ +An simd vector of indices corresponding to a simd vector V. │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r │ │ │ │ │ +typename SimdScalarTypeTraits< T >::type SimdScalar │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_M_a_s_k │ │ │ │ │ +typename SimdMaskTypeTraits< V >::type SimdMask │ │ │ │ │ +A simd vector of truth values corresponding to a simd vector V. │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_l_a_n_e │ │ │ │ │ +T lane(std::size_t l, const T &v) │ │ │ │ │ +access a lane of a simd vector (scalar version) │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:366 │ │ │ │ │ +_D_u_n_e_:_:_s_w_a_p │ │ │ │ │ +void swap(T &v1, T &v2, bool mask) │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:472 │ │ │ │ │ +_D_u_n_e_:_:_a_s_s_i_g_n │ │ │ │ │ +void assign(T &dst, const T &src, bool mask) │ │ │ │ │ +masked Simd assignment (scalar version) │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:447 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_d │ │ │ │ │ +const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ +conditional evaluate │ │ │ │ │ +DDeeffiinniittiioonn conditional.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_m_a_x___v_a_l_u_e │ │ │ │ │ +T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:481 │ │ │ │ │ +_D_u_n_e_:_:_m_i_n___v_a_l_u_e │ │ │ │ │ +T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:487 │ │ │ │ │ +_D_u_n_e_:_:_l_a_n_e_s │ │ │ │ │ +std::size_t lanes(const T &) │ │ │ │ │ +get the number of lanes of a simd vector (scalar version) │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:362 │ │ │ │ │ +_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ +aligned wrappers for arithmetic types │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ +T type │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +T type │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:234 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ +std::size_t type │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:235 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ +bool type │ │ │ │ │ +DDeeffiinniittiioonn simd.hh:262 │ │ │ │ │ +_v_c_._h_h │ │ │ │ │ +SIMD abstractions for Vc. │ │ │ │ │ +_D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T │ │ │ │ │ +#define DUNE_SIMD_VC_ASSIGNMENT(OP) │ │ │ │ │ +DDeeffiinniittiioonn simd/vc.hh:224 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.hh File Reference │ │ │ │ +dune-common: dynmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,66 +70,52 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
fmatrixev.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
dynmatrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <algorithm>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ #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 <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>
│ │ │ │
│ │ │ │

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

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

Detailed Description

│ │ │ │ -

Eigenvalue computations for the FieldMatrix class.

│ │ │ │ +

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

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,58 +1,37 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -fmatrixev.hh File Reference │ │ │ │ │ -Eigenvalue computations for the FieldMatrix class. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +dynmatrix.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _D_e_n_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y │ │ │ │ │ +This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_h_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_y_n_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_n_s_e_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _> │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s (const _F_i_e_l_d_M_a_t_r_i_x< K, dim, dim > │ │ │ │ │ - &matrix, _F_i_e_l_d_V_e_c_t_o_r< K, dim > &eigenValues) │ │ │ │ │ -  calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _> │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s (const _F_i_e_l_d_M_a_t_r_i_x< K, dim, │ │ │ │ │ - dim > &matrix, _F_i_e_l_d_V_e_c_t_o_r< K, dim > &_e_i_g_e_n_V_a_l_u_e_s, _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - dim, dim > &eigenVectors) │ │ │ │ │ -  calculates the eigenvalues and eigenvectors of a symmetric field │ │ │ │ │ - matrix │ │ │ │ │ + class   _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _> │ │ │ │ │ +  Construct a matrix with a dynamic size. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_L_a_p_a_c_k (const _F_i_e_l_d_M_a_t_r_i_x< K, dim, │ │ │ │ │ - dim > &matrix, _F_i_e_l_d_V_e_c_t_o_r< K, dim > &_e_i_g_e_n_V_a_l_u_e_s) │ │ │ │ │ -  calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s_L_a_p_a_c_k (const _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - dim, dim > &matrix, _F_i_e_l_d_V_e_c_t_o_r< K, dim > &_e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, dim, dim > &eigenVectors) │ │ │ │ │ -  calculates the eigenvalues and -vectors of a symmetric field │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_N_o_n_S_y_m (const _F_i_e_l_d_M_a_t_r_i_x< K, dim, │ │ │ │ │ - dim > &matrix, _F_i_e_l_d_V_e_c_t_o_r< C, dim > &_e_i_g_e_n_V_a_l_u_e_s) │ │ │ │ │ -  calculates the eigenvalues of a non-symmetric field matrix │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ +This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.hh Source File │ │ │ │ +dune-common: dynmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,640 +74,215 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
fmatrixev.hh
│ │ │ │ +
dynmatrix.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_DYNMATRIX_HH
│ │ │ │ +
6#define DUNE_DYNMATRIX_HH
│ │ │ │
7
│ │ │ │ -
12#include <algorithm>
│ │ │ │ -
13#include <iostream>
│ │ │ │ -
14#include <cmath>
│ │ │ │ -
15#include <cassert>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
20#include <dune/common/math.hh>
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <cstddef>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <initializer_list>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19namespace Dune
│ │ │ │ +
20{
│ │ │ │
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);
│ │ │ │ +
31 template< class K > class DynamicMatrix;
│ │ │ │ +
32
│ │ │ │ +
33 template< class K >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
35 {
│ │ │ │ + │ │ │ │
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);
│ │ │ │ + │ │ │ │ +
39
│ │ │ │ + │ │ │ │ + │ │ │ │ +
42
│ │ │ │ +
43 typedef std::vector<K> container_type;
│ │ │ │ +
44 typedef K value_type;
│ │ │ │ +
45 typedef typename container_type::size_type size_type;
│ │ │ │ +
46 };
│ │ │ │ +
│ │ │ │ +
47
│ │ │ │ +
48 template< class K >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
50 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
53 };
│ │ │ │ +
│ │ │ │
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];
│ │ │ │ +
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 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;
│ │ │ │ -
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};
│ │ │ │ -
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 {
│ │ │ │ -
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<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
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Some useful basic math stuff.
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ -
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
│ │ │ │ +
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 };
│ │ │ │ +
│ │ │ │ +
156
│ │ │ │ +
159} // end namespace
│ │ │ │ +
160
│ │ │ │ +
161#endif
│ │ │ │ +
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
This file implements a dense vector with a dynamic size.
│ │ │ │ +
Macro for wrapping boundary checks.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │ -
static const Field pi()
Archimedes' constant.
Definition math.hh:48
│ │ │ │ +
Definition matvectraits.hh:31
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,709 +1,280 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -fmatrixev.hh │ │ │ │ │ +dynmatrix.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_DYNMATRIX_HH │ │ │ │ │ +6#define DUNE_DYNMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_m_a_t_r_i_x_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_h_._h_h> │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_y_n_v_e_c_t_o_r_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_n_s_e_m_a_t_r_i_x_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +18 │ │ │ │ │ +19namespace _D_u_n_e │ │ │ │ │ +20{ │ │ │ │ │ 21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -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); │ │ │ │ │ +31 template< class K > class DynamicMatrix; │ │ │ │ │ +32 │ │ │ │ │ +33 template< class K > │ │ │ │ │ +_3_4 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s< _D_y_n_a_m_i_c_M_a_t_r_i_x > │ │ │ │ │ +35 { │ │ │ │ │ +_3_6 typedef _D_y_n_a_m_i_c_M_a_t_r_i_x_<_K_> _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ │ 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); │ │ │ │ │ +_3_8 typedef _D_y_n_a_m_i_c_V_e_c_t_o_r_<_K_> _r_o_w___t_y_p_e; │ │ │ │ │ +39 │ │ │ │ │ +_4_0 typedef _r_o_w___t_y_p_e &_r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +_4_1 typedef const _r_o_w___t_y_p_e &_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +42 │ │ │ │ │ +_4_3 typedef std::vector _c_o_n_t_a_i_n_e_r___t_y_p_e; │ │ │ │ │ +_4_4 typedef K _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_4_5 typedef typename container_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +46 }; │ │ │ │ │ +47 │ │ │ │ │ +48 template< class K > │ │ │ │ │ +_4_9 struct _F_i_e_l_d_T_r_a_i_t_s< _D_y_n_a_m_i_c_M_a_t_r_i_x > │ │ │ │ │ +50 { │ │ │ │ │ +_5_1 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_5_2 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e _r_e_a_l___t_y_p_e; │ │ │ │ │ +53 }; │ │ │ │ │ 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 _D_U_N_E___T_H_R_O_W(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 _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -109 const K pi = _M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_K_>_:_:_p_i(); │ │ │ │ │ -110 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1] │ │ │ │ │ -[2]*matrix[1][2]; │ │ │ │ │ +59 template │ │ │ │ │ +_6_0 class _D_y_n_a_m_i_c_M_a_t_r_i_x : public _D_e_n_s_e_M_a_t_r_i_x< DynamicMatrix > │ │ │ │ │ +61 { │ │ │ │ │ +62 std::vector< DynamicVector > _data; │ │ │ │ │ +63 typedef _D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_K_> > _B_a_s_e; │ │ │ │ │ +64 public: │ │ │ │ │ +_6_5 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +_6_6 typedef typename _B_a_s_e_:_:_v_a_l_u_e___t_y_p_e _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_6_7 typedef typename _B_a_s_e_:_:_r_o_w___t_y_p_e _r_o_w___t_y_p_e; │ │ │ │ │ +68 │ │ │ │ │ +69 //===== constructors │ │ │ │ │ +_7_1 _D_y_n_a_m_i_c_M_a_t_r_i_x () {} │ │ │ │ │ +72 │ │ │ │ │ +_7_4 _D_y_n_a_m_i_c_M_a_t_r_i_x (_s_i_z_e___t_y_p_e r, _s_i_z_e___t_y_p_e c, _v_a_l_u_e___t_y_p_e v = _v_a_l_u_e___t_y_p_e() ) : │ │ │ │ │ +75 _data(r, _r_o_w___t_y_p_e(c, v) ) │ │ │ │ │ +76 {} │ │ │ │ │ +77 │ │ │ │ │ +_8_0 _D_y_n_a_m_i_c_M_a_t_r_i_x (std::initializer_list<_D_y_n_a_m_i_c_V_e_c_t_o_r_<_K_>> const &ll) │ │ │ │ │ +81 : _data(ll) │ │ │ │ │ +82 {} │ │ │ │ │ +83 │ │ │ │ │ +84 │ │ │ │ │ +85 template ::value && │ │ │ │ │ +HasDenseMatrixAssigner::value>> │ │ │ │ │ +_8_7 _D_y_n_a_m_i_c_M_a_t_r_i_x(T const& rhs) │ │ │ │ │ +88 { │ │ │ │ │ +89 *this = rhs; │ │ │ │ │ +90 } │ │ │ │ │ +91 │ │ │ │ │ +92 //==== resize related methods │ │ │ │ │ +_1_0_6 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e r, _s_i_z_e___t_y_p_e c, _v_a_l_u_e___t_y_p_e v = _v_a_l_u_e___t_y_p_e() ) │ │ │ │ │ +107 { │ │ │ │ │ +108 _data.resize(0); │ │ │ │ │ +109 _data.resize(r, _r_o_w___t_y_p_e(c, v) ); │ │ │ │ │ +110 } │ │ │ │ │ 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; │ │ │ │ │ -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 } │ │ │ │ │ +112 //===== assignment │ │ │ │ │ +113 // General assignment with resizing │ │ │ │ │ +114 template ::value>> │ │ │ │ │ +_1_1_6 _D_y_n_a_m_i_c_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=(T const& rhs) { │ │ │ │ │ +117 _data._r_e_s_i_z_e(rhs.N()); │ │ │ │ │ +118 std::fill(_data.begin(), _data.end(), _r_o_w___t_y_p_e(rhs.M(), K(0))); │ │ │ │ │ +119 _B_a_s_e_:_:_o_p_e_r_a_t_o_r_=(rhs); │ │ │ │ │ +120 return *this; │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +123 // Specialisation: scalar assignment (no resizing) │ │ │ │ │ +124 template ::value>> │ │ │ │ │ +_1_2_6 _D_y_n_a_m_i_c_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=(T scalar) { │ │ │ │ │ +127 std::fill(_data.begin(), _data.end(), scalar); │ │ │ │ │ +128 return *this; │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +_1_3_2 _D_y_n_a_m_i_c_M_a_t_r_i_x _t_r_a_n_s_p_o_s_e_d() const │ │ │ │ │ +133 { │ │ │ │ │ +134 _D_y_n_a_m_i_c_M_a_t_r_i_x AT(this->_M(), this->_N()); │ │ │ │ │ +135 for( size_type i = 0; i < this->_N(); ++i ) │ │ │ │ │ +136 for( _s_i_z_e___t_y_p_e j = 0; j < this->_M(); ++j ) │ │ │ │ │ +137 AT[j][i] = (*this)[i][j]; │ │ │ │ │ +138 return AT; │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +141 // make this thing a matrix │ │ │ │ │ +_1_4_2 _s_i_z_e___t_y_p_e _m_a_t___r_o_w_s() const { return _data.size(); } │ │ │ │ │ +_1_4_3 _s_i_z_e___t_y_p_e _m_a_t___c_o_l_s() const { │ │ │ │ │ +144 assert(this->_r_o_w_s()); │ │ │ │ │ +145 return _data.front().size(); │ │ │ │ │ +146 } │ │ │ │ │ +_1_4_7 _r_o_w___t_y_p_e & _m_a_t___a_c_c_e_s_s(_s_i_z_e___t_y_p_e i) { │ │ │ │ │ +148 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _data.size()); │ │ │ │ │ +149 return _data[i]; │ │ │ │ │ +150 } │ │ │ │ │ +_1_5_1 const _r_o_w___t_y_p_e & _m_a_t___a_c_c_e_s_s(_s_i_z_e___t_y_p_e i) const { │ │ │ │ │ +152 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _data.size()); │ │ │ │ │ +153 return _data[i]; │ │ │ │ │ 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}; │ │ │ │ │ -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 = _m_a_x(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 = _m_a_x(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& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -299 FieldMatrix& eigenVectors) │ │ │ │ │ -300 { │ │ │ │ │ -301 _e_i_g_e_n_V_a_l_u_e_s[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& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -311 FieldMatrix& eigenVectors) │ │ │ │ │ -312 { │ │ │ │ │ -313 // Compute eigen values │ │ │ │ │ -314 Impl::eigenValues2dImpl(matrix, _e_i_g_e_n_V_a_l_u_e_s); │ │ │ │ │ -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] -= _e_i_g_e_n_V_a_l_u_e_s[0]; │ │ │ │ │ -328 temp[1][1] -= _e_i_g_e_n_V_a_l_u_e_s[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]-_e_i_g_e_n_V_a_l_u_e_s[1], matrix[1][0]}; │ │ │ │ │ -337 FieldVector ev1 = {matrix[0][1], matrix[1][1]-_e_i_g_e_n_V_a_l_u_e_s[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]-_e_i_g_e_n_V_a_l_u_e_s[0], matrix[1][0]}; │ │ │ │ │ -343 ev1 = {matrix[0][1], matrix[1][1]-_e_i_g_e_n_V_a_l_u_e_s[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& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -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, _e_i_g_e_n_V_a_l_u_e_s); │ │ │ │ │ -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 _e_i_g_e_n_V_a_l_u_e_s = {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 (_e_i_g_e_n_V_a_l_u_e_s[0] > _e_i_g_e_n_V_a_l_u_e_s[1]) │ │ │ │ │ -377 { │ │ │ │ │ -378 std::swap(_e_i_g_e_n_V_a_l_u_e_s[0], _e_i_g_e_n_V_a_l_u_e_s[1]); │ │ │ │ │ -379 std::swap(eigenVectors[0], eigenVectors[1]); │ │ │ │ │ -380 } │ │ │ │ │ -381 if (_e_i_g_e_n_V_a_l_u_e_s[1] > _e_i_g_e_n_V_a_l_u_e_s[2]) │ │ │ │ │ -382 { │ │ │ │ │ -383 std::swap(_e_i_g_e_n_V_a_l_u_e_s[1], _e_i_g_e_n_V_a_l_u_e_s[2]); │ │ │ │ │ -384 std::swap(eigenVectors[1], eigenVectors[2]); │ │ │ │ │ -385 } │ │ │ │ │ -386 if (_e_i_g_e_n_V_a_l_u_e_s[0] > _e_i_g_e_n_V_a_l_u_e_s[1]) │ │ │ │ │ -387 { │ │ │ │ │ -388 std::swap(_e_i_g_e_n_V_a_l_u_e_s[0], _e_i_g_e_n_V_a_l_u_e_s[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(_e_i_g_e_n_V_a_l_u_e_s); │ │ │ │ │ -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 _e_i_g_e_n_V_a_l_u_e_s[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 _e_i_g_e_n_V_a_l_u_e_s *= maxAbsElement; │ │ │ │ │ -424 } │ │ │ │ │ -425 │ │ │ │ │ -426 // forwarding to LAPACK with corresponding tag │ │ │ │ │ -427 template │ │ │ │ │ -428 static void eigenValuesVectorsLapackImpl(const FieldMatrix& │ │ │ │ │ -matrix, │ │ │ │ │ -429 FieldVector& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -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& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -509 FieldMatrix& eigenVectors) │ │ │ │ │ -510 { │ │ │ │ │ -511 eigenValuesVectorsLapackImpl(matrix,_e_i_g_e_n_V_a_l_u_e_s,eigenVectors); │ │ │ │ │ -512 } │ │ │ │ │ -513 } //namespace Impl │ │ │ │ │ -514 │ │ │ │ │ -522 template │ │ │ │ │ -_5_2_3 static void _e_i_g_e_n_V_a_l_u_e_s(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& matrix, │ │ │ │ │ -524 _F_i_e_l_d_V_e_c_t_o_r_<_K_ _,_d_i_m_>& _e_i_g_e_n_V_a_l_u_e_s) │ │ │ │ │ -525 { │ │ │ │ │ -526 _I_m_p_l_:_:_E_V_D_u_m_m_y_<_K_,_d_i_m_> dummy; │ │ │ │ │ -527 Impl::eigenValuesVectorsImpl(matrix, │ │ │ │ │ -_e_i_g_e_n_V_a_l_u_e_s, dummy); │ │ │ │ │ -528 } │ │ │ │ │ -529 │ │ │ │ │ -538 template │ │ │ │ │ -_5_3_9 static void _e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& matrix, │ │ │ │ │ -540 _F_i_e_l_d_V_e_c_t_o_r_<_K_ _,_d_i_m_>& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -541 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& eigenVectors) │ │ │ │ │ -542 { │ │ │ │ │ -543 Impl::eigenValuesVectorsImpl(matrix, │ │ │ │ │ -_e_i_g_e_n_V_a_l_u_e_s, eigenVectors); │ │ │ │ │ -544 } │ │ │ │ │ -545 │ │ │ │ │ -553 template │ │ │ │ │ -_5_5_4 static void _e_i_g_e_n_V_a_l_u_e_s_L_a_p_a_c_k(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& matrix, │ │ │ │ │ -555 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _d_i_m_>& _e_i_g_e_n_V_a_l_u_e_s) │ │ │ │ │ -556 { │ │ │ │ │ -557 _I_m_p_l_:_:_E_V_D_u_m_m_y_<_K_,_d_i_m_> dummy; │ │ │ │ │ -558 Impl::eigenValuesVectorsLapackImpl │ │ │ │ │ -(matrix, _e_i_g_e_n_V_a_l_u_e_s, dummy); │ │ │ │ │ -559 } │ │ │ │ │ -560 │ │ │ │ │ -569 template │ │ │ │ │ -_5_7_0 static void _e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s_L_a_p_a_c_k(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& │ │ │ │ │ -matrix, │ │ │ │ │ -571 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _d_i_m_>& _e_i_g_e_n_V_a_l_u_e_s, │ │ │ │ │ -572 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& eigenVectors) │ │ │ │ │ -573 { │ │ │ │ │ -574 Impl::eigenValuesVectorsLapackImpl │ │ │ │ │ -(matrix, _e_i_g_e_n_V_a_l_u_e_s, eigenVectors); │ │ │ │ │ -575 } │ │ │ │ │ -576 │ │ │ │ │ -584 template │ │ │ │ │ -_5_8_5 static void _e_i_g_e_n_V_a_l_u_e_s_N_o_n_S_y_m(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _d_i_m_,_ _d_i_m_>& matrix, │ │ │ │ │ -586 _F_i_e_l_d_V_e_c_t_o_r_<_C_,_ _d_i_m_>& _e_i_g_e_n_V_a_l_u_e_s) │ │ │ │ │ -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) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_N_o_n_S_y_m │ │ │ │ │ -static void eigenValuesNonSym(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< C, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a non-symmetric field matrix │ │ │ │ │ -DDeeffiinniittiioonn fmatrixev.hh:585 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s │ │ │ │ │ -static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< │ │ │ │ │ -K, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ -DDeeffiinniittiioonn fmatrixev.hh:523 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_L_a_p_a_c_k │ │ │ │ │ -static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< K, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ -DDeeffiinniittiioonn fmatrixev.hh:554 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s │ │ │ │ │ -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 │ │ │ │ │ -DDeeffiinniittiioonn fmatrixev.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_e_i_g_e_n_V_a_l_u_e_s_V_e_c_t_o_r_s_L_a_p_a_c_k │ │ │ │ │ -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 │ │ │ │ │ -DDeeffiinniittiioonn fmatrixev.hh:570 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x │ │ │ │ │ A dense n x m matrix. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_N_o_t_I_m_p_l_e_m_e_n_t_e_d │ │ │ │ │ -Default exception for dummy implementations. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +derived_type & operator=(const RHS &rhs) │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_M │ │ │ │ │ +constexpr size_type M() const │ │ │ │ │ +number of columns │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:703 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +Traits::value_type value_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_r_o_w_s │ │ │ │ │ +constexpr size_type rows() const │ │ │ │ │ +number of rows │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:709 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_N │ │ │ │ │ +constexpr size_type N() const │ │ │ │ │ +number of rows │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:697 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Traits::size_type size_type │ │ │ │ │ +The type used for the index access and size operation. │ │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x │ │ │ │ │ +Construct a matrix with a dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_m_a_t___c_o_l_s │ │ │ │ │ +size_type mat_cols() const │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x │ │ │ │ │ +DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll) │ │ │ │ │ +Constructor initializing the matrix from a list of vector. │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +Base::row_type row_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_t_r_a_n_s_p_o_s_e_d │ │ │ │ │ +DynamicMatrix transposed() const │ │ │ │ │ +Return transposed of the matrix as DynamicMatrix. │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +Base::value_type value_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_m_a_t___a_c_c_e_s_s │ │ │ │ │ +row_type & mat_access(size_type i) │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Base::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_m_a_t___r_o_w_s │ │ │ │ │ +size_type mat_rows() const │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x │ │ │ │ │ +DynamicMatrix(T const &rhs) │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_m_a_t___a_c_c_e_s_s │ │ │ │ │ +const row_type & mat_access(size_type i) const │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type r, size_type c, value_type v=value_type()) │ │ │ │ │ +resize matrix to r × c │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +DynamicMatrix & operator=(T const &rhs) │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x │ │ │ │ │ +DynamicMatrix() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x │ │ │ │ │ +DynamicMatrix(size_type r, size_type c, value_type v=value_type()) │ │ │ │ │ +Constructor initializing the whole matrix with a scalar. │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +DynamicMatrix & operator=(T scalar) │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +container_type::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_r_o_w___t_y_p_e │ │ │ │ │ +DynamicVector< K > row_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ +row_type & row_reference │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +K value_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +DynamicMatrix< K > derived_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const row_type & const_row_reference │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_c_o_n_t_a_i_n_e_r___t_y_p_e │ │ │ │ │ +std::vector< K > container_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< K >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _K_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< K >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn dynmatrix.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ +Construct a vector with a dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn dynvector.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn ftraits.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn ftraits.hh:28 │ │ │ │ │ _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ T real_type │ │ │ │ │ export the type representing the real type of the field │ │ │ │ │ DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_ _F_i_e_l_d_ _>_:_:_p_i │ │ │ │ │ -static const Field pi() │ │ │ │ │ -Archimedes' constant. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn matvectraits.hh:31 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dotproduct.hh File Reference │ │ │ │ +dune-common: indexset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,60 +65,124 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Enumerations | │ │ │ │ Functions
│ │ │ │ -
dotproduct.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Provides the functions dot(a,b) := $a^H \cdot b $ and dotT(a,b) := $a^T \cdot b $. │ │ │ │ +

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

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

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::IsVector< T, class >
class  Dune::IndexPair< TG, TL >
 A pair consisting of a global and local index. More...
 
struct  Dune::IsVector< T, std::void_t< typename T::field_type > >
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 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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 A , class B >
auto Dune::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,b) := std::conj(a)*b
 
template<class A , class B >
auto Dune::dotT (const A &a, const B &b) -> decltype(a *b)
 Computes an indefinite vector dot product for fundamental data types according to Petsc's VectTDot function: dotT(a,b) := a*b.
 
template<class TG , class TL >
std::ostream & Dune::operator<< (std::ostream &os, const IndexPair< TG, TL > &pair)
 Print an index pair.
 
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.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides the functions dot(a,b) := $a^H \cdot b $ and dotT(a,b) := $a^T \cdot b $.

│ │ │ │ -

The provided dot products dot,dotT are used to compute (indefinite) dot products for fundamental types as well as DUNE vector types, such as DenseVector, FieldVector, ISTLVector. Note that the definition of dot(a,b) conjugates the first argument. This agrees with the behaviour of Matlab and Petsc, but not with BLAS.

Author
Jö Fahlke, Matthias Wohlmuth
│ │ │ │ +

Provides a map between global and local indices.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,48 +1,108 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -dotproduct.hh File Reference │ │ │ │ │ -Provides the functions dot(a,b) := [$a^H \cdot b $]and dotT(a,b) := [$a^T \cdot │ │ │ │ │ -b $]. _M_o_r_e_._._. │ │ │ │ │ -#include "_f_t_r_a_i_t_s_._h_h" │ │ │ │ │ -#include "_t_y_p_e_t_r_a_i_t_s_._h_h" │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +indexset.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Provides a map between global and local indices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_a_r_r_a_y_l_i_s_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include "_l_o_c_a_l_i_n_d_e_x_._h_h" │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_V_e_c_t_o_r_<_ _T_,_ _c_l_a_s_s_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_<_ _T_G_,_ _T_L_ _> │ │ │ │ │ +  A pair consisting of a global and local index. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_V_e_c_t_o_r_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _t_y_p_e_n_a_m_e_ _T_:_:_f_i_e_l_d___t_y_p_e_ _>_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e │ │ │ │ │ +  _E_x_c_e_p_t_i_o_n indicating that the index set is not in the expected state. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_ _T_G_,_ _T_L_,_ _N_ _> │ │ │ │ │ +  Manager class for the mapping between local indices and globally │ │ │ │ │ + unique indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_ _T_G_,_ _T_L_,_ _N_ _>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +  The iterator over the pairs. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_ _I_ _> │ │ │ │ │ +  Decorates an index set with the possibility to find a global index │ │ │ │ │ + that is mapped to a specific local. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_n_d_e_x_S_e_t_S_o_r_t_F_u_n_c_t_o_r_<_ _T_G_,_ _T_L_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_S_t_a_t_e { _D_u_n_e_:_:_G_R_O_U_N_D , _D_u_n_e_:_:_R_E_S_I_Z_E } │ │ │ │ │ +  The states the index set can be in. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_d_o_t (const A &a, const B &b) -> typename std::enable_if< _I_s_N_u_m_b_e_r< │ │ │ │ │ - A >::value &&!_I_s_V_e_c_t_o_r< A >::value &&!std::is_same< typename _F_i_e_l_d_T_r_a_i_t_s< │ │ │ │ │ - A >::field_type, typename _F_i_e_l_d_T_r_a_i_t_s< 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,b) := std::conj(a)*b │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_d_o_t_T (const A &a, const B &b) -> decltype(a *b) │ │ │ │ │ -  Computes an indefinite vector dot product for fundamental data types │ │ │ │ │ - according to Petsc's VectTDot function: dotT(a,b) := a*b. │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _I_n_d_e_x_P_a_i_r< TG, TL > │ │ │ │ │ + &pair) │ │ │ │ │ +  Print an index pair. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_> (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const _I_n_d_e_x_P_a_i_r< │ │ │ │ │ + TG, TL > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_> (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= (const _I_n_d_e_x_P_a_i_r< TG, TL > &, const TG &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t< TG, │ │ │ │ │ + TL, N > &indexSet) │ │ │ │ │ +  Print an index set. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides the functions dot(a,b) := [$a^H \cdot b $]and dotT(a,b) := [$a^T \cdot │ │ │ │ │ -b $]. │ │ │ │ │ -The provided dot products dot,dotT are used to compute (indefinite) dot │ │ │ │ │ -products for fundamental types as well as DUNE vector types, such as │ │ │ │ │ -DenseVector, FieldVector, ISTLVector. Note that the definition of dot(a,b) │ │ │ │ │ -conjugates the first argument. This agrees with the behaviour of Matlab and │ │ │ │ │ -Petsc, but not with BLAS. │ │ │ │ │ +Provides a map between global and local indices. │ │ │ │ │ Author │ │ │ │ │ - Jö Fahlke, Matthias Wohlmuth │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dotproduct.hh Source File │ │ │ │ +dune-common: indexset.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,85 +70,961 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
dotproduct.hh
│ │ │ │ +
indexset.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_DOTPRODUCT_HH
│ │ │ │ -
6#define DUNE_DOTPRODUCT_HH
│ │ │ │ +
5#ifndef DUNE_INDEXSET_HH
│ │ │ │ +
6#define DUNE_INDEXSET_HH
│ │ │ │
7
│ │ │ │ -
8#include "ftraits.hh"
│ │ │ │ -
9#include "typetraits.hh"
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
26 template<class T, class = void>
│ │ │ │ -
27 struct IsVector : std::false_type {};
│ │ │ │ -
28
│ │ │ │ -
29 template<class T>
│ │ │ │ -
│ │ │ │ -
30 struct IsVector<T, std::void_t<typename T::field_type> >
│ │ │ │ -
31 : std::true_type {};
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
40 template<class A, class B>
│ │ │ │ -
41 auto
│ │ │ │ -
│ │ │ │ -
42 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
│ │ │ │ -
43 {
│ │ │ │ -
44 return conj(a)*b;
│ │ │ │ -
45 }
│ │ │ │ -
│ │ │ │ +
38 template<class TG, class TL>
│ │ │ │ +
39 std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair);
│ │ │ │ +
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
│ │ │ │ -
56 // fundamental type with A being a real type
│ │ │ │ -
57 template<class A, class B>
│ │ │ │ -
58 auto
│ │ │ │ -
59 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(a*b)>::type
│ │ │ │ -
60 {
│ │ │ │ -
61 return a*b;
│ │ │ │ -
62 }
│ │ │ │ -
63
│ │ │ │ -
73 template<typename A, typename B>
│ │ │ │ -
74 auto
│ │ │ │ -
75 dot(const A & a, const B & b) -> typename std::enable_if<IsVector<A>::value, decltype(a.dot(b))>::type
│ │ │ │ -
76 {
│ │ │ │ -
77 return a.dot(b);
│ │ │ │ -
78 }
│ │ │ │ -
88 template<class A, class B>
│ │ │ │ -
89 auto
│ │ │ │ -
│ │ │ │ -
90 dotT(const A & a, const B & b) -> decltype(a*b)
│ │ │ │ -
91 {
│ │ │ │ -
92 return a*b;
│ │ │ │ -
93 }
│ │ │ │ -
│ │ │ │ -
94
│ │ │ │ -
96} // end namespace DUNE
│ │ │ │ -
97
│ │ │ │ -
98#endif // DUNE_DOTPRODUCT_HH
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ -
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
│ │ │ │ -
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.
│ │ │ │ +
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>
│ │ │ │ +
1015 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
│ │ │ │ + │ │ │ │ +
1017 {
│ │ │ │ +
1018 return localIndices_.begin();
│ │ │ │ +
1019 }
│ │ │ │ +
1020
│ │ │ │ +
1021
│ │ │ │ +
1022 template<class TG, class TL, int N>
│ │ │ │ +
1023 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
│ │ │ │ + │ │ │ │ +
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>
│ │ │ │ + │ │ │ │ +
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.
│ │ │ │ +
Implements a random-access container that can efficiently change size (similar to std::deque)
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
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
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
auto dotT(const A &a, const B &b) -> decltype(a *b)
Computes an indefinite vector dot product for fundamental data types according to Petsc's VectTDot fu...
Definition dotproduct.hh:90
│ │ │ │ -
Definition dotproduct.hh:27
│ │ │ │ -
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,98 +1,1114 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -dotproduct.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +indexset.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_DOTPRODUCT_HH │ │ │ │ │ -6#define DUNE_DOTPRODUCT_HH │ │ │ │ │ +5#ifndef DUNE_INDEXSET_HH │ │ │ │ │ +6#define DUNE_INDEXSET_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include "_f_t_r_a_i_t_s_._h_h" │ │ │ │ │ -9#include "_t_y_p_e_t_r_a_i_t_s_._h_h" │ │ │ │ │ -10 │ │ │ │ │ -11namespace _D_u_n_e { │ │ │ │ │ -26 template │ │ │ │ │ -_2_7 struct _I_s_V_e_c_t_o_r : std::false_type {}; │ │ │ │ │ -28 │ │ │ │ │ -29 template │ │ │ │ │ -_3_0 struct _I_s_V_e_c_t_o_r > │ │ │ │ │ -31 : std::true_type {}; │ │ │ │ │ +8#include │ │ │ │ │ +9#include <_d_u_n_e_/_c_o_m_m_o_n_/_a_r_r_a_y_l_i_s_t_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include "_l_o_c_a_l_i_n_d_e_x_._h_h" │ │ │ │ │ +14 │ │ │ │ │ +15#include // for uint32_t │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +28 // forward declarations │ │ │ │ │ +29 │ │ │ │ │ +30 template │ │ │ │ │ +31 class IndexPair; │ │ │ │ │ 32 │ │ │ │ │ -40 template │ │ │ │ │ -41 auto │ │ │ │ │ -_4_2 _d_o_t(const A & a, const B & b) -> typename std::enable_if::value │ │ │ │ │ -&& !_I_s_V_e_c_t_o_r_<_A_>_:_:_v_a_l_u_e && !std::is_same:: │ │ │ │ │ -field_type,typename _F_i_e_l_d_T_r_a_i_t_s_<_A_>_:_:_r_e_a_l___t_y_p_e> ::value, decltype(conj(a)*b)>:: │ │ │ │ │ -type │ │ │ │ │ -43 { │ │ │ │ │ -44 return conj(a)*b; │ │ │ │ │ -45 } │ │ │ │ │ +38 template │ │ │ │ │ +39 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const IndexPair& pair); │ │ │ │ │ +40 │ │ │ │ │ +41 template │ │ │ │ │ +42 bool _o_p_e_r_a_t_o_r_=_=(const IndexPair&, const IndexPair&); │ │ │ │ │ +43 │ │ │ │ │ +44 template │ │ │ │ │ +45 bool _o_p_e_r_a_t_o_r_!_=(const IndexPair&, const IndexPair&); │ │ │ │ │ 46 │ │ │ │ │ -56 // fundamental type with A being a real type │ │ │ │ │ -57 template │ │ │ │ │ -58 auto │ │ │ │ │ -59 _d_o_t(const A & a, const B & b) -> typename std::enable_if::value │ │ │ │ │ -&& !IsVector::value && std::is_same:: │ │ │ │ │ -field_type,typename _F_i_e_l_d_T_r_a_i_t_s_<_A_>_:_:_r_e_a_l___t_y_p_e>::value, decltype(a*b)>::type │ │ │ │ │ -60 { │ │ │ │ │ -61 return a*b; │ │ │ │ │ -62 } │ │ │ │ │ -63 │ │ │ │ │ -73 template │ │ │ │ │ -74 auto │ │ │ │ │ -75 _d_o_t(const A & a, const B & b) -> typename std::enable_if::value, │ │ │ │ │ -decltype(a.dot(b))>::type │ │ │ │ │ -76 { │ │ │ │ │ -77 return a.dot(b); │ │ │ │ │ -78 } │ │ │ │ │ -88 template │ │ │ │ │ -89 auto │ │ │ │ │ -_9_0 _d_o_t_T(const A & a, const B & b) -> decltype(a*b) │ │ │ │ │ -91 { │ │ │ │ │ -92 return a*b; │ │ │ │ │ -93 } │ │ │ │ │ -94 │ │ │ │ │ -96} // end namespace DUNE │ │ │ │ │ -97 │ │ │ │ │ -98#endif // DUNE_DOTPRODUCT_HH │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_f_t_r_a_i_t_s_._h_h │ │ │ │ │ -Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ -_D_u_n_e_:_:_d_o_t │ │ │ │ │ -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,... │ │ │ │ │ -DDeeffiinniittiioonn dotproduct.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_v_o_i_d___t │ │ │ │ │ -typename Impl::voider< Types... >::type void_t │ │ │ │ │ -Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:40 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +47 template │ │ │ │ │ +48 bool _o_p_e_r_a_t_o_r_<(const IndexPair&, const IndexPair&); │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +51 bool _o_p_e_r_a_t_o_r_>(const IndexPair&, const IndexPair&); │ │ │ │ │ +52 │ │ │ │ │ +53 template │ │ │ │ │ +54 bool _o_p_e_r_a_t_o_r_<_=(const IndexPair&, const IndexPair&); │ │ │ │ │ +55 │ │ │ │ │ +56 template │ │ │ │ │ +57 bool _o_p_e_r_a_t_o_r_ _>_=(const IndexPair&, const IndexPair&); │ │ │ │ │ +58 │ │ │ │ │ +59 template │ │ │ │ │ +60 bool _o_p_e_r_a_t_o_r_=_=(const IndexPair&, const TG&); │ │ │ │ │ +61 │ │ │ │ │ +62 template │ │ │ │ │ +63 bool _o_p_e_r_a_t_o_r_!_=(const IndexPair&, const TG&); │ │ │ │ │ +64 │ │ │ │ │ +65 template │ │ │ │ │ +66 bool _o_p_e_r_a_t_o_r_<(const IndexPair&, const TG&); │ │ │ │ │ +67 │ │ │ │ │ +68 template │ │ │ │ │ +69 bool _o_p_e_r_a_t_o_r_>(const IndexPair&, const TG&); │ │ │ │ │ +70 │ │ │ │ │ +71 template │ │ │ │ │ +72 bool _o_p_e_r_a_t_o_r_<_=(const IndexPair&, const TG&); │ │ │ │ │ +73 │ │ │ │ │ +74 template │ │ │ │ │ +75 bool _o_p_e_r_a_t_o_r_ _>_=(const IndexPair&, const TG&); │ │ │ │ │ +76 │ │ │ │ │ +77 template │ │ │ │ │ +78 struct MPITraits; │ │ │ │ │ +79 │ │ │ │ │ +83 template │ │ │ │ │ +_8_4 class _I_n_d_e_x_P_a_i_r │ │ │ │ │ +85 { │ │ │ │ │ +86 friend std::ostream& operator<<<>(std::ostream&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +87 friend bool operator==<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +88 friend bool operator!=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +89 friend bool operator< <>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +90 friend bool operator><>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +91 friend bool operator<=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +92 friend bool operator>=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&); │ │ │ │ │ +93 friend bool operator==<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +94 friend bool operator!=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +95 friend bool operator< <>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +96 friend bool operator> <>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +97 friend bool operator<=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +_9_8 friend bool operator>=<>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>&, const TG &); │ │ │ │ │ +99 friend struct _M_P_I_T_r_a_i_t_s<_I_n_d_e_x_P_a_i_r >; │ │ │ │ │ +100 │ │ │ │ │ +101 public: │ │ │ │ │ +_1_0_7 typedef TG _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +108 │ │ │ │ │ +_1_2_0 typedef TL _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +121 │ │ │ │ │ +_1_2_8 _I_n_d_e_x_P_a_i_r(const _G_l_o_b_a_l_I_n_d_e_x& _g_l_o_b_a_l, const _L_o_c_a_l_I_n_d_e_x& _l_o_c_a_l); │ │ │ │ │ +129 │ │ │ │ │ +_1_3_3 _I_n_d_e_x_P_a_i_r(); │ │ │ │ │ +_1_4_0 _I_n_d_e_x_P_a_i_r(const _G_l_o_b_a_l_I_n_d_e_x& _g_l_o_b_a_l); │ │ │ │ │ +141 │ │ │ │ │ +_1_4_7 inline const _G_l_o_b_a_l_I_n_d_e_x& _g_l_o_b_a_l() const; │ │ │ │ │ +148 │ │ │ │ │ +_1_5_4 inline _L_o_c_a_l_I_n_d_e_x& _l_o_c_a_l(); │ │ │ │ │ +155 │ │ │ │ │ +_1_6_1 inline const _L_o_c_a_l_I_n_d_e_x& _l_o_c_a_l() const; │ │ │ │ │ +162 │ │ │ │ │ +_1_6_8 inline void _s_e_t_L_o_c_a_l(int index); │ │ │ │ │ +169 private: │ │ │ │ │ +171 _G_l_o_b_a_l_I_n_d_e_x global_; │ │ │ │ │ +_1_7_3 _L_o_c_a_l_I_n_d_e_x local_; │ │ │ │ │ +174 }; │ │ │ │ │ +175 │ │ │ │ │ +_1_8_0 enum _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_S_t_a_t_e │ │ │ │ │ +181 { │ │ │ │ │ +_1_8_6 _G_R_O_U_N_D, │ │ │ │ │ +190 _R_E_S_I_Z_E │ │ │ │ │ +_2_0_0 }; │ │ │ │ │ +201 │ │ │ │ │ +_2_0_5 class _I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e : public _I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ +206 │ │ │ │ │ +207 // Forward declaration │ │ │ │ │ +208 template class _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +209 │ │ │ │ │ +216 template │ │ │ │ │ +_2_1_7 class _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +218 { │ │ │ │ │ +219 friend class _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t<_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t >; │ │ │ │ │ +220 │ │ │ │ │ +221 public: │ │ │ │ │ +_2_2_6 typedef TG _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +227 │ │ │ │ │ +_2_3_9 typedef TL _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +240 │ │ │ │ │ +_2_4_4 typedef _D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_<_G_l_o_b_a_l_I_n_d_e_x_,_L_o_c_a_l_I_n_d_e_x_> _I_n_d_e_x_P_a_i_r; │ │ │ │ │ +245 │ │ │ │ │ +_2_5_2 constexpr static int _a_r_r_a_y_S_i_z_e = (N>0) ? N : 1; │ │ │ │ │ +253 │ │ │ │ │ +_2_5_5 class _i_t_e_r_a_t_o_r : │ │ │ │ │ +256 public _A_r_r_a_y_L_i_s_t::iterator │ │ │ │ │ +257 { │ │ │ │ │ +258 typedef typename _A_r_r_a_y_L_i_s_t_<_I_n_d_e_x_P_a_i_r_,_N_>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +_2_5_9 _F_a_t_h_e_r; │ │ │ │ │ +260 friend class _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t<_G_l_o_b_a_l_I_n_d_e_x,_L_o_c_a_l_I_n_d_e_x,N>; │ │ │ │ │ +261 public: │ │ │ │ │ +_2_6_2 _i_t_e_r_a_t_o_r(_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>& indexSet, const _F_a_t_h_e_r& father) │ │ │ │ │ +263 : _F_a_t_h_e_r(father), indexSet_(&indexSet) │ │ │ │ │ +264 {} │ │ │ │ │ +265 │ │ │ │ │ +266 private: │ │ │ │ │ +276 inline void markAsDeleted() const │ │ │ │ │ +277 { │ │ │ │ │ +278#ifndef NDEBUG │ │ │ │ │ +279 if(indexSet_->state_ != _R_E_S_I_Z_E) │ │ │ │ │ +280 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e, "Indices can only be removed " │ │ │ │ │ +281 <<"while in RESIZE state!"); │ │ │ │ │ +282#endif │ │ │ │ │ +283 _F_a_t_h_e_r_:_:_o_p_e_r_a_t_o_r_*().local().setState(_D_E_L_E_T_E_D); │ │ │ │ │ +284 } │ │ │ │ │ +285 │ │ │ │ │ +287 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>* indexSet_; │ │ │ │ │ +288 │ │ │ │ │ +289 }; │ │ │ │ │ +290 │ │ │ │ │ +291 │ │ │ │ │ +292 │ │ │ │ │ +294 typedef typename │ │ │ │ │ +295 _A_r_r_a_y_L_i_s_t_<_I_n_d_e_x_P_a_i_r_,_N_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +_2_9_6 _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +297 │ │ │ │ │ +_3_0_1 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t(); │ │ │ │ │ +302 │ │ │ │ │ +_3_0_7 inline const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_S_t_a_t_e& _s_t_a_t_e() │ │ │ │ │ +308 { │ │ │ │ │ +309 return state_; │ │ │ │ │ +310 } │ │ │ │ │ +311 │ │ │ │ │ +_3_1_7 void _b_e_g_i_n_R_e_s_i_z_e(); │ │ │ │ │ +318 │ │ │ │ │ +_3_2_7 inline void _a_d_d(const _G_l_o_b_a_l_I_n_d_e_x& global); │ │ │ │ │ +328 │ │ │ │ │ +_3_3_7 inline void _a_d_d(const _G_l_o_b_a_l_I_n_d_e_x& global, const _L_o_c_a_l_I_n_d_e_x& local); │ │ │ │ │ +338 │ │ │ │ │ +_3_4_6 inline void _m_a_r_k_A_s_D_e_l_e_t_e_d(const _i_t_e_r_a_t_o_r& position); │ │ │ │ │ +347 │ │ │ │ │ +_3_6_0 void _e_n_d_R_e_s_i_z_e(); │ │ │ │ │ +361 │ │ │ │ │ +372 inline _I_n_d_e_x_P_a_i_r& │ │ │ │ │ +_3_7_3 _o_p_e_r_a_t_o_r_[_](const _G_l_o_b_a_l_I_n_d_e_x& global); │ │ │ │ │ +374 │ │ │ │ │ +384 inline _I_n_d_e_x_P_a_i_r& │ │ │ │ │ +_3_8_5 _a_t(const _G_l_o_b_a_l_I_n_d_e_x& global); │ │ │ │ │ +386 │ │ │ │ │ +396 inline bool │ │ │ │ │ +_3_9_7 _e_x_i_s_t_s (const _G_l_o_b_a_l_I_n_d_e_x& global) const; │ │ │ │ │ +398 │ │ │ │ │ +409 inline const _I_n_d_e_x_P_a_i_r& │ │ │ │ │ +_4_1_0 _o_p_e_r_a_t_o_r_[_](const _G_l_o_b_a_l_I_n_d_e_x& global) const; │ │ │ │ │ +411 │ │ │ │ │ +421 inline const _I_n_d_e_x_P_a_i_r& │ │ │ │ │ +_4_2_2 _a_t(const _G_l_o_b_a_l_I_n_d_e_x& global) const; │ │ │ │ │ +423 │ │ │ │ │ +_4_2_8 inline _i_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ +429 │ │ │ │ │ +_4_3_4 inline _i_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ +435 │ │ │ │ │ +_4_4_0 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +441 │ │ │ │ │ +_4_4_6 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +447 │ │ │ │ │ +_4_5_7 inline void _r_e_n_u_m_b_e_r_L_o_c_a_l(); │ │ │ │ │ +458 │ │ │ │ │ +_4_6_5 inline int _s_e_q_N_o() const; │ │ │ │ │ +466 │ │ │ │ │ +_4_7_1 inline size_t _s_i_z_e() const; │ │ │ │ │ +472 │ │ │ │ │ +473 private: │ │ │ │ │ +475 _A_r_r_a_y_L_i_s_t_<_I_n_d_e_x_P_a_i_r_,_N_> localIndices_; │ │ │ │ │ +477 _A_r_r_a_y_L_i_s_t_<_I_n_d_e_x_P_a_i_r_,_N_> newIndices_; │ │ │ │ │ +479 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_S_t_a_t_e state_; │ │ │ │ │ +481 int seqNo_; │ │ │ │ │ +483 bool deletedEntries_; │ │ │ │ │ +488 inline void merge(); │ │ │ │ │ +489 }; │ │ │ │ │ +490 │ │ │ │ │ +491 │ │ │ │ │ +497 template │ │ │ │ │ +498 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>& │ │ │ │ │ +indexSet); │ │ │ │ │ +499 │ │ │ │ │ +505 template │ │ │ │ │ +_5_0_6 class _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +507 { │ │ │ │ │ +508 public: │ │ │ │ │ +_5_1_2 typedef I _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +513 │ │ │ │ │ +_5_1_7 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +518 │ │ │ │ │ +_5_2_2 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +523 │ │ │ │ │ +_5_2_7 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +528 │ │ │ │ │ +_5_2_9 typedef _D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_<_t_y_p_e_n_a_m_e_ _I_:_:_G_l_o_b_a_l_I_n_d_e_x_,_ _t_y_p_e_n_a_m_e_ _I_:_:_L_o_c_a_l_I_n_d_e_x_> │ │ │ │ │ +_I_n_d_e_x_P_a_i_r; │ │ │ │ │ +530 │ │ │ │ │ +_5_3_7 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset, std::size_t _s_i_z_e); │ │ │ │ │ +538 │ │ │ │ │ +_5_4_4 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset); │ │ │ │ │ +545 │ │ │ │ │ +_5_4_9 _~_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(); │ │ │ │ │ +550 │ │ │ │ │ +560 inline const _I_n_d_e_x_P_a_i_r& │ │ │ │ │ +_5_6_1 _o_p_e_r_a_t_o_r_[_](const _G_l_o_b_a_l_I_n_d_e_x& global) const; │ │ │ │ │ +562 │ │ │ │ │ +566 inline const _I_n_d_e_x_P_a_i_r* │ │ │ │ │ +_5_6_7 _p_a_i_r(const std::size_t& local) const; │ │ │ │ │ +568 │ │ │ │ │ +_5_7_3 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +574 │ │ │ │ │ +_5_7_9 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +580 │ │ │ │ │ +_5_8_7 inline int _s_e_q_N_o() const; │ │ │ │ │ +588 │ │ │ │ │ +_5_9_3 inline size_t _s_i_z_e() const; │ │ │ │ │ +594 private: │ │ │ │ │ +598 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet_; │ │ │ │ │ +599 │ │ │ │ │ +603 std::size_t size_; │ │ │ │ │ +604 │ │ │ │ │ +608 std::vector indices_; │ │ │ │ │ +609 │ │ │ │ │ +610 }; │ │ │ │ │ +611 │ │ │ │ │ +612 │ │ │ │ │ +613 template │ │ │ │ │ +_6_1_4 struct _L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r │ │ │ │ │ +615 { │ │ │ │ │ +_6_1_6 static bool _c_o_m_p_a_r_e([[maybe_unused]] const T& t1, [[maybe_unused]] const T& │ │ │ │ │ +t2) │ │ │ │ │ +617 { │ │ │ │ │ +618 return false; │ │ │ │ │ +619 } │ │ │ │ │ +620 }; │ │ │ │ │ +621 │ │ │ │ │ +622 template │ │ │ │ │ +_6_2_3 struct _I_n_d_e_x_S_e_t_S_o_r_t_F_u_n_c_t_o_r │ │ │ │ │ +624 { │ │ │ │ │ +_6_2_5 bool _o_p_e_r_a_t_o_r_(_)(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& i1, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& i2) │ │ │ │ │ +626 { │ │ │ │ │ +627 return i1._g_l_o_b_a_l()_:_:_c_o_m_p_a_r_e(i1._l_o_c_a_l(), │ │ │ │ │ +629 i2._l_o_c_a_l())); │ │ │ │ │ +630 } │ │ │ │ │ +631 }; │ │ │ │ │ +632 │ │ │ │ │ +633 │ │ │ │ │ +634 │ │ │ │ │ +635 template │ │ │ │ │ +_6_3_6 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& │ │ │ │ │ +pair) │ │ │ │ │ +637 { │ │ │ │ │ +638 os<<"{global="< │ │ │ │ │ +_6_4_3 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>& indexSet) │ │ │ │ │ +644 { │ │ │ │ │ +645 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +646 Iterator end = indexSet._e_n_d(); │ │ │ │ │ +647 os<<"{"; │ │ │ │ │ +648 for(Iterator index = indexSet._b_e_g_i_n(); index != end; ++index) │ │ │ │ │ +649 os<<*index<<" "; │ │ │ │ │ +650 os<<"}"; │ │ │ │ │ +651 return os; │ │ │ │ │ +652 │ │ │ │ │ +653 } │ │ │ │ │ +654 │ │ │ │ │ +655 template │ │ │ │ │ +_6_5_6 inline bool _o_p_e_r_a_t_o_r_=_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& │ │ │ │ │ +b) │ │ │ │ │ +657 { │ │ │ │ │ +658 return a.global_==b.global_; │ │ │ │ │ +659 } │ │ │ │ │ +660 │ │ │ │ │ +661 template │ │ │ │ │ +_6_6_2 inline bool _o_p_e_r_a_t_o_r_!_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& │ │ │ │ │ +b) │ │ │ │ │ +663 { │ │ │ │ │ +664 return a.global_!=b.global_; │ │ │ │ │ +665 } │ │ │ │ │ +666 │ │ │ │ │ +667 template │ │ │ │ │ +_6_6_8 inline bool _o_p_e_r_a_t_o_r_<(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& b) │ │ │ │ │ +669 { │ │ │ │ │ +670 return a.global_ │ │ │ │ │ +_6_7_4 inline bool _o_p_e_r_a_t_o_r_>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& b) │ │ │ │ │ +675 { │ │ │ │ │ +676 return a.global_>b.global_; │ │ │ │ │ +677 } │ │ │ │ │ +678 │ │ │ │ │ +679 template │ │ │ │ │ +_6_8_0 inline bool _o_p_e_r_a_t_o_r_<_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& │ │ │ │ │ +b) │ │ │ │ │ +681 { │ │ │ │ │ +682 return a.global_<=b.global_; │ │ │ │ │ +683 } │ │ │ │ │ +684 │ │ │ │ │ +685 template │ │ │ │ │ +_6_8_6 inline bool _o_p_e_r_a_t_o_r_ _>_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& │ │ │ │ │ +b) │ │ │ │ │ +687 { │ │ │ │ │ +688 return a.global_>=b.global_; │ │ │ │ │ +689 } │ │ │ │ │ +690 │ │ │ │ │ +691 template │ │ │ │ │ +_6_9_2 inline bool _o_p_e_r_a_t_o_r_=_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +693 { │ │ │ │ │ +694 return a.global_==b; │ │ │ │ │ +695 } │ │ │ │ │ +696 │ │ │ │ │ +697 template │ │ │ │ │ +_6_9_8 inline bool _o_p_e_r_a_t_o_r_!_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +699 { │ │ │ │ │ +700 return a.global_!=b; │ │ │ │ │ +701 } │ │ │ │ │ +702 │ │ │ │ │ +703 template │ │ │ │ │ +_7_0_4 inline bool _o_p_e_r_a_t_o_r_<(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +705 { │ │ │ │ │ +706 return a.global_ │ │ │ │ │ +_7_1_0 inline bool _o_p_e_r_a_t_o_r_>(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +711 { │ │ │ │ │ +712 return a.global_>b; │ │ │ │ │ +713 } │ │ │ │ │ +714 │ │ │ │ │ +715 template │ │ │ │ │ +_7_1_6 inline bool _o_p_e_r_a_t_o_r_<_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +717 { │ │ │ │ │ +718 return a.global_<=b; │ │ │ │ │ +719 } │ │ │ │ │ +720 │ │ │ │ │ +721 template │ │ │ │ │ +_7_2_2 inline bool _o_p_e_r_a_t_o_r_ _>_=(const _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>& a, const TG& b) │ │ │ │ │ +723 { │ │ │ │ │ +724 return a.global_>=b; │ │ │ │ │ +725 } │ │ │ │ │ +726 │ │ │ │ │ +727#ifndef DOXYGEN │ │ │ │ │ +728 │ │ │ │ │ +729 template │ │ │ │ │ +730 _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_I_n_d_e_x_P_a_i_r(const TG& global, const TL& local) │ │ │ │ │ +731 : global_(global), local_(local){} │ │ │ │ │ +732 │ │ │ │ │ +733 template │ │ │ │ │ +734 _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_I_n_d_e_x_P_a_i_r(const TG& global) │ │ │ │ │ +735 : global_(global), local_(){} │ │ │ │ │ +736 │ │ │ │ │ +737 template │ │ │ │ │ +738 _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_I_n_d_e_x_P_a_i_r() │ │ │ │ │ +739 : global_(), local_(){} │ │ │ │ │ +740 │ │ │ │ │ +741 template │ │ │ │ │ +742 inline const TG& _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_g_l_o_b_a_l() const { │ │ │ │ │ +743 return global_; │ │ │ │ │ +744 } │ │ │ │ │ +745 │ │ │ │ │ +746 template │ │ │ │ │ +747 inline TL& _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_l_o_c_a_l() { │ │ │ │ │ +748 return local_; │ │ │ │ │ +749 } │ │ │ │ │ +750 │ │ │ │ │ +751 template │ │ │ │ │ +752 inline const TL& _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_l_o_c_a_l() const { │ │ │ │ │ +753 return local_; │ │ │ │ │ +754 } │ │ │ │ │ +755 │ │ │ │ │ +756 template │ │ │ │ │ +757 inline void _I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>_:_:_s_e_t_L_o_c_a_l(int local){ │ │ │ │ │ +758 local_=local; │ │ │ │ │ +759 } │ │ │ │ │ +760 │ │ │ │ │ +761 template │ │ │ │ │ +762 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t() │ │ │ │ │ +763 : state_(_G_R_O_U_N_D), seqNo_(0), deletedEntries_() │ │ │ │ │ +764 {} │ │ │ │ │ +765 │ │ │ │ │ +766 template │ │ │ │ │ +767 void _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_b_e_g_i_n_R_e_s_i_z_e() │ │ │ │ │ +768 { │ │ │ │ │ +769 │ │ │ │ │ +770 // Checks in unproductive code │ │ │ │ │ +771#ifndef NDEBUG │ │ │ │ │ +772 if(state_!=_G_R_O_U_N_D) │ │ │ │ │ +773 _D_U_N_E___T_H_R_O_W(InvalidIndexSetState, │ │ │ │ │ +774 "IndexSet has to be in GROUND state, when " │ │ │ │ │ +775 << "beginResize() is called!"); │ │ │ │ │ +776#endif │ │ │ │ │ +777 │ │ │ │ │ +778 state_ = _R_E_S_I_Z_E; │ │ │ │ │ +779 deletedEntries_ = false; │ │ │ │ │ +780 } │ │ │ │ │ +781 │ │ │ │ │ +782 template │ │ │ │ │ +783 inline void _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_a_d_d(const GlobalIndex& global) │ │ │ │ │ +784 { │ │ │ │ │ +785 // Checks in unproductive code │ │ │ │ │ +786#ifndef NDEBUG │ │ │ │ │ +787 if(state_ != _R_E_S_I_Z_E) │ │ │ │ │ +788 _D_U_N_E___T_H_R_O_W(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_a_d_d(const TG& global, const TL& │ │ │ │ │ +local) │ │ │ │ │ +796 { │ │ │ │ │ +797 // Checks in unproductive code │ │ │ │ │ +798#ifndef NDEBUG │ │ │ │ │ +799 if(state_ != _R_E_S_I_Z_E) │ │ │ │ │ +800 _D_U_N_E___T_H_R_O_W(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_m_a_r_k_A_s_D_e_l_e_t_e_d(const iterator& │ │ │ │ │ +global) │ │ │ │ │ +808 { │ │ │ │ │ +809 // Checks in unproductive code │ │ │ │ │ +810#ifndef NDEBUG │ │ │ │ │ +811 if(state_ != _R_E_S_I_Z_E) │ │ │ │ │ +812 _D_U_N_E___T_H_R_O_W(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_e_n_d_R_e_s_i_z_e() { │ │ │ │ │ +822 // Checks in unproductive code │ │ │ │ │ +823#ifndef NDEBUG │ │ │ │ │ +824 if(state_ != _R_E_S_I_Z_E) │ │ │ │ │ +825 _D_U_N_E___T_H_R_O_W(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_ = _G_R_O_U_N_D; │ │ │ │ │ +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()==_D_E_L_E_T_E_D) { │ │ │ │ │ +855 old.eraseToHere(); │ │ │ │ │ +856 } │ │ │ │ │ +857 else │ │ │ │ │ +858 { │ │ │ │ │ +859 if(old->global() < added->global() || │ │ │ │ │ +860 (old->global() == added->global() │ │ │ │ │ +861 && _L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r_<_T_L_>_:_:_c_o_m_p_a_r_e(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()!=_D_E_L_E_T_E_D) { │ │ │ │ │ +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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_a_t(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_o_p_e_r_a_t_o_r_[_](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& _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_a_t(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 _D_U_N_E___T_H_R_O_W(RangeError, "No entries!"); │ │ │ │ │ +952 │ │ │ │ │ +953 if( localIndices_[low].global() != global) │ │ │ │ │ +954 _D_U_N_E___T_H_R_O_W(RangeError, "Could not find entry of "< │ │ │ │ │ +960 inline bool _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_e_x_i_s_t_s (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& _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_o_p_e_r_a_t_o_r_[_](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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_b_e_g_i_n() │ │ │ │ │ +1002 { │ │ │ │ │ +1003 return iterator(*this, localIndices_.begin()); │ │ │ │ │ +1004 } │ │ │ │ │ +1005 │ │ │ │ │ +1006 │ │ │ │ │ +1007 template │ │ │ │ │ +1008 inline typename ParallelIndexSet::iterator │ │ │ │ │ +1009 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_e_n_d() │ │ │ │ │ +1010 { │ │ │ │ │ +1011 return iterator(*this,localIndices_.end()); │ │ │ │ │ +1012 } │ │ │ │ │ +1013 │ │ │ │ │ +1014 template │ │ │ │ │ +1015 inline typename ParallelIndexSet::const_iterator │ │ │ │ │ +1016 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_b_e_g_i_n() const │ │ │ │ │ +1017 { │ │ │ │ │ +1018 return localIndices_.begin(); │ │ │ │ │ +1019 } │ │ │ │ │ +1020 │ │ │ │ │ +1021 │ │ │ │ │ +1022 template │ │ │ │ │ +1023 inline typename ParallelIndexSet::const_iterator │ │ │ │ │ +1024 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_e_n_d() const │ │ │ │ │ +1025 { │ │ │ │ │ +1026 return localIndices_.end(); │ │ │ │ │ +1027 } │ │ │ │ │ +1028 │ │ │ │ │ +1029 template │ │ │ │ │ +1030 void _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_r_e_n_u_m_b_e_r_L_o_c_a_l(){ │ │ │ │ │ +1031#ifndef NDEBUG │ │ │ │ │ +1032 if(state_==_R_E_S_I_Z_E) │ │ │ │ │ +1033 _D_U_N_E___T_H_R_O_W(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_s_e_q_N_o() const │ │ │ │ │ +1046 { │ │ │ │ │ +1047 return seqNo_; │ │ │ │ │ +1048 } │ │ │ │ │ +1049 │ │ │ │ │ +1050 template │ │ │ │ │ +1051 inline size_t _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_>_:_:_s_i_z_e() const │ │ │ │ │ +1052 { │ │ │ │ │ +1053 return localIndices_.size(); │ │ │ │ │ +1054 } │ │ │ │ │ +1055 │ │ │ │ │ +1056 template │ │ │ │ │ +1057 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(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 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(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 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_~_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t() │ │ │ │ │ +1086 {} │ │ │ │ │ +1087 │ │ │ │ │ +1088 template │ │ │ │ │ +1089 inline const IndexPair* │ │ │ │ │ +1090 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_p_a_i_r(const std::size_t& local) const │ │ │ │ │ +1091 { │ │ │ │ │ +1092 return indices_[local]; │ │ │ │ │ +1093 } │ │ │ │ │ +1094 │ │ │ │ │ +1095 template │ │ │ │ │ +1096 inline const IndexPair& │ │ │ │ │ +1097 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_o_p_e_r_a_t_o_r_[_](const GlobalIndex& global) const │ │ │ │ │ +1098 { │ │ │ │ │ +1099 return indexSet_[global]; │ │ │ │ │ +1100 } │ │ │ │ │ +1101 │ │ │ │ │ +1102 template │ │ │ │ │ +1103 typename I::const_iterator _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_b_e_g_i_n() const │ │ │ │ │ +1104 { │ │ │ │ │ +1105 return indexSet_.begin(); │ │ │ │ │ +1106 } │ │ │ │ │ +1107 │ │ │ │ │ +1108 template │ │ │ │ │ +1109 typename I::const_iterator _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_e_n_d() const │ │ │ │ │ +1110 { │ │ │ │ │ +1111 return indexSet_.end(); │ │ │ │ │ +1112 } │ │ │ │ │ +1113 │ │ │ │ │ +1114 template │ │ │ │ │ +1115 inline size_t _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_s_i_z_e() const │ │ │ │ │ +1116 { │ │ │ │ │ +1117 return size_; │ │ │ │ │ +1118 } │ │ │ │ │ +1119 │ │ │ │ │ +1120 template │ │ │ │ │ +1121 inline int _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_<_I_>_:_:_s_e_q_N_o() const │ │ │ │ │ +1122 { │ │ │ │ │ +1123 return indexSet_.seqNo(); │ │ │ │ │ +1124 } │ │ │ │ │ +1125 │ │ │ │ │ +1126 template │ │ │ │ │ +1127 bool _o_p_e_r_a_t_o_r_=_=(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 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_1_,_T_L_1_,_N_1_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r 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 _o_p_e_r_a_t_o_r_!_=(const ParallelIndexSet& idxset, │ │ │ │ │ +1149 const ParallelIndexSet& idxset1) │ │ │ │ │ +1150 { │ │ │ │ │ +1151 return !(idxset==idxset1); │ │ │ │ │ +1152 } │ │ │ │ │ +1153 │ │ │ │ │ +1154 │ │ │ │ │ +1155#endif // DOXYGEN │ │ │ │ │ +1156 │ │ │ │ │ +1157} │ │ │ │ │ +1158#endif │ │ │ │ │ +_l_o_c_a_l_i_n_d_e_x_._h_h │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ +_a_r_r_a_y_l_i_s_t_._h_h │ │ │ │ │ +Implements a random-access container that can efficiently change size (similar │ │ │ │ │ +to std::deque) │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:637 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_> │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator>(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:683 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator<=(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:660 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for equality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator>=(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:705 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for inequality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +IndexPair & operator[](const GlobalIndex &global) │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_a_r_r_a_y_S_i_z_e │ │ │ │ │ +static constexpr int arraySize │ │ │ │ │ +The size of the individual arrays in the underlying ArrayList. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:252 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n_R_e_s_i_z_e │ │ │ │ │ +void beginResize() │ │ │ │ │ +Indicate that the index set is to be resized. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_S_t_a_t_e │ │ │ │ │ +ParallelIndexSetState │ │ │ │ │ +The states the index set can be in. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_r_e_n_u_m_b_e_r_L_o_c_a_l │ │ │ │ │ +void renumberLocal() │ │ │ │ │ +Renumbers the local index numbers. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_x_i_s_t_s │ │ │ │ │ +bool exists(const GlobalIndex &global) const │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_s_i_z_e │ │ │ │ │ +size_t size() const │ │ │ │ │ +Get the total number (public and nonpublic) indices. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +ArrayList< IndexPair, N >::const_iterator const_iterator │ │ │ │ │ +The constant iterator over the pairs. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_S_e_t_S_o_r_t_F_u_n_c_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2) │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:625 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_a_d_d │ │ │ │ │ +void add(const GlobalIndex &global) │ │ │ │ │ +Add an new index to the set. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Get an iterator over the indices positioned after the last index. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_l_o_c_a_l │ │ │ │ │ +const LocalIndex & local() const │ │ │ │ │ +Get the local index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_a_t │ │ │ │ │ +const IndexPair & at(const GlobalIndex &global) const │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +GlobalLookupIndexSet(const ParallelIndexSet &indexset) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +TL LocalIndex │ │ │ │ │ +the type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_s_e_q_N_o │ │ │ │ │ +int seqNo() const │ │ │ │ │ +Get the internal sequence number. │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r_:_:_c_o_m_p_a_r_e │ │ │ │ │ +static bool compare(const T &t1, const T &t2) │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:616 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Get an iterator over the indices positioned at the first index. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:529 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +Get an iterator over the indices positioned after the last index. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +ParallelIndexSet::const_iterator const_iterator │ │ │ │ │ +The iterator over the index pairs. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:527 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Get an iterator over the indices positioned at the first index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const IndexPair & operator[](const GlobalIndex &global) const │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_s_t_a_t_e │ │ │ │ │ +const ParallelIndexSetState & state() │ │ │ │ │ +Get the state the index set is in. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Get an iterator over the indices positioned at the first index. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const IndexPair & operator[](const GlobalIndex &global) const │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +IndexPair() │ │ │ │ │ +Construct a new Pair. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +I ParallelIndexSet │ │ │ │ │ +The type of the index set. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:512 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +TL LocalIndex │ │ │ │ │ +The type of the local index, e.g. ParallelLocalIndex. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_m_a_r_k_A_s_D_e_l_e_t_e_d │ │ │ │ │ +void markAsDeleted(const iterator &position) │ │ │ │ │ +Mark an index as deleted. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:517 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +IndexPair(const GlobalIndex &global, const LocalIndex &local) │ │ │ │ │ +Constructs a new Pair. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_s_e_t_L_o_c_a_l │ │ │ │ │ +void setLocal(int index) │ │ │ │ │ +Set the local index. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_g_l_o_b_a_l │ │ │ │ │ +const GlobalIndex & global() const │ │ │ │ │ +Get the global index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_a_d_d │ │ │ │ │ +void add(const GlobalIndex &global, const LocalIndex &local) │ │ │ │ │ +Add an new index to the set. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Get an iterator over the indices positioned after the last index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_a_t │ │ │ │ │ +IndexPair & at(const GlobalIndex &global) │ │ │ │ │ +Find the index pair with a specific global id. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +ParallelIndexSet() │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_n_d_R_e_s_i_z_e │ │ │ │ │ +void endResize() │ │ │ │ │ +Indicate that the resizing finishes. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_~_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +~GlobalLookupIndexSet() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_p_a_i_r │ │ │ │ │ +const IndexPair * pair(const std::size_t &local) const │ │ │ │ │ +Get the index pair corresponding to a local index. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_l_o_c_a_l │ │ │ │ │ +LocalIndex & local() │ │ │ │ │ +Get the local index. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_s_i_z_e │ │ │ │ │ +size_t size() const │ │ │ │ │ +Get the total number (public and nonpublic) indices. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +IndexPair(const GlobalIndex &global) │ │ │ │ │ +Constructs a new Pair. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ +sorting. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +the type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_s_e_q_N_o │ │ │ │ │ +int seqNo() const │ │ │ │ │ +Get the internal sequence number. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father) │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:522 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair │ │ │ │ │ +The type of the pair stored. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_R_E_S_I_Z_E │ │ │ │ │ +@ RESIZE │ │ │ │ │ +Indicates that the index set is currently being resized. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_G_R_O_U_N_D │ │ │ │ │ +@ GROUND │ │ │ │ │ +The default mode. Indicates that the index set is ready to be used. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_D_E_L_E_T_E_D │ │ │ │ │ +@ DELETED │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_d_o_t_T │ │ │ │ │ -auto dotT(const A &a, const B &b) -> decltype(a *b) │ │ │ │ │ -Computes an indefinite vector dot product for fundamental data types according │ │ │ │ │ -to Petsc's VectTDot fu... │ │ │ │ │ -DDeeffiinniittiioonn dotproduct.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_I_s_V_e_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn dotproduct.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +A random access iterator for the Dune::ArrayList class. │ │ │ │ │ +DDeeffiinniittiioonn arraylist.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +A constant random access iterator for the Dune::ArrayList class. │ │ │ │ │ +DDeeffiinniittiioonn arraylist.hh:370 │ │ │ │ │ +_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t │ │ │ │ │ +A dynamically growing random access list. │ │ │ │ │ +DDeeffiinniittiioonn arraylist.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +ConstArrayListIterator< MemberType, N, A > const_iterator │ │ │ │ │ +A constant random access iterator. │ │ │ │ │ +DDeeffiinniittiioonn arraylist.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s │ │ │ │ │ +A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +Default exception if a function was called while the object is not in a valid │ │ │ │ │ +state for that function... │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_ _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_ _T_,_ _N_,_ _A_ _>_,_ _A_:_:_v_a_l_u_e___t_y_p_e_, │ │ │ │ │ +_A_:_:_v_a_l_u_e___t_y_p_e_ _&_,_ _A_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e_ _>_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +Reference operator*() const │ │ │ │ │ +Dereferencing operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +A pair consisting of a global and local index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e │ │ │ │ │ +Exception indicating that the index set is not in the expected state. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +Decorates an index set with the possibility to find a global index that is │ │ │ │ │ +mapped to a specific local... │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Manager class for the mapping between local indices and globally unique │ │ │ │ │ +indices. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +The iterator over the pairs. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:257 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:615 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_S_e_t_S_o_r_t_F_u_n_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:624 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hash.hh File Reference │ │ │ │ +dune-common: plocalindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,185 +65,67 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ Functions
│ │ │ │ -
hash.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <functional>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +
#include "localindex.hh"
│ │ │ │ +#include "indexset.hh"
│ │ │ │ +#include "mpitraits.hh"
│ │ │ │ +#include <iostream>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::hash< T >
 Functor for hashing objects of type T. More...
class  Dune::ParallelLocalIndex< T >
 An index present on the local process with an additional attribute flag. More...
 
struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
 
class  Dune::MPITraits< ParallelLocalIndex< T > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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.
 
#define DUNE_HASH_TEMPLATE_ARGS(...)
 Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
 
#define DUNE_HASH_TYPE(...)
 Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
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.
 
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.
 
template<class T >
std::ostream & Dune::operator<< (std::ostream &os, const ParallelLocalIndex< T > &index)
 Print the local index to a stream.
 
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)
 
│ │ │ │

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.

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

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

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,129 +1,51 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -hash.hh File Reference │ │ │ │ │ -Support for calculating hash values of objects. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +plocalindex.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet for distributed │ │ │ │ │ +computing. _M_o_r_e_._._. │ │ │ │ │ +#include "_l_o_c_a_l_i_n_d_e_x_._h_h" │ │ │ │ │ +#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +#include "_m_p_i_t_r_a_i_t_s_._h_h" │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_h_a_s_h_<_ _T_ _> │ │ │ │ │ -  Functor for hashing objects of type T. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_ _T_ _> │ │ │ │ │ +  An index present on the local process with an additional attribute │ │ │ │ │ + flag. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r_<_ _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_<_ _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_ _T_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___D_E_F_I_N_E___H_A_S_H(template_args, type) │ │ │ │ │ -  Defines the required struct specialization to make type hashable via │ │ │ │ │ - _D_u_n_e_:_:_h_a_s_h. │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S(...) │ │ │ │ │ -  Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< T │ │ │ │ │ + > &index) │ │ │ │ │ +  Print the local index to a stream. │ │ │ │ │   │ │ │ │ │ -#define  _D_U_N_E___H_A_S_H___T_Y_P_E(...) │ │ │ │ │ -  Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< T > &p1, const │ │ │ │ │ + _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< T > &p2) │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ template │ │ │ │ │ - void  _D_u_n_e_:_:_h_a_s_h___c_o_m_b_i_n_e (std::size_t &seed, const T &arg) │ │ │ │ │ -  Calculates the hash value of arg and combines it in-place with │ │ │ │ │ - seed. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::size_t  _D_u_n_e_:_:_h_a_s_h___r_a_n_g_e (It first, It last) │ │ │ │ │ -  Hashes all elements in the range [first,last) and returns the │ │ │ │ │ - combined hash. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_h_a_s_h___r_a_n_g_e (std::size_t &seed, It first, It last) │ │ │ │ │ -  Hashes all elements in the range [first,last) and combines the │ │ │ │ │ - hashes in-place with seed. │ │ │ │ │ + bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< T > &p1, const │ │ │ │ │ + _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< T > &p2) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Support for calculating hash values of objects. │ │ │ │ │ -This file provides the functor _D_u_n_e_:_:_h_a_s_h to calculate hash values and some │ │ │ │ │ -infrastructure to simplify extending _D_u_n_e_:_:_h_a_s_h for user-defined types, │ │ │ │ │ -independent of the actual underlying implementation. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__DDEEFFIINNEE__HHAASSHH ********** │ │ │ │ │ -#define DUNE_DEFINE_HASH (   template_args, │ │ │ │ │ -   type  │ │ │ │ │ - ) │ │ │ │ │ -Defines the required struct specialization to make type hashable via _D_u_n_e_:_: │ │ │ │ │ -_h_a_s_h. │ │ │ │ │ -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 _D_u_n_e_:_:_h_a_s_h, 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 │ │ │ │ │ -_D_U_N_E___D_E_F_I_N_E___H_A_S_H(_D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S(typename A, int i),_D_U_N_E___H_A_S_H___T_Y_P_E │ │ │ │ │ -(Foo)) │ │ │ │ │ -_D_U_N_E___D_E_F_I_N_E___H_A_S_H │ │ │ │ │ -#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ -Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ -hash. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:100 │ │ │ │ │ -_D_U_N_E___H_A_S_H___T_Y_P_E │ │ │ │ │ -#define DUNE_HASH_TYPE(...) │ │ │ │ │ -Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:117 │ │ │ │ │ -_D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S │ │ │ │ │ -#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ -Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:109 │ │ │ │ │ - Warning │ │ │ │ │ - As the specialization has to be placed in the original namespace of the │ │ │ │ │ - hash struct (e.g. std), this macro mmuusstt 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. │ │ │ │ │ -********** _?◆_? DDUUNNEE__HHAASSHH__TTEEMMPPLLAATTEE__AARRGGSS ********** │ │ │ │ │ -#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. │ │ │ │ │ -********** _?◆_? DDUUNNEE__HHAASSHH__TTYYPPEE ********** │ │ │ │ │ -#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. │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet for distributed │ │ │ │ │ +computing. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hash.hh Source File │ │ │ │ +dune-common: plocalindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,293 +70,306 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hash.hh
│ │ │ │ +
plocalindex.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
│ │ │ │ -
7
│ │ │ │ -
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 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
│ │ │ │ +
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
│ │ │ │ -
122
│ │ │ │ -
123// ********************************************************************************
│ │ │ │ -
124// C++11 support
│ │ │ │ -
125// ********************************************************************************
│ │ │ │ +
125 inline operator size_t() const;
│ │ │ │
126
│ │ │ │ -
127// import std::hash into Dune namespace
│ │ │ │ -
128namespace Dune {
│ │ │ │ -
129
│ │ │ │ -
130 using std::hash;
│ │ │ │ -
131
│ │ │ │ -
132}
│ │ │ │ +
132 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
│ │ │ │
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
│ │ │ │ -
196
│ │ │ │ -
197// ********************************************************************************
│ │ │ │ -
198// Some utility functions for combining hashes of member variables.
│ │ │ │ -
199// ********************************************************************************
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │ -
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.
│ │ │ │ +
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
│ │ │ │ +
Provides a map between global and local indices.
│ │ │ │ +
Provides classes for use as the local index in ParallelIndexSet.
│ │ │ │ +
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ +
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
│ │ │ │
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
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,329 +1,325 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -hash.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +plocalindex.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -11 │ │ │ │ │ -24/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ -25// Doxygen documentation │ │ │ │ │ -26/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ -27 │ │ │ │ │ -28#ifdef DOXYGEN │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e { │ │ │ │ │ -31 │ │ │ │ │ -33 │ │ │ │ │ -38 template │ │ │ │ │ -_3_9 struct _h_a_s_h │ │ │ │ │ -40 { │ │ │ │ │ -41 │ │ │ │ │ -_4_3 std::size_t _o_p_e_r_a_t_o_r_(_)(const T& t) const │ │ │ │ │ -44 { │ │ │ │ │ -45 return _h_a_s_h(t); │ │ │ │ │ -46 } │ │ │ │ │ -47 │ │ │ │ │ -48 }; │ │ │ │ │ -49 │ │ │ │ │ -50} │ │ │ │ │ -51 │ │ │ │ │ -53 │ │ │ │ │ -_1_0_0#define DUNE_DEFINE_HASH(template_args,type) │ │ │ │ │ -101 │ │ │ │ │ -102 │ │ │ │ │ -104 │ │ │ │ │ -_1_0_9#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ -110 │ │ │ │ │ -112 │ │ │ │ │ -_1_1_7#define DUNE_HASH_TYPE(...) │ │ │ │ │ -118 │ │ │ │ │ -119#else // DOXYGEN - hide all the ugly implementation │ │ │ │ │ -120 │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_PLOCALINDEX_HH │ │ │ │ │ +7#define DUNE_PLOCALINDEX_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include "_l_o_c_a_l_i_n_d_e_x_._h_h" │ │ │ │ │ +10#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +11#include "_m_p_i_t_r_a_i_t_s_._h_h" │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e │ │ │ │ │ +16{ │ │ │ │ │ +17 │ │ │ │ │ +18 │ │ │ │ │ +29 template class ParallelLocalIndex; │ │ │ │ │ +30 │ │ │ │ │ +36 template │ │ │ │ │ +_3_7 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& │ │ │ │ │ +index) │ │ │ │ │ +38 { │ │ │ │ │ +39 os<<"{local="< │ │ │ │ │ +_4_8 class _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +49 { │ │ │ │ │ +50#if HAVE_MPI │ │ │ │ │ +51 // friend declaration needed for MPITraits │ │ │ │ │ +52 friend struct _M_P_I_T_r_a_i_t_s<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x >; │ │ │ │ │ +53#endif │ │ │ │ │ +54 friend std::ostream& operator<<<>(std::ostream& os, const │ │ │ │ │ +_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& index); │ │ │ │ │ +55 │ │ │ │ │ +56 public: │ │ │ │ │ +_6_4 typedef T _A_t_t_r_i_b_u_t_e; │ │ │ │ │ +73 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e, bool _i_s_P_u_b_l_i_c); │ │ │ │ │ +74 │ │ │ │ │ +83 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(size_t localIndex, const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e, bool │ │ │ │ │ +_i_s_P_u_b_l_i_c=true); │ │ │ │ │ +89 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(); │ │ │ │ │ +90 │ │ │ │ │ +91#if 0 │ │ │ │ │ +101 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e, size_t _l_o_c_a_l, bool │ │ │ │ │ +_i_s_P_u_b_l_i_c); │ │ │ │ │ +102#endif │ │ │ │ │ +103 │ │ │ │ │ +108 inline const _A_t_t_r_i_b_u_t_e _a_t_t_r_i_b_u_t_e() const; │ │ │ │ │ +109 │ │ │ │ │ +114 inline void _s_e_t_A_t_t_r_i_b_u_t_e(const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e); │ │ │ │ │ +115 │ │ │ │ │ +120 inline size_t _l_o_c_a_l() const; │ │ │ │ │ 121 │ │ │ │ │ -122 │ │ │ │ │ -123/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ -124// C++11 support │ │ │ │ │ -125/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ +125 inline operator size_t() const; │ │ │ │ │ 126 │ │ │ │ │ -127// import std::hash into Dune namespace │ │ │ │ │ -128namespace _D_u_n_e { │ │ │ │ │ -129 │ │ │ │ │ -130 using std::hash; │ │ │ │ │ -131 │ │ │ │ │ -132} │ │ │ │ │ +132 inline _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_A_t_t_r_i_b_u_t_e_>& _o_p_e_r_a_t_o_r_=(size_t index); │ │ │ │ │ 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) \ │ │ │ │ │ +138 inline bool _i_s_P_u_b_l_i_c() const; │ │ │ │ │ +139 │ │ │ │ │ +144 inline _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e _s_t_a_t_e() const; │ │ │ │ │ +145 │ │ │ │ │ +150 inline void _s_e_t_S_t_a_t_e(const _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e& _s_t_a_t_e); │ │ │ │ │ +151 │ │ │ │ │ +152 private: │ │ │ │ │ +154 size_t localIndex_; │ │ │ │ │ +155 │ │ │ │ │ +157 char attribute_; │ │ │ │ │ +158 │ │ │ │ │ +160 char public_; │ │ │ │ │ +161 │ │ │ │ │ +168 char state_; │ │ │ │ │ +169 │ │ │ │ │ +170 }; │ │ │ │ │ +171 │ │ │ │ │ +172 template │ │ │ │ │ +_1_7_3 bool _o_p_e_r_a_t_o_r_=_=(const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& p1, │ │ │ │ │ +174 const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& p2) │ │ │ │ │ +175 { │ │ │ │ │ +176 if(p1._l_o_c_a_l()!=p2._l_o_c_a_l()) │ │ │ │ │ +177 return false; │ │ │ │ │ +178 if(p1._a_t_t_r_i_b_u_t_e()!=p2._a_t_t_r_i_b_u_t_e()) │ │ │ │ │ +179 return false; │ │ │ │ │ +180 if(p1._i_s_P_u_b_l_i_c()!=p2._i_s_P_u_b_l_i_c()) │ │ │ │ │ +181 return false; │ │ │ │ │ +182 return true; │ │ │ │ │ +183 } │ │ │ │ │ +184 template │ │ │ │ │ +_1_8_5 bool _o_p_e_r_a_t_o_r_!_=(const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& p1, │ │ │ │ │ +186 const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& p2) │ │ │ │ │ +187 { │ │ │ │ │ +188 return !(p1==p2); │ │ │ │ │ +189 } │ │ │ │ │ +190 │ │ │ │ │ 191 │ │ │ │ │ -192 │ │ │ │ │ -193#endif // DOXYGEN │ │ │ │ │ -194 │ │ │ │ │ -195 │ │ │ │ │ -196 │ │ │ │ │ -197/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ -198// Some utility functions for combining hashes of member variables. │ │ │ │ │ -199/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ +192 template │ │ │ │ │ +_1_9_3 struct _L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x > │ │ │ │ │ +194 { │ │ │ │ │ +_1_9_5 static bool _c_o_m_p_a_r_e(const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& t1, │ │ │ │ │ +196 const _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& t2){ │ │ │ │ │ +197 return t1._a_t_t_r_i_b_u_t_e() │ │ │ │ │ -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 _D_u_n_e_:_:_h_a_s_h_<_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 │ │ │ │ │ -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 _D_u_n_e_:_:_h_a_s_h_<_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 │ │ │ │ │ +201 │ │ │ │ │ +202#if HAVE_MPI │ │ │ │ │ +203 │ │ │ │ │ +205 template │ │ │ │ │ +_2_0_6 class _M_P_I_T_r_a_i_t_s<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x > │ │ │ │ │ +207 { │ │ │ │ │ +208 public: │ │ │ │ │ +209 static MPI_Datatype _g_e_t_T_y_p_e(); │ │ │ │ │ +210 private: │ │ │ │ │ +211 static MPI_Datatype type; │ │ │ │ │ +212 │ │ │ │ │ +213 }; │ │ │ │ │ +214 │ │ │ │ │ +215#endif │ │ │ │ │ +216 │ │ │ │ │ +217 template │ │ │ │ │ +_2_1_8 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(const T& attribute, bool │ │ │ │ │ +isPublic) │ │ │ │ │ +219 : localIndex_(0), attribute_(static_cast(attribute)), │ │ │ │ │ +220 public_(static_cast(isPublic)), state_(static_cast(_V_A_L_I_D)) │ │ │ │ │ +221 {} │ │ │ │ │ +222 │ │ │ │ │ +223 │ │ │ │ │ +224 template │ │ │ │ │ +_2_2_5 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x(size_t local, const T& attribute, │ │ │ │ │ +bool isPublic) │ │ │ │ │ +226 : localIndex_(local), attribute_(static_cast(attribute)), │ │ │ │ │ +227 public_(static_cast(isPublic)), state_(static_cast(_V_A_L_I_D)) │ │ │ │ │ +228 {} │ │ │ │ │ +229 │ │ │ │ │ +230 template │ │ │ │ │ +_2_3_1 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x() │ │ │ │ │ +232 : localIndex_(0), attribute_(), public_(static_cast(false)), │ │ │ │ │ +233 state_(static_cast(_V_A_L_I_D)) │ │ │ │ │ +234 {} │ │ │ │ │ +235 │ │ │ │ │ +236 template │ │ │ │ │ +_2_3_7 inline const T _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_a_t_t_r_i_b_u_t_e() const │ │ │ │ │ +238 { │ │ │ │ │ +239 return T(attribute_); │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +242 template │ │ │ │ │ +243 inline void │ │ │ │ │ +_2_4_4 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_s_e_t_A_t_t_r_i_b_u_t_e(const _A_t_t_r_i_b_u_t_e& attribute) │ │ │ │ │ +245 { │ │ │ │ │ +246 attribute_ = attribute; │ │ │ │ │ +247 } │ │ │ │ │ +248 │ │ │ │ │ +249 template │ │ │ │ │ +_2_5_0 inline size_t _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_l_o_c_a_l() const │ │ │ │ │ +251 { │ │ │ │ │ +252 return localIndex_; │ │ │ │ │ +253 } │ │ │ │ │ +254 │ │ │ │ │ +255 template │ │ │ │ │ +_2_5_6 inline _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_o_p_e_r_a_t_o_r size_t() const │ │ │ │ │ +257 { │ │ │ │ │ +258 return localIndex_; │ │ │ │ │ +259 } │ │ │ │ │ +260 │ │ │ │ │ +261 template │ │ │ │ │ +262 inline _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>& │ │ │ │ │ +_2_6_3 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_o_p_e_r_a_t_o_r_=(size_t index) │ │ │ │ │ +264 { │ │ │ │ │ +265 localIndex_=index; │ │ │ │ │ +266 return *this; │ │ │ │ │ +267 } │ │ │ │ │ +268 │ │ │ │ │ +269 template │ │ │ │ │ +_2_7_0 inline bool _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_i_s_P_u_b_l_i_c() const │ │ │ │ │ +271 { │ │ │ │ │ +272 return static_cast(public_); │ │ │ │ │ +273 } │ │ │ │ │ +274 │ │ │ │ │ +275 template │ │ │ │ │ +_2_7_6 inline _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_s_t_a_t_e() const │ │ │ │ │ +277 { │ │ │ │ │ +278 return _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e(state_); │ │ │ │ │ +279 } │ │ │ │ │ +280 │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 inline void _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>_:_:_s_e_t_S_t_a_t_e(const _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e& state) │ │ │ │ │ +283 { │ │ │ │ │ +284 state_=static_cast(state); │ │ │ │ │ +285 } │ │ │ │ │ +286 │ │ │ │ │ +287#if HAVE_MPI │ │ │ │ │ +288 │ │ │ │ │ +289 template │ │ │ │ │ +_2_9_0 MPI_Datatype _M_P_I_T_r_a_i_t_s_<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_> >::getType() │ │ │ │ │ +291 { │ │ │ │ │ +292 │ │ │ │ │ +293 if(type==MPI_DATATYPE_NULL) { │ │ │ │ │ +294 int length = 1; │ │ │ │ │ +295 MPI_Aint base, disp; │ │ │ │ │ +296 MPI_Datatype types[1] = {_M_P_I_T_r_a_i_t_s_<_c_h_a_r_>_:_:_g_e_t_T_y_p_e()}; │ │ │ │ │ +297 _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_> rep; │ │ │ │ │ +298 MPI_Get_address(&rep, &base); │ │ │ │ │ +299 MPI_Get_address(&(rep.attribute_), &disp); │ │ │ │ │ +300 disp -= base; │ │ │ │ │ 301 │ │ │ │ │ -306 template │ │ │ │ │ -_3_0_7 inline void _h_a_s_h___c_o_m_b_i_n_e(std::size_t& seed, const T& arg) │ │ │ │ │ -308 { │ │ │ │ │ -309 hash_combiner()(seed,arg); │ │ │ │ │ -310 } │ │ │ │ │ -311 │ │ │ │ │ -313 │ │ │ │ │ -321 template │ │ │ │ │ -_3_2_2 inline std::size_t _h_a_s_h___r_a_n_g_e(It first, It last) │ │ │ │ │ -323 { │ │ │ │ │ -324 std::size_t seed = 0; │ │ │ │ │ -325 for (; first != last; ++first) │ │ │ │ │ -326 { │ │ │ │ │ -327 _h_a_s_h___c_o_m_b_i_n_e(seed,*first); │ │ │ │ │ -328 } │ │ │ │ │ -329 return seed; │ │ │ │ │ -330 } │ │ │ │ │ -331 │ │ │ │ │ -333 │ │ │ │ │ -340 template │ │ │ │ │ -_3_4_1 inline void _h_a_s_h___r_a_n_g_e(std::size_t& seed, It first, It last) │ │ │ │ │ -342 { │ │ │ │ │ -343 for (; first != last; ++first) │ │ │ │ │ -344 { │ │ │ │ │ -345 _h_a_s_h___c_o_m_b_i_n_e(seed,*first); │ │ │ │ │ -346 } │ │ │ │ │ -347 } │ │ │ │ │ -348 │ │ │ │ │ -349} // end namespace Dune │ │ │ │ │ -350 │ │ │ │ │ -351#endif // DUNE_COMMON_HASH_HH │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ +302 MPI_Datatype tmp; │ │ │ │ │ +303 MPI_Type_create_struct(1, &length, &disp, types, &tmp); │ │ │ │ │ +304 │ │ │ │ │ +305 MPI_Type_create_resized(tmp, 0, sizeof(_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_>), &type); │ │ │ │ │ +306 MPI_Type_commit(&type); │ │ │ │ │ +307 │ │ │ │ │ +308 MPI_Type_free(&tmp); │ │ │ │ │ +309 } │ │ │ │ │ +310 return type; │ │ │ │ │ +311 } │ │ │ │ │ +312 │ │ │ │ │ +313 template │ │ │ │ │ +_3_1_4 MPI_Datatype _M_P_I_T_r_a_i_t_s_<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_> >::type = MPI_DATATYPE_NULL; │ │ │ │ │ +315 │ │ │ │ │ +316#endif │ │ │ │ │ +317 │ │ │ │ │ +318 │ │ │ │ │ +320} // namespace Dune │ │ │ │ │ +321 │ │ │ │ │ +322#endif │ │ │ │ │ +_i_n_d_e_x_s_e_t_._h_h │ │ │ │ │ +Provides a map between global and local indices. │ │ │ │ │ +_l_o_c_a_l_i_n_d_e_x_._h_h │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ +_m_p_i_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for equality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for inequality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_i_s_P_u_b_l_i_c │ │ │ │ │ +bool isPublic() const │ │ │ │ │ +Check whether the index might also be known other processes. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_s_e_t_A_t_t_r_i_b_u_t_e │ │ │ │ │ +void setAttribute(const Attribute &attribute) │ │ │ │ │ +Set the attribute of the index. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_l_o_c_a_l │ │ │ │ │ +size_t local() const │ │ │ │ │ +get the local index. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:250 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e │ │ │ │ │ +LocalIndexState │ │ │ │ │ +The states available for the local indices. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_s_e_t_S_t_a_t_e │ │ │ │ │ +void setState(const LocalIndexState &state) │ │ │ │ │ +Set the state. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +ParallelLocalIndex< Attribute > & operator=(size_t index) │ │ │ │ │ +Assign a new local index. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_s_t_a_t_e │ │ │ │ │ +LocalIndexState state() const │ │ │ │ │ +Get the state. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelLocalIndex() │ │ │ │ │ +Parameterless constructor. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:231 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ +const Attribute attribute() const │ │ │ │ │ +Get the attribute of the index. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_V_A_L_I_D │ │ │ │ │ +@ VALID │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_h_a_s_h___r_a_n_g_e │ │ │ │ │ -std::size_t hash_range(It first, It last) │ │ │ │ │ -Hashes all elements in the range [first,last) and returns the combined hash. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_h_a_s_h___c_o_m_b_i_n_e │ │ │ │ │ -void hash_combine(std::size_t &seed, const T &arg) │ │ │ │ │ -Calculates the hash value of arg and combines it in-place with seed. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_h_a_s_h │ │ │ │ │ -Functor for hashing objects of type T. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_h_a_s_h_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::size_t operator()(const T &t) const │ │ │ │ │ -Calculates the hash of t. │ │ │ │ │ -DDeeffiinniittiioonn hash.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s │ │ │ │ │ +A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_g_e_t_T_y_p_e │ │ │ │ │ +static MPI_Datatype getType() │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:615 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +An index present on the local process with an additional attribute flag. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +T Attribute │ │ │ │ │ +The type of the attributes. Normally this will be an enumeration like. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_C_o_m_p_a_r_a_t_o_r_<_ _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_ _T_ _>_ _>_:_:_c_o_m_p_a_r_e │ │ │ │ │ +static bool compare(const ParallelLocalIndex< T > &t1, const │ │ │ │ │ +ParallelLocalIndex< T > &t2) │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:195 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: lru.hh File Reference │ │ │ │ +dune-common: localindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,50 +65,55 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
lru.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Enumerations
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

LRU Cache Container, using an STL like interface. │ │ │ │ +

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

│ │ │ │ -
#include <list>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::lru< Key, Tp, Traits >
 LRU Cache Container. More...
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...
 
│ │ │ │

Detailed Description

│ │ │ │ -

LRU Cache Container, using an STL like interface.

│ │ │ │ -
Author
Christian Engwer
│ │ │ │ +

Provides classes for use as the local index in ParallelIndexSet.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,29 +1,31 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -lru.hh File Reference │ │ │ │ │ -LRU Cache Container, using an STL like interface. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ +localindex.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_l_r_u_<_ _K_e_y_,_ _T_p_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -  LRU Cache Container. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +  An index present on the local process. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e { _D_u_n_e_:_:_V_A_L_I_D , _D_u_n_e_:_:_D_E_L_E_T_E_D } │ │ │ │ │ +  The states available for the local indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -LRU Cache Container, using an STL like interface. │ │ │ │ │ +Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ Author │ │ │ │ │ - Christian Engwer │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: lru.hh Source File │ │ │ │ +dune-common: localindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,242 +70,117 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
lru.hh
│ │ │ │ +
localindex.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_LRU_HH
│ │ │ │ -
6#define DUNE_COMMON_LRU_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <list>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10#include <map>
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_COMMON_LOCALINDEX_HH
│ │ │ │ +
7#define DUNE_COMMON_LOCALINDEX_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <cstddef>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune
│ │ │ │ +
12{
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21
│ │ │ │ -
22 namespace {
│ │ │ │ -
23
│ │ │ │ -
24 /*
│ │ │ │ -
25 hide the default traits in an empty namespace
│ │ │ │ -
26 */
│ │ │ │ -
27 template <typename Key, typename Tp,
│ │ │ │ -
28 typename Alloc = std::allocator<Tp> >
│ │ │ │ -
29 struct _lru_default_traits
│ │ │ │ -
30 {
│ │ │ │ -
31 typedef Key key_type;
│ │ │ │ -
32 typedef Alloc allocator;
│ │ │ │ -
33 typedef std::list< std::pair<Key, Tp> > list_type;
│ │ │ │ -
34 typedef typename list_type::iterator iterator;
│ │ │ │ -
35 typedef typename std::less<key_type> cmp;
│ │ │ │ -
36 typedef std::map< key_type, iterator, cmp,
│ │ │ │ -
37 typename std::allocator_traits<allocator>::template rebind_alloc<std::pair<const key_type, iterator> > > map_type;
│ │ │ │ -
38 };
│ │ │ │ -
39
│ │ │ │ -
40 } // end empty namespace
│ │ │ │ -
41
│ │ │ │ -
49 template <typename Key, typename Tp,
│ │ │ │ -
50 typename Traits = _lru_default_traits<Key, Tp> >
│ │ │ │ -
│ │ │ │ -
51 class lru
│ │ │ │ -
52 {
│ │ │ │ -
53 typedef typename Traits::list_type list_type;
│ │ │ │ -
54 typedef typename Traits::map_type map_type;
│ │ │ │ -
55 typedef typename Traits::allocator allocator;
│ │ │ │ -
56 typedef typename map_type::iterator map_iterator;
│ │ │ │ -
57 typedef typename map_type::const_iterator const_map_iterator;
│ │ │ │ -
58
│ │ │ │ -
59 public:
│ │ │ │ -
60 typedef typename Traits::key_type key_type;
│ │ │ │ -
61 typedef typename allocator::value_type value_type;
│ │ │ │ -
62 using pointer = typename allocator::value_type*;
│ │ │ │ -
63 using const_pointer = typename allocator::value_type const*;
│ │ │ │ -
64 using const_reference = typename allocator::value_type const&;
│ │ │ │ -
65 using reference = typename allocator::value_type&;
│ │ │ │ -
66 typedef typename allocator::size_type size_type;
│ │ │ │ -
67 typedef typename list_type::iterator iterator;
│ │ │ │ -
68 typedef typename list_type::const_iterator const_iterator;
│ │ │ │ -
69
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
75 {
│ │ │ │ -
76 return _data.front().second;
│ │ │ │ -
77 }
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
84 {
│ │ │ │ -
85 return _data.front().second;
│ │ │ │ -
86 }
│ │ │ │ -
│ │ │ │ -
87
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
93 {
│ │ │ │ -
94 return _data.back().second;
│ │ │ │ -
95 }
│ │ │ │ + │ │ │ │ +
29
│ │ │ │ +
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;
│ │ │ │ +
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 };
│ │ │ │
│ │ │ │ +
94
│ │ │ │ +
95
│ │ │ │
96
│ │ │ │ +
│ │ │ │ +
97 inline const std::size_t& LocalIndex::local() const {
│ │ │ │ +
98 return localIndex_;
│ │ │ │ +
99 }
│ │ │ │ +
│ │ │ │ +
100
│ │ │ │
│ │ │ │ -
101 const_reference back ([[maybe_unused]] int i) const
│ │ │ │ -
102 {
│ │ │ │ -
103 return _data.back().second;
│ │ │ │ -
104 }
│ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
105
│ │ │ │ -
106
│ │ │ │ +
109
│ │ │ │
│ │ │ │ - │ │ │ │ -
111 {
│ │ │ │ -
112 key_type k = _data.front().first;
│ │ │ │ -
113 _data.pop_front();
│ │ │ │ -
114 _index.erase(k);
│ │ │ │ -
115 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
119 void pop_back()
│ │ │ │ -
120 {
│ │ │ │ -
121 key_type k = _data.back().first;
│ │ │ │ -
122 _data.pop_back();
│ │ │ │ -
123 _index.erase(k);
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ -
125
│ │ │ │ -
│ │ │ │ -
131 iterator find (const key_type & key)
│ │ │ │ -
132 {
│ │ │ │ -
133 const map_iterator it = _index.find(key);
│ │ │ │ -
134 if (it == _index.end()) return _data.end();
│ │ │ │ -
135 return it->second;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ -
143 const_iterator find (const key_type & key) const
│ │ │ │ -
144 {
│ │ │ │ -
145 const map_iterator it = _index.find(key);
│ │ │ │ -
146 if (it == _index.end()) return _data.end();
│ │ │ │ -
147 return it->second;
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
162 {
│ │ │ │ -
163 std::pair<key_type, value_type> x(key, data);
│ │ │ │ -
164 /* insert item as mru */
│ │ │ │ -
165 iterator it = _data.insert(_data.begin(), x);
│ │ │ │ -
166 /* store index */
│ │ │ │ -
167 _index.insert(std::make_pair(key,it));
│ │ │ │ -
168
│ │ │ │ -
169 return it->second;
│ │ │ │ -
170 }
│ │ │ │ -
│ │ │ │ -
171
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
176 {
│ │ │ │ -
177 return touch (key);
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
186 {
│ │ │ │ -
187 /* query _index for iterator */
│ │ │ │ -
188 map_iterator it = _index.find(key);
│ │ │ │ -
189 if (it == _index.end())
│ │ │ │ - │ │ │ │ -
191 "Failed to touch key " << key << ", it is not in the lru container");
│ │ │ │ -
192 /* update _data
│ │ │ │ -
193 move it to the front
│ │ │ │ -
194 */
│ │ │ │ -
195 _data.splice(_data.begin(), _data, it->second);
│ │ │ │ -
196 return it->second->second;
│ │ │ │ -
197 }
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 return _data.size();
│ │ │ │ -
205 }
│ │ │ │ -
│ │ │ │ -
206
│ │ │ │ -
│ │ │ │ -
213 void resize(size_type new_size)
│ │ │ │ -
214 {
│ │ │ │ -
215 assert(new_size <= size());
│ │ │ │ -
216
│ │ │ │ -
217 while (new_size < size())
│ │ │ │ -
218 pop_back();
│ │ │ │ -
219 }
│ │ │ │ -
│ │ │ │ -
220
│ │ │ │ -
│ │ │ │ -
224 void clear()
│ │ │ │ -
225 {
│ │ │ │ -
226 _data.clear();
│ │ │ │ -
227 _index.clear();
│ │ │ │ -
228 }
│ │ │ │ -
│ │ │ │ -
229
│ │ │ │ -
230 private:
│ │ │ │ -
231 list_type _data;
│ │ │ │ -
232 map_type _index;
│ │ │ │ -
233
│ │ │ │ -
234 };
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
236} // namespace Dune
│ │ │ │ -
237
│ │ │ │ -
238#endif // DUNE_COMMON_LRU_HH
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ + │ │ │ │ +
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
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Default exception class for range errors.
Definition exceptions.hh:254
│ │ │ │ -
LRU Cache Container.
Definition lru.hh:52
│ │ │ │ -
void pop_back()
Removes the last element.
Definition lru.hh:119
│ │ │ │ -
iterator find(const key_type &key)
Finds the element whose key is k.
Definition lru.hh:131
│ │ │ │ -
reference insert(const key_type &key)
mark data associated with key as most recent
Definition lru.hh:175
│ │ │ │ -
list_type::const_iterator const_iterator
Definition lru.hh:68
│ │ │ │ -
void resize(size_type new_size)
ensure a maximum size of the container
Definition lru.hh:213
│ │ │ │ -
allocator::size_type size_type
Definition lru.hh:66
│ │ │ │ -
list_type::iterator iterator
Definition lru.hh:67
│ │ │ │ -
allocator::value_type value_type
Definition lru.hh:61
│ │ │ │ -
const_reference front() const
Definition lru.hh:83
│ │ │ │ -
typename allocator::value_type const * const_pointer
Definition lru.hh:63
│ │ │ │ -
size_type size() const
Retrieve number of entries in the container.
Definition lru.hh:202
│ │ │ │ -
typename allocator::value_type & reference
Definition lru.hh:65
│ │ │ │ -
reference back()
Definition lru.hh:92
│ │ │ │ -
void pop_front()
Removes the first element.
Definition lru.hh:110
│ │ │ │ -
reference front()
Definition lru.hh:74
│ │ │ │ -
void clear()
Definition lru.hh:224
│ │ │ │ -
reference touch(const key_type &key)
mark data associated with key as most recent
Definition lru.hh:185
│ │ │ │ -
reference insert(const key_type &key, const_reference data)
Insert a value into the container.
Definition lru.hh:161
│ │ │ │ -
typename allocator::value_type * pointer
Definition lru.hh:62
│ │ │ │ -
const_iterator find(const key_type &key) const
Finds the element whose key is k.
Definition lru.hh:143
│ │ │ │ -
typename allocator::value_type const & const_reference
Definition lru.hh:64
│ │ │ │ -
Traits::key_type key_type
Definition lru.hh:60
│ │ │ │ -
const_reference back(int i) const
Definition lru.hh:101
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,267 +1,121 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -lru.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +localindex.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_LRU_HH │ │ │ │ │ -6#define DUNE_COMMON_LRU_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_COMMON_LOCALINDEX_HH │ │ │ │ │ +7#define DUNE_COMMON_LOCALINDEX_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e │ │ │ │ │ +12{ │ │ │ │ │ +13 │ │ │ │ │ 14 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ -21 │ │ │ │ │ -22 namespace { │ │ │ │ │ -23 │ │ │ │ │ -24 /* │ │ │ │ │ -25 hide the default traits in an empty namespace │ │ │ │ │ -26 */ │ │ │ │ │ -27 template > │ │ │ │ │ -29 struct _lru_default_traits │ │ │ │ │ -30 { │ │ │ │ │ -31 typedef Key key_type; │ │ │ │ │ -32 typedef Alloc allocator; │ │ │ │ │ -33 typedef std::list< std::pair > list_type; │ │ │ │ │ -34 typedef typename list_type::iterator iterator; │ │ │ │ │ -35 typedef typename std::less cmp; │ │ │ │ │ -36 typedef std::map< key_type, iterator, cmp, │ │ │ │ │ -37 typename std::allocator_traits::template rebind_alloc > > map_type; │ │ │ │ │ -38 }; │ │ │ │ │ -39 │ │ │ │ │ -40 } // end empty namespace │ │ │ │ │ -41 │ │ │ │ │ -49 template > │ │ │ │ │ -_5_1 class _l_r_u │ │ │ │ │ -52 { │ │ │ │ │ -53 typedef typename Traits::list_type list_type; │ │ │ │ │ -54 typedef typename Traits::map_type map_type; │ │ │ │ │ -55 typedef typename Traits::allocator allocator; │ │ │ │ │ -56 typedef typename map_type::iterator map_iterator; │ │ │ │ │ -57 typedef typename map_type::const_iterator const_map_iterator; │ │ │ │ │ -58 │ │ │ │ │ -59 public: │ │ │ │ │ -_6_0 typedef typename Traits::key_type _k_e_y___t_y_p_e; │ │ │ │ │ -_6_1 typedef typename allocator::value_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_6_2 using _p_o_i_n_t_e_r = typename allocator::value_type*; │ │ │ │ │ -_6_3 using _c_o_n_s_t___p_o_i_n_t_e_r = typename allocator::value_type const*; │ │ │ │ │ -_6_4 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = typename allocator::value_type const&; │ │ │ │ │ -_6_5 using _r_e_f_e_r_e_n_c_e = typename allocator::value_type&; │ │ │ │ │ -_6_6 typedef typename allocator::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -_6_7 typedef typename list_type::iterator _i_t_e_r_a_t_o_r; │ │ │ │ │ -_6_8 typedef typename list_type::const_iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -69 │ │ │ │ │ -_7_4 _r_e_f_e_r_e_n_c_e _f_r_o_n_t() │ │ │ │ │ -75 { │ │ │ │ │ -76 return _data.front().second; │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -_8_3 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const │ │ │ │ │ -84 { │ │ │ │ │ -85 return _data.front().second; │ │ │ │ │ -86 } │ │ │ │ │ -87 │ │ │ │ │ -_9_2 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ -93 { │ │ │ │ │ -94 return _data.back().second; │ │ │ │ │ -95 } │ │ │ │ │ +_2_8 enum _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e {_V_A_L_I_D, _D_E_L_E_T_E_D}; │ │ │ │ │ +29 │ │ │ │ │ +30 │ │ │ │ │ +_3_4 class _L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +35 { │ │ │ │ │ +36 public: │ │ │ │ │ +_4_1 _L_o_c_a_l_I_n_d_e_x() : │ │ │ │ │ +42 localIndex_(0), state_(_V_A_L_I_D){} │ │ │ │ │ +43 │ │ │ │ │ +44 │ │ │ │ │ +_4_9 _L_o_c_a_l_I_n_d_e_x(std::size_t index) : │ │ │ │ │ +50 localIndex_(index), state_(_V_A_L_I_D){} │ │ │ │ │ +55 inline const std::size_t& _l_o_c_a_l() const; │ │ │ │ │ +56 │ │ │ │ │ +60 inline operator std::size_t() const; │ │ │ │ │ +61 │ │ │ │ │ +67 inline _L_o_c_a_l_I_n_d_e_x& _o_p_e_r_a_t_o_r_=(std::size_t index); │ │ │ │ │ +68 │ │ │ │ │ +73 inline _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e _s_t_a_t_e() const; │ │ │ │ │ +74 │ │ │ │ │ +79 inline void _s_e_t_S_t_a_t_e(_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e _s_t_a_t_e); │ │ │ │ │ +80 │ │ │ │ │ +81 private: │ │ │ │ │ +83 std::size_t localIndex_; │ │ │ │ │ +84 │ │ │ │ │ +91 char state_; │ │ │ │ │ +92 │ │ │ │ │ +93 }; │ │ │ │ │ +94 │ │ │ │ │ +95 │ │ │ │ │ 96 │ │ │ │ │ -_1_0_1 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k ([[maybe_unused]] int i) const │ │ │ │ │ -102 { │ │ │ │ │ -103 return _data.back().second; │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -106 │ │ │ │ │ -_1_1_0 void _p_o_p___f_r_o_n_t() │ │ │ │ │ -111 { │ │ │ │ │ -112 _k_e_y___t_y_p_e k = _data.front().first; │ │ │ │ │ -113 _data.pop_front(); │ │ │ │ │ -114 _index.erase(k); │ │ │ │ │ -115 } │ │ │ │ │ -_1_1_9 void _p_o_p___b_a_c_k() │ │ │ │ │ -120 { │ │ │ │ │ -121 _k_e_y___t_y_p_e k = _data.back().first; │ │ │ │ │ -122 _data.pop_back(); │ │ │ │ │ -123 _index.erase(k); │ │ │ │ │ -124 } │ │ │ │ │ -125 │ │ │ │ │ -_1_3_1 _i_t_e_r_a_t_o_r _f_i_n_d (const _k_e_y___t_y_p_e & key) │ │ │ │ │ -132 { │ │ │ │ │ -133 const map_iterator it = _index.find(key); │ │ │ │ │ -134 if (it == _index.end()) return _data.end(); │ │ │ │ │ -135 return it->second; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -_1_4_3 _c_o_n_s_t___i_t_e_r_a_t_o_r _f_i_n_d (const _k_e_y___t_y_p_e & key) const │ │ │ │ │ -144 { │ │ │ │ │ -145 const map_iterator it = _index.find(key); │ │ │ │ │ -146 if (it == _index.end()) return _data.end(); │ │ │ │ │ -147 return it->second; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -_1_6_1 _r_e_f_e_r_e_n_c_e _i_n_s_e_r_t (const _k_e_y___t_y_p_e & key, _c_o_n_s_t___r_e_f_e_r_e_n_c_e data) │ │ │ │ │ -162 { │ │ │ │ │ -163 std::pair x(key, data); │ │ │ │ │ -164 /* insert item as mru */ │ │ │ │ │ -165 _i_t_e_r_a_t_o_r it = _data.insert(_data.begin(), x); │ │ │ │ │ -166 /* store index */ │ │ │ │ │ -167 _index.insert(std::make_pair(key,it)); │ │ │ │ │ -168 │ │ │ │ │ -169 return it->second; │ │ │ │ │ -170 } │ │ │ │ │ -171 │ │ │ │ │ -_1_7_5 _r_e_f_e_r_e_n_c_e _i_n_s_e_r_t (const _k_e_y___t_y_p_e & key) │ │ │ │ │ -176 { │ │ │ │ │ -177 return _t_o_u_c_h (key); │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -_1_8_5 _r_e_f_e_r_e_n_c_e _t_o_u_c_h (const _k_e_y___t_y_p_e & key) │ │ │ │ │ -186 { │ │ │ │ │ -187 /* query _index for iterator */ │ │ │ │ │ -188 map_iterator it = _index.find(key); │ │ │ │ │ -189 if (it == _index.end()) │ │ │ │ │ -190 _D_U_N_E___T_H_R_O_W(_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r, │ │ │ │ │ -191 "Failed to touch key " << key << ", it is not in the lru container"); │ │ │ │ │ -192 /* update _data │ │ │ │ │ -193 move it to the front │ │ │ │ │ -194 */ │ │ │ │ │ -195 _data.splice(_data.begin(), _data, it->second); │ │ │ │ │ -196 return it->second->second; │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -_2_0_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -203 { │ │ │ │ │ -204 return _data.size(); │ │ │ │ │ -205 } │ │ │ │ │ -206 │ │ │ │ │ -_2_1_3 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e new_size) │ │ │ │ │ -214 { │ │ │ │ │ -215 assert(new_size <= _s_i_z_e()); │ │ │ │ │ -216 │ │ │ │ │ -217 while (new_size < _s_i_z_e()) │ │ │ │ │ -218 _p_o_p___b_a_c_k(); │ │ │ │ │ -219 } │ │ │ │ │ -220 │ │ │ │ │ -_2_2_4 void _c_l_e_a_r() │ │ │ │ │ -225 { │ │ │ │ │ -226 _data.clear(); │ │ │ │ │ -227 _index.clear(); │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -230 private: │ │ │ │ │ -231 list_type _data; │ │ │ │ │ -232 map_type _index; │ │ │ │ │ -233 │ │ │ │ │ -234 }; │ │ │ │ │ -235 │ │ │ │ │ -236} // namespace Dune │ │ │ │ │ -237 │ │ │ │ │ -238#endif // DUNE_COMMON_LRU_HH │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_9_7 inline const std::size_t& _L_o_c_a_l_I_n_d_e_x_:_:_l_o_c_a_l() const { │ │ │ │ │ +98 return localIndex_; │ │ │ │ │ +99 } │ │ │ │ │ +100 │ │ │ │ │ +_1_0_1 inline LocalIndex::operator std::size_t() const { │ │ │ │ │ +102 return localIndex_; │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_5 inline _L_o_c_a_l_I_n_d_e_x& _L_o_c_a_l_I_n_d_e_x_:_:_o_p_e_r_a_t_o_r_=(std::size_t index){ │ │ │ │ │ +106 localIndex_ = index; │ │ │ │ │ +107 return *this; │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +_1_1_0 inline _L_o_c_a_l_I_n_d_e_x_S_t_a_t_e _L_o_c_a_l_I_n_d_e_x_:_:_s_t_a_t_e() const { │ │ │ │ │ +111 return static_cast<_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e>(state_); │ │ │ │ │ +112 } │ │ │ │ │ +113 │ │ │ │ │ +_1_1_4 inline void _L_o_c_a_l_I_n_d_e_x_:_:_s_e_t_S_t_a_t_e(_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e state){ │ │ │ │ │ +115 state_ = static_cast(_s_t_a_t_e); │ │ │ │ │ +116 } │ │ │ │ │ +117 │ │ │ │ │ +120} // namespace Dune │ │ │ │ │ +121 │ │ │ │ │ +122#endif │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_S_t_a_t_e │ │ │ │ │ +LocalIndexState │ │ │ │ │ +The states available for the local indices. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +LocalIndex & operator=(std::size_t index) │ │ │ │ │ +Assign a new local index. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_s_t_a_t_e │ │ │ │ │ +LocalIndexState state() const │ │ │ │ │ +Get the state. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_l_o_c_a_l │ │ │ │ │ +const std::size_t & local() const │ │ │ │ │ +get the local index. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_s_e_t_S_t_a_t_e │ │ │ │ │ +void setState(LocalIndexState state) │ │ │ │ │ +Set the state. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_V_A_L_I_D │ │ │ │ │ +@ VALID │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_D_E_L_E_T_E_D │ │ │ │ │ +@ DELETED │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:28 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u │ │ │ │ │ -LRU Cache Container. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_p_o_p___b_a_c_k │ │ │ │ │ -void pop_back() │ │ │ │ │ -Removes the last element. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_f_i_n_d │ │ │ │ │ -iterator find(const key_type &key) │ │ │ │ │ -Finds the element whose key is k. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_i_n_s_e_r_t │ │ │ │ │ -reference insert(const key_type &key) │ │ │ │ │ -mark data associated with key as most recent │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -list_type::const_iterator const_iterator │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type new_size) │ │ │ │ │ -ensure a maximum size of the container │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:213 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -allocator::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -list_type::iterator iterator │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -allocator::value_type value_type │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_f_r_o_n_t │ │ │ │ │ -const_reference front() const │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ -typename allocator::value_type const * const_pointer │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Retrieve number of entries in the container. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename allocator::value_type & reference │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_b_a_c_k │ │ │ │ │ -reference back() │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_p_o_p___f_r_o_n_t │ │ │ │ │ -void pop_front() │ │ │ │ │ -Removes the first element. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_f_r_o_n_t │ │ │ │ │ -reference front() │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_t_o_u_c_h │ │ │ │ │ -reference touch(const key_type &key) │ │ │ │ │ -mark data associated with key as most recent │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_i_n_s_e_r_t │ │ │ │ │ -reference insert(const key_type &key, const_reference data) │ │ │ │ │ -Insert a value into the container. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_p_o_i_n_t_e_r │ │ │ │ │ -typename allocator::value_type * pointer │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_f_i_n_d │ │ │ │ │ -const_iterator find(const key_type &key) const │ │ │ │ │ -Finds the element whose key is k. │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename allocator::value_type const & const_reference │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_k_e_y___t_y_p_e │ │ │ │ │ -Traits::key_type key_type │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_l_r_u_:_:_b_a_c_k │ │ │ │ │ -const_reference back(int i) const │ │ │ │ │ -DDeeffiinniittiioonn lru.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +An index present on the local process. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +LocalIndex() │ │ │ │ │ +Constructor. known to other processes. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +LocalIndex(std::size_t index) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:49 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.cc File Reference │ │ │ │ +dune-common: collectivecommunication.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,51 +65,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
debugalign.cc File Reference
│ │ │ │ +
collectivecommunication.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#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
 
ViolatedAlignmentHandlerDune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment()
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected
 
│ │ │ │ +
#include <dune/common/parallel/communication.hh>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,35 +1,12 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -debugalign.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_b_u_g_a_l_i_g_n_._h_h> │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ - static void  _D_u_n_e_:_:_d_e_f_a_u_l_t_V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t (const char │ │ │ │ │ - *_c_l_a_s_s_N_a_m_e, std::size_t expectedAlignment, const │ │ │ │ │ - void *address) │ │ │ │ │ -  default alignment violation handler │ │ │ │ │ -  │ │ │ │ │ -_V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r &  _D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r () │ │ │ │ │ -  access the handler called by _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_(_) │ │ │ │ │ -  │ │ │ │ │ - void  _D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t (const char *_c_l_a_s_s_N_a_m_e, │ │ │ │ │ - std::size_t expectedAlignment, const void *address) │ │ │ │ │ -  called when an alignment violation is detected │ │ │ │ │ -  │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +collectivecommunication.hh File Reference │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typelist.hh File Reference │ │ │ │ +dune-common: variablesizecommunicator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,93 +65,79 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
typelist.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
variablesizecommunicator.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <tuple>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ #include <utility>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <mpi.h>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/common/parallel/interface.hh>
│ │ │ │ +#include <dune/common/parallel/mpitraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::MetaType< T >
 A type that refers to another type. More...
 
struct  Dune::IsTypeList< T >
 Check if given type is a TypeList. More...
 
struct  Dune::IsTypeList< TypeList< T... > >
 Check if given type is a TypeList. More...
 
struct  Dune::IsEmptyTypeList< T >
 Check if given type is an empty TypeList. More...
struct  Dune::Concept::HasFixedSize
 
struct  Dune::TypeListSize< T >
 
struct  Dune::TypeListSize< TypeList< T... > >
 Get size of TypeList. More...
 
struct  Dune::TypeListElement< i, T >
 
struct  Dune::TypeListElement< i, TypeList< T... > >
 Get element of TypeList. More...
class  Dune::VariableSizeCommunicator< Allocator >
 A buffered communicator where the amount of data sent does not have to be known a priori. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

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

│ │ │ │ -Functions

template<class... T>
constexpr auto Dune::uniqueTypeList (TypeList< T... > list)
 Remove duplicates from a Dune::TypeList.
 
namespace  Dune::Concept
 Namespace for concepts.
 
│ │ │ │ +

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.

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,70 +1,50 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -typelist.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +variablesizecommunicator.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +A communicator that only needs to know the number of elements per index at the │ │ │ │ │ +sender side. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_c_e_p_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_t_e_r_f_a_c_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_M_e_t_a_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  A type that refers to another type. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_H_a_s_F_i_x_e_d_S_i_z_e │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t_<_ _T_ _> │ │ │ │ │ -  Check if given type is a TypeList. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t_<_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ │ -  Check if given type is a TypeList. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_E_m_p_t_y_T_y_p_e_L_i_s_t_<_ _T_ _> │ │ │ │ │ -  Check if given type is an empty TypeList. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e_<_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ │ -  Get size of TypeList. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ │ -  Get element of TypeList. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_<_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ +  A buffered communicator where the amount of data sent does not have to │ │ │ │ │ + be known a priori. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_T_y_p_e_L_i_s_t = std::tuple< _M_e_t_a_T_y_p_e< T >... > │ │ │ │ │ -  A simple type list. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_n_t_r_y___t = typename _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t< i, T >::type │ │ │ │ │ -  Shortcut for TypeListElement::type;. │ │ │ │ │ -  │ │ │ │ │ -template class Target, class TL > │ │ │ │ │ -using  _D_u_n_e_:_:_U_n_p_a_c_k_T_y_p_e_L_i_s_t___t = typename Impl::UnpackTypeList< Target, TL >:: │ │ │ │ │ - type │ │ │ │ │ -  Unpack _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ │ -  │ │ │ │ │ -template class Target, class... T> │ │ │ │ │ -using  _D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_s___t = typename Impl::UniqueTypesHelper< Target, │ │ │ │ │ - _T_y_p_e_L_i_s_t< T... > >::type │ │ │ │ │ -  Remove duplicates from a list of types. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_L_i_s_t___t = typename Impl::UniqueTypesHelper< _T_y_p_e_L_i_s_t, │ │ │ │ │ - NonUniqueTypeList >::type │ │ │ │ │ -  Remove duplicates from a _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr auto  _D_u_n_e_:_:_u_n_i_q_u_e_T_y_p_e_L_i_s_t (_T_y_p_e_L_i_s_t< T... > list) │ │ │ │ │ -  Remove duplicates from a _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ │ +namespace   _D_u_n_e_:_:_C_o_n_c_e_p_t │ │ │ │ │ +  Namespace for concepts. │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +A communicator that only needs to know the number of elements per index at the │ │ │ │ │ +sender side. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ +********** VVaarriiaabbllee DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? ffiixxeeddSSiizzee ********** │ │ │ │ │ +std::size_t fixedSize │ │ │ │ │ +The number of data items per index if it is fixed, 0 otherwise. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typelist.hh Source File │ │ │ │ +dune-common: variablesizecommunicator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,152 +70,914 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
typelist.hh
│ │ │ │ +
variablesizecommunicator.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_TYPELIST_HH
│ │ │ │ -
6#define DUNE_COMMON_TYPELIST_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the line!
│ │ │ │ +
6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_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 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 };
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ -
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;
│ │ │ │ +
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)
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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 }
│ │ │ │ +
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())
│ │ │ │ +
383 {
│ │ │ │ +
384 MPI_Comm_dup(inf.communicator(), &communicator_);
│ │ │ │ +
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;
│ │ │ │ +
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);
│ │ │ │ +
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
│ │ │ │ +
std::size_t fixedSize
The number of data items per index if it is fixed, 0 otherwise.
Definition variablesizecommunicator.hh:265
│ │ │ │ +
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ +
Infrastructure for concepts.
│ │ │ │ +
MPI_Comm communicator() const
Get the MPI Communicator.
Definition parallel/interface.hh:417
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t
Unpack Dune::TypeList.
Definition typelist.hh:210
│ │ │ │ -
constexpr auto uniqueTypeList(TypeList< T... > list)
Remove duplicates from a Dune::TypeList.
Definition typelist.hh:236
│ │ │ │ -
typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type UniqueTypes_t
Remove duplicates from a list of types.
Definition typelist.hh:220
│ │ │ │ -
typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type UniqueTypeList_t
Remove duplicates from a Dune::TypeList.
Definition typelist.hh:228
│ │ │ │ -
typename TypeListElement< i, T >::type TypeListEntry_t
Shortcut for TypeListElement<i, T>::type;.
Definition typelist.hh:171
│ │ │ │ -
A type that refers to another type.
Definition typelist.hh:33
│ │ │ │ -
T type
The referred-to type.
Definition typelist.hh:35
│ │ │ │ -
Check if given type is a TypeList.
Definition typelist.hh:100
│ │ │ │ -
Check if given type is an empty TypeList.
Definition typelist.hh:121
│ │ │ │ -
Definition typelist.hh:126
│ │ │ │ -
Definition typelist.hh:142
│ │ │ │ -
typename std::tuple_element< i, std::tuple< T... > >::type type
Export type of i-th element in TypeList.
Definition typelist.hh:157
│ │ │ │ -
type Type
Export type of i-th element in TypeList.
Definition typelist.hh:164
│ │ │ │ +
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.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,181 +1,993 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -typelist.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +variablesizecommunicator.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_TYPELIST_HH │ │ │ │ │ -6#define DUNE_COMMON_TYPELIST_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the │ │ │ │ │ +line! │ │ │ │ │ +6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ │ -13 │ │ │ │ │ -32 template │ │ │ │ │ -_3_3 struct _M_e_t_a_T_y_p_e { │ │ │ │ │ -_3_5 using _t_y_p_e = T; │ │ │ │ │ -36 }; │ │ │ │ │ -37 │ │ │ │ │ -86 template │ │ │ │ │ -_8_7 using _T_y_p_e_L_i_s_t = std::tuple...>; │ │ │ │ │ -88 │ │ │ │ │ -89 │ │ │ │ │ -90 │ │ │ │ │ -99 template │ │ │ │ │ -_1_0_0 struct _I_s_T_y_p_e_L_i_s_t : std::false_type {}; │ │ │ │ │ -101 │ │ │ │ │ -107 template │ │ │ │ │ -_1_0_8 struct _I_s_T_y_p_e_L_i_s_t<_T_y_p_e_L_i_s_t > : std::true_type {}; │ │ │ │ │ -109 │ │ │ │ │ -110 │ │ │ │ │ -111 │ │ │ │ │ -120 template │ │ │ │ │ -_1_2_1 struct _I_s_E_m_p_t_y_T_y_p_e_L_i_s_t : std::is_same > {}; │ │ │ │ │ -122 │ │ │ │ │ -123 │ │ │ │ │ -124 │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 struct _T_y_p_e_L_i_s_t_S_i_z_e {}; │ │ │ │ │ -127 │ │ │ │ │ -136 template │ │ │ │ │ -_1_3_7 struct _T_y_p_e_L_i_s_t_S_i_z_e<_T_y_p_e_L_i_s_t> : std::integral_constant {}; │ │ │ │ │ -138 │ │ │ │ │ -139 │ │ │ │ │ -140 │ │ │ │ │ -141 template │ │ │ │ │ -_1_4_2 struct _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t {}; │ │ │ │ │ -143 │ │ │ │ │ -149 template │ │ │ │ │ -_1_5_0 struct _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t> │ │ │ │ │ -151 { │ │ │ │ │ -_1_5_7 using _t_y_p_e = typename std::tuple_element>::type; │ │ │ │ │ -158 │ │ │ │ │ -_1_6_4 using _T_y_p_e = _t_y_p_e; │ │ │ │ │ -165 }; │ │ │ │ │ +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 <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_c_e_p_t_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_t_e_r_f_a_c_e_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ +25 │ │ │ │ │ +38namespace _D_u_n_e │ │ │ │ │ +39{ │ │ │ │ │ +40 │ │ │ │ │ +41namespace Concept { │ │ │ │ │ +42 │ │ │ │ │ +_4_3struct _H_a_s_F_i_x_e_d_S_i_z_e { │ │ │ │ │ +_4_4 template auto _r_e_q_u_i_r_e(H &&h) -> decltype(h.fixedSize()); │ │ │ │ │ +45}; │ │ │ │ │ +46 │ │ │ │ │ +47} // namespace Concept │ │ │ │ │ +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 │ │ │ │ │ -170 template │ │ │ │ │ -_1_7_1 using _T_y_p_e_L_i_s_t_E_n_t_r_y___t = typename _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_i_,_ _T_>_:_:_t_y_p_e; │ │ │ │ │ -172 │ │ │ │ │ -173 namespace Impl { │ │ │ │ │ -174 │ │ │ │ │ -175 template class Target, class ToDoList, class... │ │ │ │ │ -Processed> │ │ │ │ │ -176 struct UniqueTypesHelper; │ │ │ │ │ -177 │ │ │ │ │ -178 template class Target, class... Processed> │ │ │ │ │ -179 struct UniqueTypesHelper, Processed...> │ │ │ │ │ -180 { │ │ │ │ │ -181 using type = Target; │ │ │ │ │ -182 }; │ │ │ │ │ -183 │ │ │ │ │ -184 template class Target, class T0, class... T, class... │ │ │ │ │ -Processed> │ │ │ │ │ -185 struct UniqueTypesHelper, Processed...> │ │ │ │ │ -186 { │ │ │ │ │ -187 using type = std::conditional_t< │ │ │ │ │ -188 std::disjunction...>::value, │ │ │ │ │ -189 typename UniqueTypesHelper, Processed...>::type, │ │ │ │ │ -190 typename UniqueTypesHelper, T0, Processed...>:: │ │ │ │ │ -type>; │ │ │ │ │ -191 }; │ │ │ │ │ -192 │ │ │ │ │ -193 // Helper for unpacking Dune::TypeList │ │ │ │ │ -194 template class Target, class TL> │ │ │ │ │ -195 struct UnpackTypeList; │ │ │ │ │ -196 │ │ │ │ │ -197 template class Target, class... T> │ │ │ │ │ -198 struct UnpackTypeList> │ │ │ │ │ -199 { │ │ │ │ │ -200 using type = Target; │ │ │ │ │ -201 }; │ │ │ │ │ -202 │ │ │ │ │ -203 } // namespace Impl │ │ │ │ │ -204 │ │ │ │ │ -209 template class Target, class TL> │ │ │ │ │ -_2_1_0 using _U_n_p_a_c_k_T_y_p_e_L_i_s_t___t = typename Impl::UnpackTypeList::type; │ │ │ │ │ -211 │ │ │ │ │ -219 template class Target, class... T> │ │ │ │ │ -_2_2_0 using _U_n_i_q_u_e_T_y_p_e_s___t = typename Impl::UniqueTypesHelper>::type; │ │ │ │ │ +170class InterfaceTracker │ │ │ │ │ +171{ │ │ │ │ │ +172public: │ │ │ │ │ +178 InterfaceTracker(int rank, InterfaceInformation info, std::size_t │ │ │ │ │ +fixedsize=0, │ │ │ │ │ +179 bool allocateSizes=false) │ │ │ │ │ +180 : _f_i_x_e_d_S_i_z_e(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) │ │ │ │ │ +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 │ │ │ │ │ -227 template │ │ │ │ │ -_2_2_8 using _U_n_i_q_u_e_T_y_p_e_L_i_s_t___t = typename Impl::UniqueTypesHelper::type; │ │ │ │ │ -229 │ │ │ │ │ -235 template │ │ │ │ │ -_2_3_6 constexpr auto _u_n_i_q_u_e_T_y_p_e_L_i_s_t(_T_y_p_e_L_i_s_t_<_T_._._._> list) │ │ │ │ │ -237 { │ │ │ │ │ -238 return typename Impl::UniqueTypesHelper<_T_y_p_e_L_i_s_t, _T_y_p_e_L_i_s_t>::type{}; │ │ │ │ │ -239 } │ │ │ │ │ -240 │ │ │ │ │ -241 │ │ │ │ │ -242 │ │ │ │ │ -243} // namespace Dune │ │ │ │ │ -244 │ │ │ │ │ -245#endif // DUNE_COMMON_TYPELIST_HH │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t │ │ │ │ │ -std::tuple< MetaType< T >... > TypeList │ │ │ │ │ -A simple type list. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:87 │ │ │ │ │ +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 } │ │ │ │ │ +253 │ │ │ │ │ +258 std::size_t indicesLeft() const │ │ │ │ │ +259 { │ │ │ │ │ +260 return interface_.size()-index_; │ │ │ │ │ +261 } │ │ │ │ │ +_2_6_5 std::size_t _f_i_x_e_d_S_i_z_e; │ │ │ │ │ +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 > > │ │ │ │ │ +_3_3_1class _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +332{ │ │ │ │ │ +333public: │ │ │ │ │ +338 typedef std::map, │ │ │ │ │ +339 std::less, │ │ │ │ │ +_3_4_0 typename std::allocator_traits::template rebind_alloc< std:: │ │ │ │ │ +pair > > > │ │ │ │ │ +_I_n_t_e_r_f_a_c_e_M_a_p; │ │ │ │ │ +341 │ │ │ │ │ +342#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE │ │ │ │ │ +_3_4_9 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(MPI_Comm comm, const _I_n_t_e_r_f_a_c_e_M_a_p& inf) │ │ │ │ │ +350 : maxBufferSize_(32768), interface_(&inf) │ │ │ │ │ +351 { │ │ │ │ │ +352 MPI_Comm_dup(comm, &communicator_); │ │ │ │ │ +353 } │ │ │ │ │ +_3_5_8 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(const _I_n_t_e_r_f_a_c_e& inf) │ │ │ │ │ +359 : maxBufferSize_(32768), interface_(&inf.interfaces()) │ │ │ │ │ +360 { │ │ │ │ │ +361 MPI_Comm_dup(inf._c_o_m_m_u_n_i_c_a_t_o_r(), &communicator_); │ │ │ │ │ +362 } │ │ │ │ │ +363#else │ │ │ │ │ +370 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(MPI_Comm comm, _I_n_t_e_r_f_a_c_e_M_a_p& 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()) │ │ │ │ │ +383 { │ │ │ │ │ +384 MPI_Comm_dup(inf.communicator(), &communicator_); │ │ │ │ │ +385 } │ │ │ │ │ +386#endif │ │ │ │ │ +_3_9_3 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(MPI_Comm comm, const _I_n_t_e_r_f_a_c_e_M_a_p& inf, std:: │ │ │ │ │ +size_t max_buffer_size) │ │ │ │ │ +394 : maxBufferSize_(max_buffer_size), interface_(&inf) │ │ │ │ │ +395 { │ │ │ │ │ +396 MPI_Comm_dup(comm, &communicator_); │ │ │ │ │ +397 } │ │ │ │ │ +398 │ │ │ │ │ +_4_0_4 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(const _I_n_t_e_r_f_a_c_e& inf, std::size_t max_buffer_size) │ │ │ │ │ +405 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces()) │ │ │ │ │ +406 { │ │ │ │ │ +407 MPI_Comm_dup(inf._c_o_m_m_u_n_i_c_a_t_o_r(), &communicator_); │ │ │ │ │ +408 } │ │ │ │ │ +409 │ │ │ │ │ +_4_1_0 _~_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r() │ │ │ │ │ +411 { │ │ │ │ │ +412 MPI_Comm_free(&communicator_); │ │ │ │ │ +413 } │ │ │ │ │ +414 │ │ │ │ │ +_4_1_9 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r(const _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r& other) { │ │ │ │ │ +420 maxBufferSize_ = other.maxBufferSize_; │ │ │ │ │ +421 interface_ = other.interface_; │ │ │ │ │ +422 MPI_Comm_dup(other.communicator_, &communicator_); │ │ │ │ │ +423 } │ │ │ │ │ +424 │ │ │ │ │ +_4_2_9 _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r& _o_p_e_r_a_t_o_r_=(const _V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r& 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; │ │ │ │ │ +439 } │ │ │ │ │ +440 │ │ │ │ │ +460 template │ │ │ │ │ +_4_6_1 void _f_o_r_w_a_r_d(DataHandle& handle) │ │ │ │ │ +462 { │ │ │ │ │ +463 communicate(handle); │ │ │ │ │ +464 } │ │ │ │ │ +465 │ │ │ │ │ +485 template │ │ │ │ │ +_4_8_6 void _b_a_c_k_w_a_r_d(DataHandle& handle) │ │ │ │ │ +487 { │ │ │ │ │ +488 communicate(handle); │ │ │ │ │ +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 _I_n_t_e_r_f_a_c_e_M_a_p* 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 _f_i_x_e_d_S_i_z_e() │ │ │ │ │ +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, _M_P_I_T_r_a_i_t_s_<_s_t_d_:_:_s_i_z_e___t_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +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, _M_P_I_T_r_a_i_t_s_<_s_t_d_:_:_s_i_z_e___t_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +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, _M_P_I_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e_ _D_a_t_a_H_a_n_d_l_e_:_:_D_a_t_a_T_y_p_e_>_:_:_g_e_t_T_y_p_e │ │ │ │ │ +(), │ │ │ │ │ +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(), _M_P_I_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e_ _D_a_t_a_H_a_n_d_l_e_:_:_D_a_t_a_T_y_p_e_>_:_: │ │ │ │ │ +_g_e_t_T_y_p_e(), │ │ │ │ │ +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 _M_P_I_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e_ _D_a_t_a_H_a_n_d_l_e_:_:_D_a_t_a_T_y_p_e_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +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_->_s_i_z_e()==0) │ │ │ │ │ +1054 return; │ │ │ │ │ +1055 send_trackers.reserve(interface_->_s_i_z_e()); │ │ │ │ │ +1056 recv_trackers.reserve(interface_->_s_i_z_e()); │ │ │ │ │ +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_->_s_i_z_e()); │ │ │ │ │ +1082 std::vector size_recv_req(interface_->_s_i_z_e()); │ │ │ │ │ +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_->_s_i_z_e(), │ │ │ │ │ +MPI_REQUEST_NULL); │ │ │ │ │ +1090 std::vector data_recv_req(interface_->_s_i_z_e(), │ │ │ │ │ +MPI_REQUEST_NULL); │ │ │ │ │ +1091 typedef typename DataHandle::DataType DataType; │ │ │ │ │ +1092 std::vector > send_buffers(interface_->_s_i_z_e(), │ │ │ │ │ +MessageBuffer(maxBufferSize_)), │ │ │ │ │ +1093 recv_buffers(interface_->_s_i_z_e(), 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_->_s_i_z_e(); │ │ │ │ │ +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_->_s_i_z_e(); │ │ │ │ │ +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_->_s_i_z_e(), │ │ │ │ │ +MPI_REQUEST_NULL); │ │ │ │ │ +1191 std::vector recv_requests(interface_->_s_i_z_e(), │ │ │ │ │ +MPI_REQUEST_NULL); │ │ │ │ │ +1192 typedef typename DataHandle::DataType DataType; │ │ │ │ │ +1193 std::vector > │ │ │ │ │ +1194 send_buffers(interface_->_s_i_z_e(), MessageBuffer(maxBufferSize_)), │ │ │ │ │ +1195 recv_buffers(interface_->_s_i_z_e(), 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_->_s_i_z_e() == 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 │ │ │ │ │ +_f_i_x_e_d_S_i_z_e │ │ │ │ │ +std::size_t fixedSize │ │ │ │ │ +The number of data items per index if it is fixed, 0 otherwise. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:265 │ │ │ │ │ +_m_p_i_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ +_c_o_n_c_e_p_t_._h_h │ │ │ │ │ +Infrastructure for concepts. │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +MPI_Comm communicator() const │ │ │ │ │ +Get the MPI Communicator. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:417 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_U_n_p_a_c_k_T_y_p_e_L_i_s_t___t │ │ │ │ │ -typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t │ │ │ │ │ -Unpack Dune::TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_u_n_i_q_u_e_T_y_p_e_L_i_s_t │ │ │ │ │ -constexpr auto uniqueTypeList(TypeList< T... > list) │ │ │ │ │ -Remove duplicates from a Dune::TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_s___t │ │ │ │ │ -typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type │ │ │ │ │ -UniqueTypes_t │ │ │ │ │ -Remove duplicates from a list of types. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_L_i_s_t___t │ │ │ │ │ -typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type │ │ │ │ │ -UniqueTypeList_t │ │ │ │ │ -Remove duplicates from a Dune::TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_n_t_r_y___t │ │ │ │ │ -typename TypeListElement< i, T >::type TypeListEntry_t │ │ │ │ │ -Shortcut for TypeListElement::type;. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_M_e_t_a_T_y_p_e │ │ │ │ │ -A type that refers to another type. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_M_e_t_a_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ -T type │ │ │ │ │ -The referred-to type. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t │ │ │ │ │ -Check if given type is a TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_I_s_E_m_p_t_y_T_y_p_e_L_i_s_t │ │ │ │ │ -Check if given type is an empty TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -typename std::tuple_element< i, std::tuple< T... > >::type type │ │ │ │ │ -Export type of i-th element in TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -type Type │ │ │ │ │ -Export type of i-th element in TypeList. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_g_e_t_T_y_p_e │ │ │ │ │ +static MPI_Datatype getType() │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_i_z_e │ │ │ │ │ +size_t size() const │ │ │ │ │ +Get the number of entries in the interface. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e │ │ │ │ │ +Communication interface between remote and local indices. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_H_a_s_F_i_x_e_d_S_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_H_a_s_F_i_x_e_d_S_i_z_e_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(H &&h) -> decltype(h.fixedSize()) │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +A buffered communicator where the amount of data sent does not have to be known │ │ │ │ │ +a priori. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size) │ │ │ │ │ +Creates a communicator with a specific maximum buffer size. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_a_c_k_w_a_r_d │ │ │ │ │ +void backward(DataHandle &handle) │ │ │ │ │ +Communicate backwards. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:486 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_~_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +~VariableSizeCommunicator() │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf, std::size_t │ │ │ │ │ +max_buffer_size) │ │ │ │ │ +Creates a communicator with a specific maximum buffer size. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:393 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +VariableSizeCommunicator(const VariableSizeCommunicator &other) │ │ │ │ │ +Copy-constructs a communicator. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:419 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_o_r_w_a_r_d │ │ │ │ │ +void forward(DataHandle &handle) │ │ │ │ │ +Communicate forward. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other) │ │ │ │ │ +Copy-assignes a communicator. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:429 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_I_n_t_e_r_f_a_c_e_M_a_p │ │ │ │ │ +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... │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf) │ │ │ │ │ +Creates a communicator with the default maximum buffer size. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:349 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r_:_:_V_a_r_i_a_b_l_e_S_i_z_e_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +VariableSizeCommunicator(const Interface &inf) │ │ │ │ │ +Creates a communicator with the default maximum buffer size. │ │ │ │ │ +DDeeffiinniittiioonn variablesizecommunicator.hh:358 │ │ │ │ │ +_i_n_t_e_r_f_a_c_e_._h_h │ │ │ │ │ +Provides classes for building the communication interface between remote │ │ │ │ │ +indices. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: variant.hh File Reference │ │ │ │ +dune-common: mpidata.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,36 +65,61 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
variant.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
mpidata.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <variant>
│ │ │ │ + │ │ │ │ +

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

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.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class T >
auto Dune::getMPIData (T &t)
 
│ │ │ │ -
│ │ │ │ +

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 {} │ │ │ │ │ @@ -1,20 +1,44 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -variant.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +mpidata.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ +MPI calls. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _E_n_a_b_l_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _> │ │ │ │ │ + _(_)_._d_a_t_a_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_: │ │ │ │ │ + _d_e_c_a_y___t_<_ _T_ _>_:_:_v_a_l_u_e___t_y_p_e_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_g_e_t_M_P_I_D_a_t_a (T &t) │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +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 _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: variant.hh Source File │ │ │ │ +dune-common: mpidata.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,48 +70,196 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
variant.hh
│ │ │ │ +
mpidata.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_VARIANT_HH
│ │ │ │ -
6#define DUNE_COMMON_STD_VARIANT_HH
│ │ │ │ -
7
│ │ │ │ -
8#warning dune/common/std/variant.hh is deprecated and will be removed after Dune 2.8.\
│ │ │ │ -
9 Include <variant> instead
│ │ │ │ -
10
│ │ │ │ -
11#include <variant>
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Std {
│ │ │ │ -
15 using std::variant;
│ │ │ │ -
16 using std::visit;
│ │ │ │ -
17 using std::variant_size;
│ │ │ │ -
18 using std::variant_size_v;
│ │ │ │ -
19 using std::get;
│ │ │ │ -
20 using std::get_if;
│ │ │ │ -
21 using std::holds_alternative;
│ │ │ │ -
22 using std::monostate;
│ │ │ │ -
23}
│ │ │ │ -
24}
│ │ │ │ -
25
│ │ │ │ -
26#endif
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH
│ │ │ │ +
7#define DUNE_COMMON_PARALLEL_MPIDATA_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.
│ │ │ │
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
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,42 +1,217 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -variant.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpidata.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_VARIANT_HH │ │ │ │ │ -6#define DUNE_COMMON_STD_VARIANT_HH │ │ │ │ │ -7 │ │ │ │ │ -8#warning dune/common/std/variant.hh is deprecated and will be removed after │ │ │ │ │ -Dune 2.8.\ │ │ │ │ │ -9 Include instead │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14namespace Std { │ │ │ │ │ -15 using std::variant; │ │ │ │ │ -16 using std::visit; │ │ │ │ │ -17 using std::variant_size; │ │ │ │ │ -18 using std::variant_size_v; │ │ │ │ │ -19 using std::get; │ │ │ │ │ -20 using std::get_if; │ │ │ │ │ -21 using std::holds_alternative; │ │ │ │ │ -22 using std::monostate; │ │ │ │ │ -23} │ │ │ │ │ -24} │ │ │ │ │ -25 │ │ │ │ │ -26#endif │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH │ │ │ │ │ +7#define DUNE_COMMON_PARALLEL_MPIDATA_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#if HAVE_MPI │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ +17 │ │ │ │ │ +37namespace _D_u_n_e{ │ │ │ │ │ +38 │ │ │ │ │ +39 template │ │ │ │ │ +40 struct MPIData; │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 auto _g_e_t_M_P_I_D_a_t_a(T& t){ │ │ │ │ │ +44 return _M_P_I_D_a_t_a_<_T_>(t); │ │ │ │ │ +45 } │ │ │ │ │ +46 │ │ │ │ │ +47 // Default implementation for static datatypes │ │ │ │ │ +48 template │ │ │ │ │ +_4_9 struct _M_P_I_D_a_t_a │ │ │ │ │ +50 { │ │ │ │ │ +51 friend auto getMPIData(T&); │ │ │ │ │ +52 protected: │ │ │ │ │ +_5_3 T& _d_a_t_a__; │ │ │ │ │ +54 │ │ │ │ │ +_5_5 _M_P_I_D_a_t_a(T& t) │ │ │ │ │ +56 : _d_a_t_a__(t) │ │ │ │ │ +57 {} │ │ │ │ │ +58 │ │ │ │ │ +59 public: │ │ │ │ │ +_6_0 void* _p_t_r() const { │ │ │ │ │ +61 return (void*)&_d_a_t_a__; │ │ │ │ │ +62 } │ │ │ │ │ +63 │ │ │ │ │ +64 // indicates whether the datatype can be resized │ │ │ │ │ +_6_5 static constexpr bool _s_t_a_t_i_c___s_i_z_e = true; │ │ │ │ │ +66 │ │ │ │ │ +_6_7 int _s_i_z_e() const{ │ │ │ │ │ +68 return 1; │ │ │ │ │ +69 } │ │ │ │ │ +70 │ │ │ │ │ +_7_1 MPI_Datatype _t_y_p_e() const { │ │ │ │ │ +72 return _M_P_I_T_r_a_i_t_s_<_s_t_d_:_:_d_e_c_a_y___t_<_T_>>::getType(); │ │ │ │ │ +73 } │ │ │ │ │ +74 }; │ │ │ │ │ +75 │ │ │ │ │ +76 // dummy implementation for void │ │ │ │ │ +77 template<> │ │ │ │ │ +_7_8 struct _M_P_I_D_a_t_a{ │ │ │ │ │ +79 protected: │ │ │ │ │ +_8_0 _M_P_I_D_a_t_a() {} │ │ │ │ │ +81 │ │ │ │ │ +82 public: │ │ │ │ │ +_8_3 void* _p_t_r(){ │ │ │ │ │ +84 return nullptr; │ │ │ │ │ +85 } │ │ │ │ │ +_8_6 int _s_i_z_e(){ │ │ │ │ │ +87 return 0; │ │ │ │ │ +88 } │ │ │ │ │ +_8_9 void _g_e_t(){} │ │ │ │ │ +_9_0 MPI_Datatype _t_y_p_e() const{ │ │ │ │ │ +91 return MPI_INT; │ │ │ │ │ +92 } │ │ │ │ │ +93 }; │ │ │ │ │ +94 │ │ │ │ │ +95 // specializations: │ │ │ │ │ +96 // std::vector of static sized elements or std::string │ │ │ │ │ +97 template │ │ │ │ │ +_9_8 struct _M_P_I_D_a_t_a().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&); │ │ │ │ │ +_1_0_7 _M_P_I_D_a_t_a(T& t) │ │ │ │ │ +108 : _d_a_t_a__(t) │ │ │ │ │ +109 {} │ │ │ │ │ +110 public: │ │ │ │ │ +_1_1_1 static constexpr bool _s_t_a_t_i_c___s_i_z_e = std::is_const::value || !Std:: │ │ │ │ │ +is_detected_v; │ │ │ │ │ +_1_1_2 void* _p_t_r() { │ │ │ │ │ +113 return (void*) _d_a_t_a__.data(); │ │ │ │ │ +114 } │ │ │ │ │ +_1_1_5 int _s_i_z_e() { │ │ │ │ │ +116 return _d_a_t_a__.size(); │ │ │ │ │ +117 } │ │ │ │ │ +_1_1_8 MPI_Datatype _t_y_p_e() const{ │ │ │ │ │ +119 return _M_P_I_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_T_>_:_:_v_a_l_u_e___t_y_p_e>::getType(); │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +122 template │ │ │ │ │ +_1_2_3 auto /*void*/ _r_e_s_i_z_e(int _s_i_z_e) │ │ │ │ │ +124 -> std::enable_if_t::value || !Std:: │ │ │ │ │ +is_detected_v> │ │ │ │ │ +125 { │ │ │ │ │ +126 _d_a_t_a__.resize(_s_i_z_e); │ │ │ │ │ +127 } │ │ │ │ │ +128 │ │ │ │ │ +129 protected: │ │ │ │ │ +_1_3_0 T& _d_a_t_a__; │ │ │ │ │ +131 }; │ │ │ │ │ +132 │ │ │ │ │ +133} │ │ │ │ │ +134 │ │ │ │ │ +139#endif │ │ │ │ │ +140#endif │ │ │ │ │ +_m_p_i_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +_D_u_n_e_:_:_v_o_i_d___t │ │ │ │ │ +typename Impl::voider< Types... >::type void_t │ │ │ │ │ +Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. │ │ │ │ │ +DDeeffiinniittiioonn typetraits.hh:40 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t_M_P_I_D_a_t_a │ │ │ │ │ +auto getMPIData(T &t) │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s │ │ │ │ │ +A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_d_a_t_a__ │ │ │ │ │ +T & data_ │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_t_y_p_e │ │ │ │ │ +MPI_Datatype type() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_p_t_r │ │ │ │ │ +void * ptr() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_s_i_z_e │ │ │ │ │ +int size() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_s_t_a_t_i_c___s_i_z_e │ │ │ │ │ +static constexpr bool static_size │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_M_P_I_D_a_t_a │ │ │ │ │ +MPIData(T &t) │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _>_:_:_g_e_t │ │ │ │ │ +void get() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _>_:_:_M_P_I_D_a_t_a │ │ │ │ │ +MPIData() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _>_:_:_s_i_z_e │ │ │ │ │ +int size() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _>_:_:_p_t_r │ │ │ │ │ +void * ptr() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _v_o_i_d_ _>_:_:_t_y_p_e │ │ │ │ │ +MPI_Datatype type() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_M_P_I_D_a_t_a │ │ │ │ │ +MPIData(T &t) │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_p_t_r │ │ │ │ │ +void * ptr() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_s_i_z_e │ │ │ │ │ +int size() │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_d_a_t_a__ │ │ │ │ │ +T & data_ │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_r_e_s_i_z_e │ │ │ │ │ +auto resize(int size) -> std::enable_if_t::value||!Std:: │ │ │ │ │ +is_detected_v< hasResizeOp, S > > │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _s_t_d_:_:_t_u_p_l_e_<_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._d_a_t_a │ │ │ │ │ +_(_)_)_,_ _d_e_c_l_t_y_p_e_(_s_t_d_:_:_d_e_c_l_v_a_l_<_ _T_ _>_(_)_._s_i_z_e_(_)_)_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_d_e_c_a_y___t_<_ _T_ _>_:_: │ │ │ │ │ +_v_a_l_u_e___t_y_p_e_ _>_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +MPI_Datatype type() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:118 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: type_traits.hh File Reference │ │ │ │ +dune-common: mpi_collective_benchmark.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,102 +65,330 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ +Functions | │ │ │ │ Variables
│ │ │ │ -
type_traits.hh File Reference
│ │ │ │ +
mpi_collective_benchmark.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
#include <config.h>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <iomanip>
│ │ │ │ +#include <thread>
│ │ │ │ +#include <dune/common/parallel/mpihelper.hh>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include <dune/common/parametertree.hh>
│ │ │ │ +#include <dune/common/parametertreeparser.hh>
│ │ │ │ +

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

│ │ │ │ +Functions

template<class CC >
void communicate (CC &cc)
 
template<class CC >
Dune::Future< void > startCommunication (CC &cc)
 
template<class CC >
double runBlocking (CC &cc)
 
template<class CC >
double runNonblockingWait (CC &cc)
 
std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
 
std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
 
std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
 
void printHeader ()
 
void run (int s)
 
int main (int argc, char **argv)
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
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.
 
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.
 
Dune::ParameterTree options
 Benchmark for measure the possible overlap of computation and communication at MPI collective communications.
 
std::vector< std::string > all_methods
 
│ │ │ │ +

Function Documentation

│ │ │ │ + │ │ │ │ +

◆ communicate()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +template<class CC >
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
void communicate (CC & cc)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ determineOverlap()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ main()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
int main (int argc,
char ** argv 
)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ printHeader()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
void printHeader ()
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ run()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
void run (int s)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ runBlocking()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +template<class CC >
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
double runBlocking (CC & cc)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ runNonblockingActive()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())& cc,
std::chrono::duration< double > wait_time 
)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ runNonblockingSleep()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())& cc,
std::chrono::duration< double > wait_time 
)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ runNonblockingWait()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +template<class CC >
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
double runNonblockingWait (CC & cc)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ startCommunication()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +template<class CC >
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Dune::Future< void > startCommunication (CC & cc)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +

Variable Documentation

│ │ │ │ + │ │ │ │ +

◆ all_methods

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
std::vector<std::string> all_methods
│ │ │ │ +
│ │ │ │ +Initial value:
= {"allreduce",
│ │ │ │ +
"barrier",
│ │ │ │ +
"broadcast",
│ │ │ │ +
"gather",
│ │ │ │ +
"allgather",
│ │ │ │ +
"scatter"}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ options

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Dune::ParameterTree options
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

Benchmark for measure the possible overlap of computation and communication at MPI collective communications.

│ │ │ │ +

This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson, A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI Overlap. In Proceedings of the IEEE International Conference on Cluster Computing (CLUSTER 2002), p. 472, 2002. http://www.cs.sandia.gov/smb/overhead.html

│ │ │ │ +

The following communication times are measured: Blocking: Blocking call. E.g. MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce) call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking call followed by a busy wait until the work time has passed. Then MPI_Wait. Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where in every iteration MPI_Test is called until the work time has passed. The MPI_wait.

│ │ │ │ +

The overhead is computed as the time for the Nonblocking call plus the time for MPI_Wait. The iteration time is the time for the whole communication. The available part of the communication time(avail(%)) is computed as 1-(overhead/base_t), where base_t is the time for calling the method with wait time = 0. The overhead is determined by increasing the work time successive until it is the dominant factor in the iteration time. Then the overhead is computed as iter_t-work_t.

│ │ │ │ +

Usage: mpirun ./mpi_collective_benchmark [options]

│ │ │ │ +

options: -method: default: allreduce. possible methods: allreduce, barrier, broadcast, gather, allgather, scatter -iterations: default: 10000. Number of iterations for measure the time for one communication -allMethods: default:0. If 1 iterates over all available methods -startSize: default: n, where n is the size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes, starting with startSize. After every run the size is doubled. Finally one run is made for the whole communicator. -verbose: default: 0. If 1 prints intermediate information while determining the overhead. -threshold: default: 2. The threshold when the work time is the dominant factor in the iteration time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0. Suppress output of the header.

│ │ │ │ +

options can be set either in the options.ini file or can be pass at the command-line (-key value).

│ │ │ │ +

To get a good 'available' value for the NB_sleep communication, some MPI implementation need to spawn an extra thread. With MPICH you can activate this by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the variable is called I_MPI_ASYNC_PROGRESS. (https://software.intel.com/en-us/mpi-developer-reference-linux-asynchronous-progress-control)

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,97 +1,145 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -type_traits.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_d_:_:_n_o_n_e_s_u_c_h │ │ │ │ │ -  Type representing a lookup failure by std::detected_or and friends. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_d_:_:_c_o_n_j_u_n_c_t_i_o_n_<_ _B_ _> │ │ │ │ │ -  forms the logical conjunction of the type traits B... _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_d_:_:_d_i_s_j_u_n_c_t_i_o_n_<_ _B_ _> │ │ │ │ │ -  forms the logical disjunction of the type traits B... _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_d_:_:_n_e_g_a_t_i_o_n_<_ _B_ _> │ │ │ │ │ -  forms the logical negation of the type traits B... _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r = Impl::detector< Default, void, Op, Args... > │ │ │ │ │ -  Detects whether Op is valid and makes the result available. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d = typename _d_e_t_e_c_t_e_d___o_r< _n_o_n_e_s_u_c_h, Op, Args... >:: │ │ │ │ │ - value_t │ │ │ │ │ -  Detects whether Op is valid. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___t = typename _d_e_t_e_c_t_e_d___o_r< _n_o_n_e_s_u_c_h, Op, Args... >:: │ │ │ │ │ - type │ │ │ │ │ -  Returns Op if that is valid; otherwise returns nonesuch. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t = typename _d_e_t_e_c_t_e_d___o_r< Default, Op, Args... │ │ │ │ │ - >::type │ │ │ │ │ -  Returns Op if that is valid; otherwise returns the fallback │ │ │ │ │ - type Default. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... │ │ │ │ │ -Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t = std::is_same< Expected, _d_e_t_e_c_t_e_d___t< Op, │ │ │ │ │ - Args... > > │ │ │ │ │ -  Checks whether Op is Expected without causing an error if │ │ │ │ │ - Op is invalid. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e = std::is_convertible< Target, │ │ │ │ │ - _d_e_t_e_c_t_e_d___t< Op, Args... > > │ │ │ │ │ -  Checks whether Op is convertible to Target without causing an │ │ │ │ │ - error if Op is invalid. │ │ │ │ │ -  │ │ │ │ │ -template class Fallback, template< typename... > class │ │ │ │ │ -TargetType, typename... Args> │ │ │ │ │ -using  _D_u_n_e_:_:_d_e_t_e_c_t_e_d___o_r___f_a_l_l_b_a_c_k___t = _S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t< decltype(detail:: │ │ │ │ │ - warningIfNotDefined< _S_t_d_:_:_d_e_t_e_c_t_e_d___t< Fallback, Args... > >(std:: │ │ │ │ │ - declval< const _S_t_d_:_:_d_e_t_e_c_t_e_d___t< TargetType, Args... > * >())), │ │ │ │ │ - TargetType, Args... > │ │ │ │ │ -  This type will be either TargetType if it exists, or the │ │ │ │ │ - Fallback type. │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ + * _b_e_n_c_h_m_a_r_k │ │ │ │ │ +_F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ +mpi_collective_benchmark.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_h_e_l_p_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_i_m_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_m_e_t_e_r_t_r_e_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_m_e_t_e_r_t_r_e_e_p_a_r_s_e_r_._h_h> │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ + void  _c_o_m_m_u_n_i_c_a_t_e (CC &cc) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + _D_u_n_e_:_:_F_u_t_u_r_e< void >  _s_t_a_r_t_C_o_m_m_u_n_i_c_a_t_i_o_n (CC &cc) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + double  _r_u_n_B_l_o_c_k_i_n_g (CC &cc) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + double  _r_u_n_N_o_n_b_l_o_c_k_i_n_g_W_a_i_t (CC &cc) │ │ │ │ │ +  │ │ │ │ │ +std::tuple< double, double >  _r_u_n_N_o_n_b_l_o_c_k_i_n_g_S_l_e_e_p (decltype(_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_: │ │ │ │ │ + _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n())&cc, std::chrono::duration< │ │ │ │ │ + double > wait_time) │ │ │ │ │ +  │ │ │ │ │ +std::tuple< double, double >  _r_u_n_N_o_n_b_l_o_c_k_i_n_g_A_c_t_i_v_e (decltype(_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_: │ │ │ │ │ + _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n())&cc, std::chrono::duration< │ │ │ │ │ + double > wait_time) │ │ │ │ │ +  │ │ │ │ │ +std::tuple< double, double >  _d_e_t_e_r_m_i_n_e_O_v_e_r_l_a_p (std::function< std::tuple< │ │ │ │ │ + double, double >(std::chrono::duration< double │ │ │ │ │ + >)> fun) │ │ │ │ │   │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___v = _i_s___d_e_t_e_c_t_e_d::value │ │ │ │ │ -  Detects whether Op is valid and makes the result │ │ │ │ │ - available as a value. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... │ │ │ │ │ -Args> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t___v = │ │ │ │ │ - _i_s___d_e_t_e_c_t_e_d___e_x_a_c_t::value │ │ │ │ │ -  Convenient access to the result value of is_detected_exact. │ │ │ │ │ -  │ │ │ │ │ -template class Op, typename... Args> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e___v = │ │ │ │ │ - _i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e::value │ │ │ │ │ -  Convenient access to the result value of │ │ │ │ │ - is_detected_convertible. │ │ │ │ │ + void  _p_r_i_n_t_H_e_a_d_e_r () │ │ │ │ │ +  │ │ │ │ │ + void  _r_u_n (int s) │ │ │ │ │   │ │ │ │ │ + int  _m_a_i_n (int argc, char **argv) │ │ │ │ │ +  │ │ │ │ │ +VVaarriiaabblleess │ │ │ │ │ + _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e  _o_p_t_i_o_n_s │ │ │ │ │ + Benchmark for measure the possible overlap of │ │ │ │ │ +  computation and communication at MPI collective │ │ │ │ │ + communications. │ │ │ │ │ +  │ │ │ │ │ +std::vector< std::string >  _a_l_l___m_e_t_h_o_d_s │ │ │ │ │ +  │ │ │ │ │ +********** FFuunnccttiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? ccoommmmuunniiccaattee(()) ********** │ │ │ │ │ +template │ │ │ │ │ +void communicate ( CC &  cccc ) │ │ │ │ │ +********** _?◆_? ddeetteerrmmiinneeOOvveerrllaapp(()) ********** │ │ │ │ │ +std::tuple< double, double > ( std::function< std::tuple< double, double ffuunn ) │ │ │ │ │ +determineOverlap >(std::chrono::duration< double >)>  │ │ │ │ │ +********** _?◆_? mmaaiinn(()) ********** │ │ │ │ │ +int main ( int  aarrggcc, │ │ │ │ │ + char **  aarrggvv  │ │ │ │ │ + ) │ │ │ │ │ +********** _?◆_? pprriinnttHHeeaaddeerr(()) ********** │ │ │ │ │ +void printHeader ( ) │ │ │ │ │ +********** _?◆_? rruunn(()) ********** │ │ │ │ │ +void run ( int  ss ) │ │ │ │ │ +********** _?◆_? rruunnBBlloocckkiinngg(()) ********** │ │ │ │ │ +template │ │ │ │ │ +double runBlocking ( CC &  cccc ) │ │ │ │ │ +********** _?◆_? rruunnNNoonnbblloocckkiinnggAAccttiivvee(()) ********** │ │ │ │ │ +std::tuple< double, double > ( decltype(_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_: cccc, │ │ │ │ │ +runNonblockingActive _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n())&  │ │ │ │ │ + std::chrono::duration< double >  wwaaiitt__ttiimmee  │ │ │ │ │ + ) │ │ │ │ │ +********** _?◆_? rruunnNNoonnbblloocckkiinnggSSlleeeepp(()) ********** │ │ │ │ │ +std::tuple< double, double > ( decltype(_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_: cccc, │ │ │ │ │ +runNonblockingSleep _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n())&  │ │ │ │ │ + std::chrono::duration< double >  wwaaiitt__ttiimmee  │ │ │ │ │ + ) │ │ │ │ │ +********** _?◆_? rruunnNNoonnbblloocckkiinnggWWaaiitt(()) ********** │ │ │ │ │ +template │ │ │ │ │ +double runNonblockingWait ( CC &  cccc ) │ │ │ │ │ +********** _?◆_? ssttaarrttCCoommmmuunniiccaattiioonn(()) ********** │ │ │ │ │ +template │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e< void > startCommunication ( CC &  cccc ) │ │ │ │ │ +********** VVaarriiaabbllee DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? aallll__mmeetthhooddss ********** │ │ │ │ │ +std::vector all_methods │ │ │ │ │ +IInniittiiaall vvaalluuee:: │ │ │ │ │ += {"allreduce", │ │ │ │ │ +"barrier", │ │ │ │ │ +"broadcast", │ │ │ │ │ +"gather", │ │ │ │ │ +"allgather", │ │ │ │ │ +"scatter"} │ │ │ │ │ +********** _?◆_? ooppttiioonnss ********** │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e options │ │ │ │ │ +Benchmark for measure the possible overlap of computation and communication at │ │ │ │ │ +MPI collective communications. │ │ │ │ │ +This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson, │ │ │ │ │ +A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI │ │ │ │ │ +Overlap. In Proceedings of the IEEE International Conference on Cluster │ │ │ │ │ +Computing (CLUSTER 2002), p. 472, 2002. _h_t_t_p_:_/_/_w_w_w_._c_s_._s_a_n_d_i_a_._g_o_v_/_s_m_b_/ │ │ │ │ │ +_o_v_e_r_h_e_a_d_._h_t_m_l │ │ │ │ │ +The following communication times are measured: Blocking: Blocking call. E.g. │ │ │ │ │ +MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce) │ │ │ │ │ +call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking │ │ │ │ │ +call followed by a busy wait until the work time has passed. Then MPI_Wait. │ │ │ │ │ +Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where │ │ │ │ │ +in every iteration MPI_Test is called until the work time has passed. The │ │ │ │ │ +MPI_wait. │ │ │ │ │ +The overhead is computed as the time for the Nonblocking call plus the time for │ │ │ │ │ +MPI_Wait. The iteration time is the time for the whole communication. The │ │ │ │ │ +available part of the communication time(avail(%)) is computed as 1-(overhead/ │ │ │ │ │ +base_t), where base_t is the time for calling the method with wait time = 0. │ │ │ │ │ +The overhead is determined by increasing the work time successive until it is │ │ │ │ │ +the dominant factor in the iteration time. Then the overhead is computed as │ │ │ │ │ +iter_t-work_t. │ │ │ │ │ +Usage: mpirun ./mpi_collective_benchmark [options] │ │ │ │ │ +options: -method: default: allreduce. possible methods: allreduce, barrier, │ │ │ │ │ +broadcast, gather, allgather, scatter -iterations: default: 10000. Number of │ │ │ │ │ +iterations for measure the time for one communication -allMethods: default:0. │ │ │ │ │ +If 1 iterates over all available methods -startSize: default: n, where n is the │ │ │ │ │ +size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes, │ │ │ │ │ +starting with startSize. After every run the size is doubled. Finally one run │ │ │ │ │ +is made for the whole communicator. -verbose: default: 0. If 1 prints │ │ │ │ │ +intermediate information while determining the overhead. -threshold: default: │ │ │ │ │ +2. The threshold when the work time is the dominant factor in the iteration │ │ │ │ │ +time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0. │ │ │ │ │ +Suppress output of the header. │ │ │ │ │ +options can be set either in the options.ini file or can be pass at the │ │ │ │ │ +command-line (-key value). │ │ │ │ │ +To get a good 'available' value for the NB_sleep communication, some MPI │ │ │ │ │ +implementation need to spawn an extra thread. With MPICH you can activate this │ │ │ │ │ +by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the │ │ │ │ │ +variable is called I_MPI_ASYNC_PROGRESS. (_h_t_t_p_s_:_/_/_s_o_f_t_w_a_r_e_._i_n_t_e_l_._c_o_m_/_e_n_-_u_s_/_m_p_i_- │ │ │ │ │ +_d_e_v_e_l_o_p_e_r_-_r_e_f_e_r_e_n_c_e_-_l_i_n_u_x_-_a_s_y_n_c_h_r_o_n_o_u_s_-_p_r_o_g_r_e_s_s_-_c_o_n_t_r_o_l) │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: make_array.hh File Reference │ │ │ │ +dune-common: mpihelper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,45 +65,72 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
make_array.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
mpihelper.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <type_traits>
│ │ │ │ + │ │ │ │ +

Helpers for dealing with MPI. │ │ │ │ +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>
│ │ │ │
│ │ │ │

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.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

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

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!)

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,27 +1,62 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -make_array.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +mpihelper.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Helpers for dealing with MPI. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_i_s_i_b_i_l_i_t_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r │ │ │ │ │ +  A fake mpi helper. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_M_P_I_H_e_l_p_e_r │ │ │ │ │ +  A real mpi helper. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::array< typename std::common_type< _D_u_n_e_:_:_S_t_d_:_:_m_a_k_e___a_r_r_a_y (const Args &... │ │ │ │ │ - Args... >::type, sizeof...(Args)>  args) │ │ │ │ │ -  Create and initialize an array. │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +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 _m_a_i_n(int argc, char** argv){ │ │ │ │ │ +typedef _D_u_n_e_:_:_M_P_I_H_e_l_p_e_r MPIHelper; │ │ │ │ │ +MPIHelper::instance(argc, argv); │ │ │ │ │ +typename MPIHelper::MPICommunicator world = │ │ │ │ │ +MPIHelper::getCommunicator(); │ │ │ │ │ +... │ │ │ │ │ +_m_a_i_n │ │ │ │ │ +int main(int argc, char **argv) │ │ │ │ │ +DDeeffiinniittiioonn mpi_collective_benchmark.cc:293 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r │ │ │ │ │ +A real mpi helper. │ │ │ │ │ +DDeeffiinniittiioonn 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 _D_u_n_e_:_:_M_P_I_H_e_l_p_e_r FakeMPIHelper; │ │ │ │ │ +. │ │ │ │ │ +For checking whether we really use MPI or just fake please use MPIHelper:: │ │ │ │ │ +isFake (this is also possible at compile time!) │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: make_array.hh Source File │ │ │ │ +dune-common: mpihelper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,64 +70,267 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
make_array.hh
│ │ │ │ +
mpihelper.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_MAKE_ARRAY_HH
│ │ │ │ -
4#define DUNE_COMMON_STD_MAKE_ARRAY_HH
│ │ │ │ -
5
│ │ │ │ -
6#include <array>
│ │ │ │ -
7#include <type_traits>
│ │ │ │ -
8
│ │ │ │ -
9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ -
10#include <experimental/array>
│ │ │ │ +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#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 {
│ │ │ │ -
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 <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
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ +
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ +
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
│ │ │ │
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 {} │ │ │ │ │ @@ -1,59 +1,314 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -make_array.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpihelper.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright (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_STD_MAKE_ARRAY_HH │ │ │ │ │ -4#define DUNE_COMMON_STD_MAKE_ARRAY_HH │ │ │ │ │ -5 │ │ │ │ │ -6#include │ │ │ │ │ -7#include │ │ │ │ │ -8 │ │ │ │ │ -9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ -10#include │ │ │ │ │ +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#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 _D_u_n_e { │ │ │ │ │ -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)> │ │ │ │ │ -_4_3 _m_a_k_e___a_r_r_a_y(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 │ │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_m_a_k_e___a_r_r_a_y │ │ │ │ │ -std::array< typename std::common_type< Args... >::type, sizeof...(Args)> │ │ │ │ │ -make_array(const Args &... args) │ │ │ │ │ -Create and initialize an array. │ │ │ │ │ -DDeeffiinniittiioonn make_array.hh:43 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +16#if HAVE_MPI │ │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +19#endif │ │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_i_s_i_b_i_l_i_t_y_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +23{ │ │ │ │ │ +_7_3 class _F_a_k_e_M_P_I_H_e_l_p_e_r │ │ │ │ │ +74 { │ │ │ │ │ +75 public: │ │ │ │ │ +_8_0 constexpr static bool _i_s_F_a_k_e = true; │ │ │ │ │ +81 │ │ │ │ │ +_8_5 typedef _N_o___C_o_m_m _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +86 │ │ │ │ │ +_9_3 _D_U_N_E___E_X_P_O_R_T static _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _g_e_t_C_o_m_m_u_n_i_c_a_t_o_r () │ │ │ │ │ +94 { │ │ │ │ │ +95 static _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r comm; │ │ │ │ │ +96 return comm; │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_5 static _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _g_e_t_L_o_c_a_l_C_o_m_m_u_n_i_c_a_t_o_r () │ │ │ │ │ +106 { │ │ │ │ │ +107 return _g_e_t_C_o_m_m_u_n_i_c_a_t_o_r(); │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +110 │ │ │ │ │ +111 │ │ │ │ │ +117 [[deprecated("getCollectionCommunication is deprecated. Use │ │ │ │ │ +getCommunication instead.")]] │ │ │ │ │ +_1_1_8 static _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_> _g_e_t_C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n() │ │ │ │ │ +119 { │ │ │ │ │ +120 return _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_>(_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +123 static _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_> │ │ │ │ │ +_1_2_4 _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n() │ │ │ │ │ +125 { │ │ │ │ │ +126 return _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_>(_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +127 } │ │ │ │ │ +128 │ │ │ │ │ +_1_4_4 _D_U_N_E___E_X_P_O_R_T static _F_a_k_e_M_P_I_H_e_l_p_e_r& _i_n_s_t_a_n_c_e([[maybe_unused]] int argc, │ │ │ │ │ +145 [[maybe_unused]] char** argv) │ │ │ │ │ +146 { │ │ │ │ │ +147 return _i_n_s_t_a_n_c_e(); │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 _D_U_N_E___E_X_P_O_R_T static _F_a_k_e_M_P_I_H_e_l_p_e_r& _i_n_s_t_a_n_c_e() │ │ │ │ │ +151 { │ │ │ │ │ +152 static _F_a_k_e_M_P_I_H_e_l_p_e_r singleton; │ │ │ │ │ +153 return singleton; │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +_1_5_9 int _r_a_n_k () const { return 0; } │ │ │ │ │ +_1_6_3 int _s_i_z_e () const { return 1; } │ │ │ │ │ +164 │ │ │ │ │ +165 private: │ │ │ │ │ +166 _F_a_k_e_M_P_I_H_e_l_p_e_r() {} │ │ │ │ │ +167 FakeMPIHelper(const FakeMPIHelper&); │ │ │ │ │ +168 FakeMPIHelper& operator=(const FakeMPIHelper); │ │ │ │ │ +169 }; │ │ │ │ │ +170 │ │ │ │ │ +171#if HAVE_MPI │ │ │ │ │ +_1_7_8 class _M_P_I_H_e_l_p_e_r │ │ │ │ │ +179 { │ │ │ │ │ +180 public: │ │ │ │ │ +_1_8_5 constexpr static bool _i_s_F_a_k_e = false; │ │ │ │ │ +186 │ │ │ │ │ +_1_9_0 typedef MPI_Comm _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +191 │ │ │ │ │ +_1_9_8 static _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _g_e_t_C_o_m_m_u_n_i_c_a_t_o_r () │ │ │ │ │ +199 { │ │ │ │ │ +200 return MPI_COMM_WORLD; │ │ │ │ │ +201 } │ │ │ │ │ +202 │ │ │ │ │ +_2_0_9 static _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _g_e_t_L_o_c_a_l_C_o_m_m_u_n_i_c_a_t_o_r () │ │ │ │ │ +210 { │ │ │ │ │ +211 return MPI_COMM_SELF; │ │ │ │ │ +212 } │ │ │ │ │ +213 │ │ │ │ │ +219 [[deprecated("getCollectionCommunication is deprecated. Use │ │ │ │ │ +getCommunication instead.")]] │ │ │ │ │ +220 static _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_> │ │ │ │ │ +_2_2_1 _g_e_t_C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n() │ │ │ │ │ +222 { │ │ │ │ │ +223 return _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_>(_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +224 } │ │ │ │ │ +225 │ │ │ │ │ +226 static _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_> │ │ │ │ │ +_2_2_7 _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n() │ │ │ │ │ +228 { │ │ │ │ │ +229 return _C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r_>(_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +230 } │ │ │ │ │ +_2_4_6 _D_U_N_E___E_X_P_O_R_T static _M_P_I_H_e_l_p_e_r& _i_n_s_t_a_n_c_e(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 _M_P_I_H_e_l_p_e_r(argc,argv)); │ │ │ │ │ +254 } │ │ │ │ │ +255 return *instance_; │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +_2_5_8 _D_U_N_E___E_X_P_O_R_T static _M_P_I_H_e_l_p_e_r& _i_n_s_t_a_n_c_e() │ │ │ │ │ +259 { │ │ │ │ │ +260 if(!instance_) │ │ │ │ │ +261 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n, "MPIHelper not initialized! Call │ │ │ │ │ +MPIHelper::instance(argc, argv) with arguments first."); │ │ │ │ │ +262 return *instance_; │ │ │ │ │ +263 } │ │ │ │ │ +264 │ │ │ │ │ +_2_6_8 int _r_a_n_k () const { return rank_; } │ │ │ │ │ +_2_7_2 int _s_i_z_e () const { return size_; } │ │ │ │ │ +273 │ │ │ │ │ +_2_7_5 _~_M_P_I_H_e_l_p_e_r() │ │ │ │ │ +276 { │ │ │ │ │ +277 int wasFinalized = -1; │ │ │ │ │ +278 MPI_Finalized( &wasFinalized ); │ │ │ │ │ +279 if(!wasFinalized && initializedHere_) │ │ │ │ │ +280 { │ │ │ │ │ +281 MPI_Finalize(); │ │ │ │ │ +282 _d_v_e_r_b << "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 _d_v_e_r_b << "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 │ │ │ │ │ +_v_i_s_i_b_i_l_i_t_y_._h_h │ │ │ │ │ +Definition of macros controlling symbol visibility at the ABI level. │ │ │ │ │ +_D_U_N_E___E_X_P_O_R_T │ │ │ │ │ +#define DUNE_EXPORT │ │ │ │ │ +Export a symbol as part of the public ABI. │ │ │ │ │ +DDeeffiinniittiioonn visibility.hh:20 │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides collective communication methods for │ │ │ │ │ +sequential programs. │ │ │ │ │ +_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. │ │ │ │ │ +_s_t_d_s_t_r_e_a_m_s_._h_h │ │ │ │ │ +Standard Dune debug streams. │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_d_v_e_r_b │ │ │ │ │ +DVerbType dverb(std::cout) │ │ │ │ │ +Singleton of verbose debug stream. │ │ │ │ │ +DDeeffiinniittiioonn stdstreams.hh:116 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +Default exception if a function was called while the object is not in a valid │ │ │ │ │ +state for that function... │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_N_o___C_o_m_m │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Collective communication interface and sequential default implementation. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r │ │ │ │ │ +A fake mpi helper. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +static DUNE_EXPORT MPICommunicator getCommunicator() │ │ │ │ │ +get the default communicator │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_s_i_z_e │ │ │ │ │ +int size() const │ │ │ │ │ +return rank of process, i.e. one │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +static Communication< MPICommunicator > getCollectiveCommunication() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_g_e_t_L_o_c_a_l_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +static MPICommunicator getLocalCommunicator() │ │ │ │ │ +get a local communicator │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +No_Comm MPICommunicator │ │ │ │ │ +The type of the mpi communicator. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ +static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv) │ │ │ │ │ +Get the singleton instance of the helper. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ +static DUNE_EXPORT FakeMPIHelper & instance() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +static Communication< MPICommunicator > getCommunication() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_i_s_F_a_k_e │ │ │ │ │ +static constexpr bool isFake │ │ │ │ │ +Are we fake (i.e. pretend to have MPI support but are compiled without.) │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_a_k_e_M_P_I_H_e_l_p_e_r_:_:_r_a_n_k │ │ │ │ │ +int rank() const │ │ │ │ │ +return rank of process, i.e. zero │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r │ │ │ │ │ +A real mpi helper. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_s_i_z_e │ │ │ │ │ +int size() const │ │ │ │ │ +return number of processes │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ +static DUNE_EXPORT MPIHelper & instance() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_i_s_F_a_k_e │ │ │ │ │ +static constexpr bool isFake │ │ │ │ │ +Are we fake (i. e. pretend to have MPI support but are compiled without. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ +static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv) │ │ │ │ │ +Get the singleton instance of the helper. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +static Communication< MPICommunicator > getCommunication() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_~_M_P_I_H_e_l_p_e_r │ │ │ │ │ +~MPIHelper() │ │ │ │ │ +calls MPI_Finalize │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_r_a_n_k │ │ │ │ │ +int rank() const │ │ │ │ │ +return rank of process │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +MPI_Comm MPICommunicator │ │ │ │ │ +The type of the mpi communicator. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +static MPICommunicator getCommunicator() │ │ │ │ │ +get the default communicator │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_g_e_t_L_o_c_a_l_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +static MPICommunicator getLocalCommunicator() │ │ │ │ │ +get a local communicator │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r_:_:_g_e_t_C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +static Communication< MPICommunicator > getCollectiveCommunication() │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:221 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: apply.hh File Reference │ │ │ │ +dune-common: communicator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,36 +65,73 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces
│ │ │ │ -
apply.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <map>
│ │ │ │ +#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>
│ │ │ │
│ │ │ │

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

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ +

Provides utility classes for syncing distributed data via MPI communication.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,59 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -apply.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +communicator.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Provides utility classes for syncing distributed data via MPI communication. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_t_e_r_f_a_c_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_S_i_z_e_O_n_e │ │ │ │ │ +  Flag for marking indexed data structures where data at each index is │ │ │ │ │ + of the same size. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e │ │ │ │ │ +  Flag for marking indexed data structures where the data at each index │ │ │ │ │ + may be a variable multiple of another type. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_ _> │ │ │ │ │ +  Default policy used for communicating an indexed type. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_ _>_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_< │ │ │ │ │ + _K_,_ _n_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_ _>_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_E_r_r_o_r │ │ │ │ │ +  Error thrown if there was a problem with the communication. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_ _>_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_ _> │ │ │ │ │ +  GatherScatter default implementation that just copies data. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +  A communicator that uses buffers to gather and scatter the data to be │ │ │ │ │ + send or received. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides utility classes for syncing distributed data via MPI communication. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: apply.hh Source File │ │ │ │ +dune-common: communicator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,44 +70,1040 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
apply.hh
│ │ │ │ +
communicator.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
│ │ │ │ +
5#ifndef DUNE_COMMUNICATOR
│ │ │ │ +
6#define DUNE_COMMUNICATOR
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ +
8#if HAVE_MPI
│ │ │ │
9
│ │ │ │ -
10namespace Dune
│ │ │ │ -
11{
│ │ │ │ -
│ │ │ │ -
12 namespace Std
│ │ │ │ -
13 {
│ │ │ │ -
14
│ │ │ │ -
17 using std::apply;
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <cstddef>
│ │ │ │ +
12#include <iostream>
│ │ │ │ +
13#include <map>
│ │ │ │ +
14#include <type_traits>
│ │ │ │ +
15#include <utility>
│ │ │ │ +
16
│ │ │ │ +
17#include <mpi.h>
│ │ │ │
18
│ │ │ │ -
19 } // namespace Std
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune
│ │ │ │ +
25{
│ │ │ │ +
│ │ │ │ +
109 struct SizeOne
│ │ │ │ +
110 {};
│ │ │ │
│ │ │ │ -
20} // namespace Dune
│ │ │ │ -
21
│ │ │ │ -
22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH
│ │ │ │ +
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.
│ │ │ │ +
Standard Dune debug streams.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ +
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition stdstreams.hh:95
│ │ │ │
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.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,35 +1,1202 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -apply.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +communicator.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ +5#ifndef DUNE_COMMUNICATOR │ │ │ │ │ +6#define DUNE_COMMUNICATOR │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#if HAVE_MPI │ │ │ │ │ 9 │ │ │ │ │ -10namespace _D_u_n_e │ │ │ │ │ -11{ │ │ │ │ │ -_1_2 namespace Std │ │ │ │ │ -13 { │ │ │ │ │ -14 │ │ │ │ │ -17 using std::apply; │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ -19 } // namespace Std │ │ │ │ │ -20} // namespace Dune │ │ │ │ │ -21 │ │ │ │ │ -22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ +19#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_t_e_r_f_a_c_e_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e │ │ │ │ │ +25{ │ │ │ │ │ +_1_0_9 struct _S_i_z_e_O_n_e │ │ │ │ │ +110 {}; │ │ │ │ │ +111 │ │ │ │ │ +_1_1_7 struct _V_a_r_i_a_b_l_e_S_i_z_e │ │ │ │ │ +118 {}; │ │ │ │ │ +119 │ │ │ │ │ +120 │ │ │ │ │ +126 template │ │ │ │ │ +_1_2_7 struct _C_o_m_m_P_o_l_i_c_y │ │ │ │ │ +128 { │ │ │ │ │ +_1_4_0 typedef V _T_y_p_e; │ │ │ │ │ +141 │ │ │ │ │ +_1_4_7 typedef typename V::value_type _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +148 │ │ │ │ │ +_1_5_3 typedef _S_i_z_e_O_n_e _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +154 │ │ │ │ │ +_1_6_3 static const void* _g_e_t_A_d_d_r_e_s_s(const V& v, int index); │ │ │ │ │ +164 │ │ │ │ │ +_1_7_0 static int _g_e_t_S_i_z_e(const V&, int index); │ │ │ │ │ +171 }; │ │ │ │ │ +172 │ │ │ │ │ +_1_7_3 template class _F_i_e_l_d_V_e_c_t_o_r; │ │ │ │ │ +174 │ │ │ │ │ +_1_7_5 template class _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r; │ │ │ │ │ +176 │ │ │ │ │ +177 template │ │ │ │ │ +_1_7_8 struct _C_o_m_m_P_o_l_i_c_y<_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r<_F_i_e_l_d_V_e_c_t_o_r, A> > │ │ │ │ │ +179 { │ │ │ │ │ +_1_8_0 typedef _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _n_>, A> _T_y_p_e; │ │ │ │ │ +181 │ │ │ │ │ +_1_8_2 typedef typename Type::B _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +183 │ │ │ │ │ +_1_8_4 typedef _V_a_r_i_a_b_l_e_S_i_z_e _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +185 │ │ │ │ │ +_1_8_6 static const void* _g_e_t_A_d_d_r_e_s_s(const _T_y_p_e& v, int i); │ │ │ │ │ +187 │ │ │ │ │ +_1_8_8 static int _g_e_t_S_i_z_e(const _T_y_p_e& v, int i); │ │ │ │ │ +189 }; │ │ │ │ │ +190 │ │ │ │ │ +_1_9_4 class _C_o_m_m_u_n_i_c_a_t_i_o_n_E_r_r_o_r : public _I_O_E_r_r_o_r │ │ │ │ │ +195 {}; │ │ │ │ │ +196 │ │ │ │ │ +200 template │ │ │ │ │ +_2_0_1 struct _C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +202 { │ │ │ │ │ +_2_0_3 typedef typename _C_o_m_m_P_o_l_i_c_y_<_T_>_:_:_I_n_d_e_x_e_d_T_y_p_e _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +204 │ │ │ │ │ +_2_0_5 static const _I_n_d_e_x_e_d_T_y_p_e& _g_a_t_h_e_r(const T& vec, std::size_t i); │ │ │ │ │ +206 │ │ │ │ │ +_2_0_7 static void _s_c_a_t_t_e_r(T& vec, const _I_n_d_e_x_e_d_T_y_p_e& v, std::size_t i); │ │ │ │ │ +208 │ │ │ │ │ +209 }; │ │ │ │ │ +210 │ │ │ │ │ +222 template │ │ │ │ │ +223 class DatatypeCommunicator : public _I_n_t_e_r_f_a_c_e_B_u_i_l_d_e_r │ │ │ │ │ +224 { │ │ │ │ │ +225 public: │ │ │ │ │ +226 │ │ │ │ │ +230 typedef T _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +231 │ │ │ │ │ +235 typedef _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_<_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_> _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ +236 │ │ │ │ │ +240 typedef typename _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_G_l_o_b_a_l_I_n_d_e_x GlobalIndex; │ │ │ │ │ +241 │ │ │ │ │ +245 typedef typename _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_t_t_r_i_b_u_t_e Attribute; │ │ │ │ │ +246 │ │ │ │ │ +250 typedef typename _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_L_o_c_a_l_I_n_d_e_x _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +251 │ │ │ │ │ +255 DatatypeCommunicator(); │ │ │ │ │ +256 │ │ │ │ │ +260 ~DatatypeCommunicator(); │ │ │ │ │ +261 │ │ │ │ │ +288 template │ │ │ │ │ +289 void build(const _R_e_m_o_t_e_I_n_d_i_c_e_s& 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 _R_e_m_o_t_e_I_n_d_i_c_e_s* 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 │ │ │ │ │ +_4_5_7 class _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +458 { │ │ │ │ │ +459 │ │ │ │ │ +460 public: │ │ │ │ │ +_4_6_4 _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r(); │ │ │ │ │ +465 │ │ │ │ │ +472 template │ │ │ │ │ +473 typename std::enable_if:: │ │ │ │ │ +IndexedTypeFlag>::value, void>::type │ │ │ │ │ +_4_7_4 _b_u_i_l_d(const _I_n_t_e_r_f_a_c_e& interface); │ │ │ │ │ +475 │ │ │ │ │ +483 template │ │ │ │ │ +_4_8_4 void _b_u_i_l_d(const Data& source, const Data& target, const _I_n_t_e_r_f_a_c_e& │ │ │ │ │ +interface); │ │ │ │ │ +485 │ │ │ │ │ +514 template │ │ │ │ │ +_5_1_5 void _f_o_r_w_a_r_d(const Data& source, Data& dest); │ │ │ │ │ +516 │ │ │ │ │ +545 template │ │ │ │ │ +_5_4_6 void _b_a_c_k_w_a_r_d(Data& source, const Data& dest); │ │ │ │ │ +547 │ │ │ │ │ +573 template │ │ │ │ │ +_5_7_4 void _f_o_r_w_a_r_d(Data& data); │ │ │ │ │ +575 │ │ │ │ │ +601 template │ │ │ │ │ +_6_0_2 void _b_a_c_k_w_a_r_d(Data& data); │ │ │ │ │ +603 │ │ │ │ │ +_6_0_7 void _f_r_e_e(); │ │ │ │ │ +608 │ │ │ │ │ +_6_1_2 _~_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r(); │ │ │ │ │ +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 _I_n_t_e_r_f_a_c_e_I_n_f_o_r_m_a_t_i_o_n& info) const; │ │ │ │ │ +652 inline int operator()(const Data& data, const _I_n_t_e_r_f_a_c_e_I_n_f_o_r_m_a_t_i_o_n& 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e Type; │ │ │ │ │ +689 │ │ │ │ │ +694 typedef GatherScatter Gatherer; │ │ │ │ │ +695 │ │ │ │ │ +701 constexpr static bool _f_o_r_w_a_r_d = 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e Type; │ │ │ │ │ +722 │ │ │ │ │ +727 typedef GatherScatter Gatherer; │ │ │ │ │ +728 │ │ │ │ │ +734 constexpr static bool _f_o_r_w_a_r_d = 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e Type; │ │ │ │ │ +762 │ │ │ │ │ +767 typedef GatherScatter Scatterer; │ │ │ │ │ +768 │ │ │ │ │ +774 constexpr static bool _f_o_r_w_a_r_d = 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e Type; │ │ │ │ │ +794 │ │ │ │ │ +799 typedef GatherScatter Scatterer; │ │ │ │ │ +800 │ │ │ │ │ +806 constexpr static bool _f_o_r_w_a_r_d = 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* _C_o_m_m_P_o_l_i_c_y_<_V_>_:_:_g_e_t_A_d_d_r_e_s_s(const V& v, int index) │ │ │ │ │ +893 { │ │ │ │ │ +894 return &(v[index]); │ │ │ │ │ +895 } │ │ │ │ │ +896 │ │ │ │ │ +897 template │ │ │ │ │ +898 inline int _C_o_m_m_P_o_l_i_c_y_<_V_>_:_:_g_e_t_S_i_z_e([[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(_C_o_m_m_P_o_l_i_c_y_<_V_>_:_:_g_e_t_A_d_d_r_e_s_s(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_:_:_I_n_d_e_x_e_d_T_y_p_e>::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(_C_o_m_m_P_o_l_i_c_y_<_V_>_:_:_g_e_t_A_d_d_r_e_s_s │ │ │ │ │ +(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(_C_o_m_m_P_o_l_i_c_y_<_V_>_:_:_g_e_t_A_d_d_r_e_s_s(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 _D_U_N_E___T_H_R_O_W(CommunicationError, "A communication error occurred!"); │ │ │ │ │ +1122 │ │ │ │ │ +1123 } │ │ │ │ │ +1124 │ │ │ │ │ +1125 inline _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r() │ │ │ │ │ +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 _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_u_i_l_d(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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e)), │ │ │ │ │ +1157 MessageInformation(bufferSize_[1], │ │ │ │ │ +1158 noRecv*sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e))))); │ │ │ │ │ +1159 bufferSize_[0] += noSend; │ │ │ │ │ +1160 bufferSize_[1] += noRecv; │ │ │ │ │ +1161 } │ │ │ │ │ +1162 │ │ │ │ │ +1163 // allocate the buffers │ │ │ │ │ +1164 bufferSize_[0] *= sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e); │ │ │ │ │ +1165 bufferSize_[1] *= sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e); │ │ │ │ │ +1166 │ │ │ │ │ +1167 buffers_[0] = new char[bufferSize_[0]]; │ │ │ │ │ +1168 buffers_[1] = new char[bufferSize_[1]]; │ │ │ │ │ +1169 } │ │ │ │ │ +1170 │ │ │ │ │ +1171 template │ │ │ │ │ +1172 void _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_u_i_l_d(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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e)), │ │ │ │ │ +1193 MessageInformation(bufferSize_[1], │ │ │ │ │ +1194 noRecv*sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e))))); │ │ │ │ │ +1195 bufferSize_[0] += noSend; │ │ │ │ │ +1196 bufferSize_[1] += noRecv; │ │ │ │ │ +1197 } │ │ │ │ │ +1198 │ │ │ │ │ +1199 bufferSize_[0] *= sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e); │ │ │ │ │ +1200 bufferSize_[1] *= sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e); │ │ │ │ │ +1201 // allocate the buffers │ │ │ │ │ +1202 buffers_[0] = new char[bufferSize_[0]]; │ │ │ │ │ +1203 buffers_[1] = new char[bufferSize_[1]]; │ │ │ │ │ +1204 } │ │ │ │ │ +1205 │ │ │ │ │ +1206 inline void _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_r_e_e() │ │ │ │ │ +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 _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_~_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r() │ │ │ │ │ +1218 { │ │ │ │ │ +1219 _f_r_e_e(); │ │ │ │ │ +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 += _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_g_e_t_S_i_z_e(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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)); │ │ │ │ │ +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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)); │ │ │ │ │ +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 _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_o_r_w_a_r_d(Data& data) │ │ │ │ │ +1352 { │ │ │ │ │ +1353 this->template sendRecv(data, data); │ │ │ │ │ +1354 } │ │ │ │ │ +1355 │ │ │ │ │ +1356 │ │ │ │ │ +1357 template │ │ │ │ │ +1358 void _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_a_c_k_w_a_r_d(Data& data) │ │ │ │ │ +1359 { │ │ │ │ │ +1360 this->template sendRecv(data, data); │ │ │ │ │ +1361 } │ │ │ │ │ +1362 │ │ │ │ │ +1363 │ │ │ │ │ +1364 template │ │ │ │ │ +1365 void _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_o_r_w_a_r_d(const Data& source, Data& dest) │ │ │ │ │ +1366 { │ │ │ │ │ +1367 this->template sendRecv(source, dest); │ │ │ │ │ +1368 } │ │ │ │ │ +1369 │ │ │ │ │ +1370 │ │ │ │ │ +1371 template │ │ │ │ │ +1372 void _B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_a_c_k_w_a_r_d(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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g 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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)+info->second.second.size_ <= recvBufferSize ); │ │ │ │ │ +1428 _D_u_n_e_:_:_d_v_v_e_r_b<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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)+info->second.first.size_ <= recvBufferSize ); │ │ │ │ │ +1440 _D_u_n_e_:_:_d_v_v_e_r_b<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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)+info->second.second.size_ <= recvBufferSize ); │ │ │ │ │ +1458 _D_u_n_e_:_:_d_v_v_e_r_b<second.first.size_<<" to "<first<second.first.start_*sizeof(typename _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)+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 _C_o_m_m_P_o_l_i_c_y_<_D_a_t_a_>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e)+info->second.second.size_ <= sendBufferSize ); │ │ │ │ │ +1469 _D_u_n_e_:_:_d_v_v_e_r_b<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 │ │ │ │ │ +_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h │ │ │ │ │ +Classes describing a distributed indexset. │ │ │ │ │ +_s_t_d_s_t_r_e_a_m_s_._h_h │ │ │ │ │ +Standard Dune debug streams. │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_d_v_v_e_r_b │ │ │ │ │ +DVVerbType dvverb(std::cout) │ │ │ │ │ +stream for very verbose output. │ │ │ │ │ +DDeeffiinniittiioonn stdstreams.hh:95 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_I_O_E_r_r_o_r │ │ │ │ │ +Default exception class for I/O errors. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:231 │ │ │ │ │ +_D_u_n_e_:_:_S_i_z_e_O_n_e │ │ │ │ │ +Flag for marking indexed data structures where data at each index is of the │ │ │ │ │ +same size. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_S_i_z_e │ │ │ │ │ +Flag for marking indexed data structures where the data at each index may be a │ │ │ │ │ +variable multiple of a... │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y │ │ │ │ │ +Default policy used for communicating an indexed type. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +V::value_type IndexedType │ │ │ │ │ +The type we get at each index with operator[]. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_g_e_t_S_i_z_e │ │ │ │ │ +static int getSize(const V &, int index) │ │ │ │ │ +Get the number of primitive elements at that index. │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ +SizeOne IndexedTypeFlag │ │ │ │ │ +Whether the indexed type has variable size or there is always one value at each │ │ │ │ │ +index. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_g_e_t_A_d_d_r_e_s_s │ │ │ │ │ +static const void * getAddress(const V &v, int index) │ │ │ │ │ +Get the address of entry at an index. │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_T_y_p_e │ │ │ │ │ +V Type │ │ │ │ │ +The type the policy is for. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_,_ _A_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_S_i_z_e │ │ │ │ │ +static int getSize(const Type &v, int i) │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_,_ _A_ _>_ _>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ +VariableSize IndexedTypeFlag │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_,_ _A_ _>_ _>_:_: │ │ │ │ │ +_T_y_p_e │ │ │ │ │ +VariableBlockVector< FieldVector< K, n >, A > Type │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_,_ _A_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_A_d_d_r_e_s_s │ │ │ │ │ +static const void * getAddress(const Type &v, int i) │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_P_o_l_i_c_y_<_ _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_,_ _A_ _>_ _>_:_: │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +Type::B IndexedType │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_E_r_r_o_r │ │ │ │ │ +Error thrown if there was a problem with the communication. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +GatherScatter default implementation that just copies data. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(T &vec, const IndexedType &v, std::size_t i) │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +CommPolicy< T >::IndexedType IndexedType │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const IndexedType & gather(const T &vec, std::size_t i) │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +A communicator that uses buffers to gather and scatter the data to be send or │ │ │ │ │ +received. │ │ │ │ │ +DDeeffiinniittiioonn communicator.hh:458 │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_a_c_k_w_a_r_d │ │ │ │ │ +void backward(Data &data) │ │ │ │ │ +Backward send where target and source are the same. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +BufferedCommunicator() │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_~_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +~BufferedCommunicator() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_o_r_w_a_r_d │ │ │ │ │ +void forward(const Data &source, Data &dest) │ │ │ │ │ +Send from source to target. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +Free the allocated memory (i.e. buffers and message information. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_u_i_l_d │ │ │ │ │ +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. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_a_c_k_w_a_r_d │ │ │ │ │ +void backward(Data &source, const Data &dest) │ │ │ │ │ +Communicate in the reverse direction, i.e. send from target to source. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_b_u_i_l_d │ │ │ │ │ +void build(const Data &source, const Data &target, const Interface &interface) │ │ │ │ │ +Build the buffers and information for the communication process. │ │ │ │ │ +_D_u_n_e_:_:_B_u_f_f_e_r_e_d_C_o_m_m_u_n_i_c_a_t_o_r_:_:_f_o_r_w_a_r_d │ │ │ │ │ +void forward(Data &data) │ │ │ │ │ +Forward send where target and source are the same. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Manager class for the mapping between local indices and globally unique │ │ │ │ │ +indices. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e_B_u_i_l_d_e_r │ │ │ │ │ +Base class of all classes representing a communication interface. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +Information describing an interface. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e │ │ │ │ │ +Communication interface between remote and local indices. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +An index present on the local process. │ │ │ │ │ +DDeeffiinniittiioonn localindex.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +The indices present on remote processes. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +LocalIndex::Attribute Attribute │ │ │ │ │ +The type of the attribute. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:221 │ │ │ │ │ +_i_n_t_e_r_f_a_c_e_._h_h │ │ │ │ │ +Provides classes for building the communication interface between remote │ │ │ │ │ +indices. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: functional.hh File Reference │ │ │ │ +dune-common: communication.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,43 +65,71 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
functional.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
communication.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <functional>
│ │ │ │ + │ │ │ │ +

Implements an utility class that provides collective communication methods for sequential programs. │ │ │ │ +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>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Std::identity
 A function object type whose operator() returns its argument unchanged. More...
struct  Dune::No_Comm
 
class  Dune::Communication< Communicator >
 Collective communication interface and sequential default implementation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

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

│ │ │ │ +Functions

bool Dune::operator== (const No_Comm &, const No_Comm &)
 Comparison operator for MPI compatibility.
 
bool Dune::operator!= (const No_Comm &, const No_Comm &)
 Comparison operator for MPI compatibility.
 
│ │ │ │ -
│ │ │ │ +

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.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,49 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -functional.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +communication.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Implements an utility class that provides collective communication methods for │ │ │ │ │ +sequential programs. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_i_n_a_r_y_f_u_n_c_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_f_u_t_u_r_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y │ │ │ │ │ -  A function object type whose operator() returns its argument │ │ │ │ │ - unchanged. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_N_o___C_o_m_m │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _C_o_m_m_u_n_i_c_a_t_o_r_ _> │ │ │ │ │ +  Collective communication interface and sequential default │ │ │ │ │ + implementation. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n = _C_o_m_m_u_n_i_c_a_t_i_o_n< T > │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _N_o___C_o_m_m &, const _N_o___C_o_m_m &) │ │ │ │ │ +  Comparison operator for MPI compatibility. │ │ │ │ │ +  │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _N_o___C_o_m_m &, const _N_o___C_o_m_m &) │ │ │ │ │ +  Comparison operator for MPI compatibility. │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +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. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: functional.hh Source File │ │ │ │ +dune-common: communication.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,54 +70,417 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
functional.hh
│ │ │ │ +
communication.hh
│ │ │ │
│ │ │ │
│ │ │ │ -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:
│ │ │ │ +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_FUNCTIONAL_HH
│ │ │ │ -
6#define DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <functional>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune
│ │ │ │ -
11{
│ │ │ │ -
12
│ │ │ │ -
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
│ │ │ │ +
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{
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,49 +1,480 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -functional.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +communication.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set ts=8 sw=2 et sts=2: │ │ │ │ │ +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_FUNCTIONAL_HH │ │ │ │ │ -6#define DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10namespace _D_u_n_e │ │ │ │ │ -11{ │ │ │ │ │ -12 │ │ │ │ │ -13 namespace Std │ │ │ │ │ -14 { │ │ │ │ │ -15 │ │ │ │ │ -22#if DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ -23 using std::identity; │ │ │ │ │ -24#else //DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ -_2_5 struct _i_d_e_n_t_i_t_y { │ │ │ │ │ -26 template │ │ │ │ │ -_2_7 constexpr T&& _o_p_e_r_a_t_o_r_(_)(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 │ │ │ │ │ +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 <_d_u_n_e_/_c_o_m_m_o_n_/_b_i_n_a_r_y_f_u_n_c_t_i_o_n_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_f_u_t_u_r_e_._h_h> │ │ │ │ │ +22 │ │ │ │ │ +42namespace _D_u_n_e │ │ │ │ │ +43{ │ │ │ │ │ +44 │ │ │ │ │ +45 /* define some type that definitely differs from MPI_Comm */ │ │ │ │ │ +_4_6 struct _N_o___C_o_m_m {}; │ │ │ │ │ +47 │ │ │ │ │ +_5_2 inline bool _o_p_e_r_a_t_o_r_=_=(const _N_o___C_o_m_m&, const _N_o___C_o_m_m&) │ │ │ │ │ +53 { │ │ │ │ │ +54 return true; │ │ │ │ │ +55 } │ │ │ │ │ +56 │ │ │ │ │ +_6_1 inline bool _o_p_e_r_a_t_o_r_!_=(const _N_o___C_o_m_m&, const _N_o___C_o_m_m&) │ │ │ │ │ +62 { │ │ │ │ │ +63 return false; │ │ │ │ │ +64 } │ │ │ │ │ +65 │ │ │ │ │ +98 template │ │ │ │ │ +_9_9 class _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +100 { │ │ │ │ │ +101 public: │ │ │ │ │ +_1_0_3 _C_o_m_m_u_n_i_c_a_t_i_o_n() │ │ │ │ │ +104 {} │ │ │ │ │ +105 │ │ │ │ │ +_1_1_0 _C_o_m_m_u_n_i_c_a_t_i_o_n (const Communicator&) │ │ │ │ │ +111 {} │ │ │ │ │ +112 │ │ │ │ │ +_1_1_4 int _r_a_n_k () const │ │ │ │ │ +115 { │ │ │ │ │ +116 return 0; │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +_1_2_0 operator _N_o___C_o_m_m() const │ │ │ │ │ +121 { │ │ │ │ │ +122 return {}; │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +_1_2_6 int _s_i_z_e () const │ │ │ │ │ +127 { │ │ │ │ │ +128 return 1; │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +134 template │ │ │ │ │ +_1_3_5 int _s_e_n_d([[maybe_unused]] const T& data, │ │ │ │ │ +136 [[maybe_unused]] int dest_rank, │ │ │ │ │ +137 [[maybe_unused]] int tag) │ │ │ │ │ +138 { │ │ │ │ │ +139 _D_U_N_E___T_H_R_O_W(_P_a_r_a_l_l_e_l_E_r_r_o_r, "This method is not supported in sequential │ │ │ │ │ +programs"); │ │ │ │ │ +140 } │ │ │ │ │ +141 │ │ │ │ │ +145 template │ │ │ │ │ +_1_4_6 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_> _i_s_e_n_d([[maybe_unused]] const T&& data, │ │ │ │ │ +147 [[maybe_unused]] int dest_rank, │ │ │ │ │ +148 [[maybe_unused]] int tag) │ │ │ │ │ +149 { │ │ │ │ │ +150 _D_U_N_E___T_H_R_O_W(_P_a_r_a_l_l_e_l_E_r_r_o_r, "This method is not supported in sequential │ │ │ │ │ +programs"); │ │ │ │ │ +151 } │ │ │ │ │ +152 │ │ │ │ │ +156 template │ │ │ │ │ +_1_5_7 T _r_e_c_v([[maybe_unused]] T&& data, │ │ │ │ │ +158 [[maybe_unused]] int source_rank, │ │ │ │ │ +159 [[maybe_unused]] int tag, │ │ │ │ │ +160 [[maybe_unused]] void* status = 0) │ │ │ │ │ +161 { │ │ │ │ │ +162 _D_U_N_E___T_H_R_O_W(_P_a_r_a_l_l_e_l_E_r_r_o_r, "This method is not supported in sequential │ │ │ │ │ +programs"); │ │ │ │ │ +163 } │ │ │ │ │ +164 │ │ │ │ │ +168 template │ │ │ │ │ +_1_6_9 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_> _i_r_e_c_v([[maybe_unused]] T&& data, │ │ │ │ │ +170 [[maybe_unused]] int source_rank, │ │ │ │ │ +171 [[maybe_unused]] int tag) │ │ │ │ │ +172 { │ │ │ │ │ +173 _D_U_N_E___T_H_R_O_W(_P_a_r_a_l_l_e_l_E_r_r_o_r, "This method is not supported in sequential │ │ │ │ │ +programs"); │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +176 template │ │ │ │ │ +_1_7_7 T _r_r_e_c_v([[maybe_unused]] T&& data, │ │ │ │ │ +178 [[maybe_unused]] int source_rank, │ │ │ │ │ +179 [[maybe_unused]] int tag, │ │ │ │ │ +180 [[maybe_unused]] void* status = 0) const │ │ │ │ │ +181 { │ │ │ │ │ +182 _D_U_N_E___T_H_R_O_W(_P_a_r_a_l_l_e_l_E_r_r_o_r, "This method is not supported in sequential │ │ │ │ │ +programs"); │ │ │ │ │ +183 } │ │ │ │ │ +187 template │ │ │ │ │ +_1_8_8 T _s_u_m (const T& in) const │ │ │ │ │ +189 { │ │ │ │ │ +190 return in; │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +198 template │ │ │ │ │ +_1_9_9 int _s_u_m ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ +200 { │ │ │ │ │ +201 return 0; │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +207 template │ │ │ │ │ +_2_0_8 T _p_r_o_d (const T& in) const │ │ │ │ │ +209 { │ │ │ │ │ +210 return in; │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +218 template │ │ │ │ │ +_2_1_9 int _p_r_o_d ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ +220 { │ │ │ │ │ +221 return 0; │ │ │ │ │ +222 } │ │ │ │ │ +223 │ │ │ │ │ +227 template │ │ │ │ │ +_2_2_8 T _m_i_n (const T& in) const │ │ │ │ │ +229 { │ │ │ │ │ +230 return in; │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ +238 template │ │ │ │ │ +_2_3_9 int _m_i_n ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ +240 { │ │ │ │ │ +241 return 0; │ │ │ │ │ +242 } │ │ │ │ │ +243 │ │ │ │ │ +247 template │ │ │ │ │ +_2_4_8 T _m_a_x (const T& in) const │ │ │ │ │ +249 { │ │ │ │ │ +250 return in; │ │ │ │ │ +251 } │ │ │ │ │ +252 │ │ │ │ │ +258 template │ │ │ │ │ +_2_5_9 int _m_a_x ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ +260 { │ │ │ │ │ +261 return 0; │ │ │ │ │ +262 } │ │ │ │ │ +263 │ │ │ │ │ +_2_6_7 int _b_a_r_r_i_e_r () const │ │ │ │ │ +268 { │ │ │ │ │ +269 return 0; │ │ │ │ │ +270 } │ │ │ │ │ +271 │ │ │ │ │ +_2_7_5 _P_s_e_u_d_o_F_u_t_u_r_e_<_v_o_i_d_> _i_b_a_r_r_i_e_r () const │ │ │ │ │ +276 { │ │ │ │ │ +277 return {true}; // return a valid future │ │ │ │ │ +278 } │ │ │ │ │ +279 │ │ │ │ │ +283 template │ │ │ │ │ +_2_8_4 int _b_r_o_a_d_c_a_s_t ([[maybe_unused]] T* inout, │ │ │ │ │ +285 [[maybe_unused]] int len, │ │ │ │ │ +286 [[maybe_unused]] int root) const │ │ │ │ │ +287 { │ │ │ │ │ +288 return 0; │ │ │ │ │ +289 } │ │ │ │ │ +290 │ │ │ │ │ +294 template │ │ │ │ │ +_2_9_5 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_> _i_b_r_o_a_d_c_a_s_t(T&& data, int root) const{ │ │ │ │ │ +296 return {std::forward(data)}; │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 │ │ │ │ │ +312 template │ │ │ │ │ +_3_1_3 int _g_a_t_h_e_r (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> │ │ │ │ │ +_3_2_4 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_O_U_T_> _i_g_a_t_h_e_r(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 │ │ │ │ │ +_3_5_0 int _g_a_t_h_e_r_v (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 │ │ │ │ │ +_3_7_6 int _s_c_a_t_t_e_r (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 │ │ │ │ │ +_3_8_7 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_O_U_T_> _i_s_c_a_t_t_e_r(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 │ │ │ │ │ +_4_1_1 int _s_c_a_t_t_e_r_v (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 │ │ │ │ │ +_4_3_3 int _a_l_l_g_a_t_h_e_r(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 │ │ │ │ │ +_4_4_5 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_O_U_T_> _i_a_l_l_g_a_t_h_e_r(TIN&& data_in, TOUT&& data_out){ │ │ │ │ │ +446 return {std::forward(data_out)}; │ │ │ │ │ +447 } │ │ │ │ │ +448 │ │ │ │ │ +465 template │ │ │ │ │ +_4_6_6 int _a_l_l_g_a_t_h_e_r_v (const T* in, int sendDataLen, T* out, [[maybe_unused]] int* │ │ │ │ │ +recvDataLen, int* displ) const │ │ │ │ │ +467 { │ │ │ │ │ +468 for (int i=*displ; i │ │ │ │ │ +_4_8_6 int _a_l_l_r_e_d_u_c_e([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const │ │ │ │ │ +487 { │ │ │ │ │ +488 return 0; │ │ │ │ │ +489 } │ │ │ │ │ +490 │ │ │ │ │ +495 template │ │ │ │ │ +_4_9_6 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_O_U_T_> _i_a_l_l_r_e_d_u_c_e(TIN&& data_in, TOUT&& data_out){ │ │ │ │ │ +497 data_out = std::forward(data_in); │ │ │ │ │ +498 return {std::forward(data_out)}; │ │ │ │ │ +499 } │ │ │ │ │ +500 │ │ │ │ │ +505 template │ │ │ │ │ +_5_0_6 _P_s_e_u_d_o_F_u_t_u_r_e_<_T_> _i_a_l_l_r_e_d_u_c_e(T&& data){ │ │ │ │ │ +507 return {std::forward(data)}; │ │ │ │ │ +508 } │ │ │ │ │ +509 │ │ │ │ │ +510 │ │ │ │ │ +524 template │ │ │ │ │ +_5_2_5 int _a_l_l_r_e_d_u_c_e(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 │ │ │ │ │ +_5_3_9 using _C_o_l_l_e_c_t_i_v_e_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +540 [[deprecated("CollectiveCommunication is deprecated. Use Communication │ │ │ │ │ +instead.")]] │ │ │ │ │ +541 = _C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_>; │ │ │ │ │ +542} │ │ │ │ │ +543 │ │ │ │ │ +544#endif │ │ │ │ │ +_f_u_t_u_r_e_._h_h │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_b_i_n_a_r_y_f_u_n_c_t_i_o_n_s_._h_h │ │ │ │ │ +helper classes to provide unique types for standard functions │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for equality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for inequality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:259 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y │ │ │ │ │ -A function object type whose operator() returns its argument unchanged. │ │ │ │ │ -DDeeffiinniittiioonn functional.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -constexpr T && operator()(T &&t) const noexcept │ │ │ │ │ -DDeeffiinniittiioonn functional.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_E_r_r_o_r │ │ │ │ │ +Default exception if an error in the parallel communication of the program │ │ │ │ │ +occurred. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_N_o___C_o_m_m │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Collective communication interface and sequential default implementation. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_a_l_l_r_e_d_u_c_e │ │ │ │ │ +PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out) │ │ │ │ │ +Compute something over all processes nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:496 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_e_n_d │ │ │ │ │ +int send(const T &data, int dest_rank, int tag) │ │ │ │ │ +Sends the data to the dest_rank. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_l_l_r_e_d_u_c_e │ │ │ │ │ +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... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:525 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_m_a_x │ │ │ │ │ +T max(const T &in) const │ │ │ │ │ +Compute the maximum of the argument over all processes and return the result in │ │ │ │ │ +every process.... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_a_n_k │ │ │ │ │ +int rank() const │ │ │ │ │ +Return rank, is between 0 and size()-1. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_u_m │ │ │ │ │ +T sum(const T &in) const │ │ │ │ │ +Compute the sum of the argument over all processes and return the result in │ │ │ │ │ +every process.... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_c_a_t_t_e_r_v │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:411 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_p_r_o_d │ │ │ │ │ +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 ... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_c_v │ │ │ │ │ +T recv(T &&data, int source_rank, int tag, void *status=0) │ │ │ │ │ +Receives the data from the source_rank. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_s_e_n_d │ │ │ │ │ +PseudoFuture< T > isend(const T &&data, int dest_rank, int tag) │ │ │ │ │ +Sends the data to the dest_rank nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_b_a_r_r_i_e_r │ │ │ │ │ +PseudoFuture< void > ibarrier() const │ │ │ │ │ +Nonblocking barrier. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_l_l_r_e_d_u_c_e │ │ │ │ │ +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... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:486 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_i_z_e │ │ │ │ │ +int size() const │ │ │ │ │ +Number of processes in set, is greater than 0. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_u_m │ │ │ │ │ +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... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_l_l_g_a_t_h_e_r_v │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_m_i_n │ │ │ │ │ +T min(const T &in) const │ │ │ │ │ +Compute the minimum of the argument over all processes and return the result in │ │ │ │ │ +every process.... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_r_e_c_v │ │ │ │ │ +PseudoFuture< T > irecv(T &&data, int source_rank, int tag) │ │ │ │ │ +Receives the data from the source_rank nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_a_t_h_e_r_v │ │ │ │ │ +int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, │ │ │ │ │ +int root) const │ │ │ │ │ +Gather arrays of variable size on root task. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_b_r_o_a_d_c_a_s_t │ │ │ │ │ +PseudoFuture< T > ibroadcast(T &&data, int root) const │ │ │ │ │ +Distribute an array from the process with rank root to all other processes │ │ │ │ │ +nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_l_l_g_a_t_h_e_r │ │ │ │ │ +int allgather(const T *sbuf, int count, T *rbuf) const │ │ │ │ │ +Gathers data from all tasks and distribute it to all. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:433 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_s_c_a_t_t_e_r │ │ │ │ │ +int scatter(const T *sendData, T *recvData, int len, int root) const │ │ │ │ │ +Scatter array from a root to all other task. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:376 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_a_t_h_e_r │ │ │ │ │ +int gather(const T *in, T *out, int len, int root) const │ │ │ │ │ +Gather arrays on root task. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_a_l_l_r_e_d_u_c_e │ │ │ │ │ +PseudoFuture< T > iallreduce(T &&data) │ │ │ │ │ +Compute something over all processes nonblocking and in-place. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:506 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Communication(const Communicator &) │ │ │ │ │ +Constructor with a given communicator. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_m_a_x │ │ │ │ │ +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 ... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_p_r_o_d │ │ │ │ │ +T prod(const T &in) const │ │ │ │ │ +Compute the product of the argument over all processes and return the result in │ │ │ │ │ +every process.... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_r_o_a_d_c_a_s_t │ │ │ │ │ +int broadcast(T *inout, int len, int root) const │ │ │ │ │ +Distribute an array from the process with rank root to all other processes. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_r_e_c_v │ │ │ │ │ +T rrecv(T &&data, int source_rank, int tag, void *status=0) const │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_s_c_a_t_t_e_r │ │ │ │ │ +PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root) │ │ │ │ │ +Scatter array from a root to all other task nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:387 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_m_i_n │ │ │ │ │ +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 ... │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_a_r_r_i_e_r │ │ │ │ │ +int barrier() const │ │ │ │ │ +Wait until all processes have arrived at this point in the program. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_g_a_t_h_e_r │ │ │ │ │ +PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root) │ │ │ │ │ +Gather arrays on root task nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_a_l_l_g_a_t_h_e_r │ │ │ │ │ +PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out) │ │ │ │ │ +Gathers data from all tasks and distribute it to all nonblocking. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:445 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Communication() │ │ │ │ │ +Construct default object. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +A wrapper-class for a object which is ready immediately. │ │ │ │ │ +DDeeffiinniittiioonn future.hh:122 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: utility.hh File Reference │ │ │ │ +dune-common: selection.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,36 +65,53 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces
│ │ │ │ -
utility.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ +

Provides classes for selecting indices based on attribute flags.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,34 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -utility.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +selection.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Provides classes for selecting indices based on attribute flags. _M_o_r_e_._._. │ │ │ │ │ +#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_ _T_S_,_ _T_G_,_ _T_L_,_ _N_ _> │ │ │ │ │ +  A const iterator over an uncached selection. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_<_ _T_S_,_ _T_G_,_ _T_L_,_ _N_ _> │ │ │ │ │ +  An uncached selection of indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_<_ _T_S_,_ _T_G_,_ _T_L_,_ _N_ _> │ │ │ │ │ +  A cached selection of indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ -  Namespace for features backported from new C++ standards. │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides classes for selecting indices based on attribute flags. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: utility.hh Source File │ │ │ │ +dune-common: selection.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,49 +70,322 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
utility.hh
│ │ │ │ +
selection.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>
│ │ │ │ +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_SELECTION_HH
│ │ │ │ +
6#define DUNE_SELECTION_HH
│ │ │ │
7
│ │ │ │ -
8#warning dune/common/std/utility.hh is deprecated and will be removed after Dune 2.8.\
│ │ │ │ -
9 Include <utility> instead
│ │ │ │ +
8#include "indexset.hh"
│ │ │ │ + │ │ │ │
10
│ │ │ │
11namespace Dune
│ │ │ │
12{
│ │ │ │ -
13
│ │ │ │ -
14 namespace Std
│ │ │ │ -
15 {
│ │ │ │ -
16
│ │ │ │ -
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
│ │ │ │ -
25} // namespace Dune
│ │ │ │ -
26
│ │ │ │ -
27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH
│ │ │ │ +
27 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
29 {
│ │ │ │ +
30 public:
│ │ │ │ +
39 typedef TS AttributeSet;
│ │ │ │ +
40
│ │ │ │ + │ │ │ │ +
45
│ │ │ │ +
46 //typedef typename ParallelIndexSet::const_iterator ParallelIndexSetIterator;
│ │ │ │ +
47
│ │ │ │ +
48 typedef ConstArrayListIterator<IndexPair<TG,TL>, N, std::allocator<Dune::IndexPair<TG,TL> > > ParallelIndexSetIterator;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
55 : iter_(iter), end_(end)
│ │ │ │ +
56 {
│ │ │ │ +
57 // Step to the first valid entry
│ │ │ │ +
58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))
│ │ │ │ +
59 ++iter_;
│ │ │ │ +
60 }
│ │ │ │ +
│ │ │ │ +
61
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
63 {
│ │ │ │ +
64 assert(iter_!=end_);
│ │ │ │ +
65 for(++iter_; iter_!=end_; ++iter_)
│ │ │ │ +
66 if(AttributeSet::contains(iter_->local().attribute()))
│ │ │ │ +
67 break;
│ │ │ │ +
68 }
│ │ │ │ +
│ │ │ │ +
69
│ │ │ │ +
70
│ │ │ │ +
│ │ │ │ +
71 uint32_t operator*() const
│ │ │ │ +
72 {
│ │ │ │ +
73 return iter_->local().local();
│ │ │ │ +
74 }
│ │ │ │ +
│ │ │ │ +
75
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
77 {
│ │ │ │ +
78 return iter_ == other.iter_;
│ │ │ │ +
79 }
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
82 {
│ │ │ │ +
83 return iter_ != other.iter_;
│ │ │ │ +
84 }
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
86 private:
│ │ │ │ + │ │ │ │ +
88 const ParallelIndexSetIterator end_;
│ │ │ │ +
89 };
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
91
│ │ │ │ +
95 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
97 {
│ │ │ │ +
98 public:
│ │ │ │ +
107 typedef TS AttributeSet;
│ │ │ │ +
108
│ │ │ │ +
112 typedef TG GlobalIndex;
│ │ │ │ +
113
│ │ │ │ +
120 typedef TL LocalIndex;
│ │ │ │ +
121
│ │ │ │ + │ │ │ │ +
126
│ │ │ │ + │ │ │ │ +
131
│ │ │ │ + │ │ │ │ +
136
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
138 : indexSet_()
│ │ │ │ +
139 {}
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 : indexSet_(&indexset)
│ │ │ │ +
143 {}
│ │ │ │ +
│ │ │ │ +
148 void setIndexSet(const ParallelIndexSet& indexset);
│ │ │ │ +
149
│ │ │ │ +
153 //const ParallelIndexSet& indexSet() const;
│ │ │ │ +
154
│ │ │ │ +
159 const_iterator begin() const;
│ │ │ │ +
160
│ │ │ │ +
165 const_iterator end() const;
│ │ │ │ +
166
│ │ │ │ +
167
│ │ │ │ +
168 private:
│ │ │ │ +
169 const ParallelIndexSet* indexSet_;
│ │ │ │ +
170
│ │ │ │ +
171 };
│ │ │ │ +
│ │ │ │ +
172
│ │ │ │ +
176 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
178 {
│ │ │ │ +
179 public:
│ │ │ │ +
188 typedef TS AttributeSet;
│ │ │ │ +
189
│ │ │ │ +
193 typedef TG GlobalIndex;
│ │ │ │ +
194
│ │ │ │ +
201 typedef TL LocalIndex;
│ │ │ │ +
202
│ │ │ │ + │ │ │ │ +
207
│ │ │ │ +
211 typedef uint32_t* iterator;
│ │ │ │ +
212
│ │ │ │ +
216 typedef uint32_t* const_iterator;
│ │ │ │ +
217
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
219 : selected_()
│ │ │ │ +
220 {}
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 : selected_(), size_(0), built_(false)
│ │ │ │ +
224 {
│ │ │ │ +
225 setIndexSet(indexset);
│ │ │ │ +
226 }
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
228 ~Selection();
│ │ │ │ +
229
│ │ │ │ +
234 void setIndexSet(const ParallelIndexSet& indexset);
│ │ │ │ +
235
│ │ │ │ +
239 void free();
│ │ │ │ +
240
│ │ │ │ +
244 //IndexSet indexSet() const;
│ │ │ │ +
245
│ │ │ │ +
250 const_iterator begin() const;
│ │ │ │ +
251
│ │ │ │ +
256 const_iterator end() const;
│ │ │ │ +
257
│ │ │ │ +
258
│ │ │ │ +
259 private:
│ │ │ │ +
260 uint32_t* selected_;
│ │ │ │ +
261 size_t size_;
│ │ │ │ +
262 bool built_;
│ │ │ │ +
263
│ │ │ │ +
264 };
│ │ │ │ +
│ │ │ │ +
265
│ │ │ │ +
266 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
268 {
│ │ │ │ +
269 if(built_)
│ │ │ │ +
270 free();
│ │ │ │ +
271
│ │ │ │ +
272 // Count the number of entries the selection has to hold
│ │ │ │ + │ │ │ │ +
274 const const_iterator end = indexset.end();
│ │ │ │ +
275 int entries = 0;
│ │ │ │ +
276
│ │ │ │ +
277 for(const_iterator index = indexset.begin(); index != end; ++index)
│ │ │ │ +
278 if(AttributeSet::contains(index->local().attribute()))
│ │ │ │ +
279 ++entries;
│ │ │ │ +
280
│ │ │ │ +
281 selected_ = new uint32_t[entries];
│ │ │ │ +
282 built_ = true;
│ │ │ │ +
283
│ │ │ │ +
284 entries = 0;
│ │ │ │ +
285 for(const_iterator index = indexset.begin(); index != end; ++index)
│ │ │ │ +
286 if(AttributeSet::contains(index->local().attribute()))
│ │ │ │ +
287 selected_[entries++]= index->local().local();
│ │ │ │ +
288
│ │ │ │ +
289 size_=entries;
│ │ │ │ +
290 built_=true;
│ │ │ │ +
291 }
│ │ │ │ +
│ │ │ │ +
292
│ │ │ │ +
293 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
295 {
│ │ │ │ +
296 return selected_;
│ │ │ │ +
297 }
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
299 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 return selected_+size_;
│ │ │ │ +
303 }
│ │ │ │ +
│ │ │ │ +
304
│ │ │ │ +
305 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
307 {
│ │ │ │ +
308 delete[] selected_;
│ │ │ │ +
309 size_=0;
│ │ │ │ +
310 built_=false;
│ │ │ │ +
311 }
│ │ │ │ +
│ │ │ │ +
312
│ │ │ │ +
313 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
315 {
│ │ │ │ +
316 if(built_)
│ │ │ │ +
317 free();
│ │ │ │ +
318 }
│ │ │ │ +
│ │ │ │ +
319
│ │ │ │ +
320 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
322 {
│ │ │ │ +
323 return SelectionIterator<TS,TG,TL,N>(indexSet_->begin(),
│ │ │ │ +
324 indexSet_->end());
│ │ │ │ +
325 }
│ │ │ │ +
│ │ │ │ +
326
│ │ │ │ +
327 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
329 {
│ │ │ │ +
330 return SelectionIterator<TS,TG,TL,N>(indexSet_->end(),
│ │ │ │ +
331 indexSet_->end());
│ │ │ │ +
332 }
│ │ │ │ +
│ │ │ │ +
333 template<typename TS, typename TG, typename TL, int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
335 {
│ │ │ │ +
336 indexSet_ = &indexset;
│ │ │ │ +
337 }
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
342}
│ │ │ │ +
343#endif
│ │ │ │ +
Provides a map between global and local indices.
│ │ │ │ +
This file implements iterator facade classes for writing stl conformant iterators.
│ │ │ │ +
const_iterator end() const
Get an iterator over the selected indices.
Definition selection.hh:328
│ │ │ │ +
void setIndexSet(const ParallelIndexSet &indexset)
Set the index set of the selection.
Definition selection.hh:267
│ │ │ │ +
void setIndexSet(const ParallelIndexSet &indexset)
Set the index set of the selection.
Definition selection.hh:334
│ │ │ │ +
iterator begin()
Get an iterator over the indices positioned at the first index.
│ │ │ │ +
iterator end()
Get an iterator over the indices positioned after the last index.
│ │ │ │ +
const_iterator end() const
Get an iterator over the selected indices.
Definition selection.hh:300
│ │ │ │ +
const_iterator begin() const
Get the index set we are a selection for.
Definition selection.hh:294
│ │ │ │ +
void free()
Free allocated memory.
Definition selection.hh:306
│ │ │ │ +
const_iterator begin() const
Get the index set we are a selection for.
Definition selection.hh:321
│ │ │ │ +
~Selection()
Definition selection.hh:314
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
A constant random access iterator for the Dune::ArrayList class.
Definition arraylist.hh:370
│ │ │ │ +
Manager class for the mapping between local indices and globally unique indices.
Definition indexset.hh:218
│ │ │ │ +
A const iterator over an uncached selection.
Definition selection.hh:29
│ │ │ │ +
ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune::IndexPair< TG, TL > > > ParallelIndexSetIterator
Definition selection.hh:48
│ │ │ │ +
void operator++()
Definition selection.hh:62
│ │ │ │ +
uint32_t operator*() const
Definition selection.hh:71
│ │ │ │ +
TS AttributeSet
The type of the Set of attributes.
Definition selection.hh:39
│ │ │ │ +
Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet
The type of the underlying index set.
Definition selection.hh:44
│ │ │ │ +
SelectionIterator(const ParallelIndexSetIterator &iter, const ParallelIndexSetIterator &end)
Constructor.
Definition selection.hh:54
│ │ │ │ +
bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const
Definition selection.hh:81
│ │ │ │ +
bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const
Definition selection.hh:76
│ │ │ │ +
An uncached selection of indices.
Definition selection.hh:97
│ │ │ │ +
UncachedSelection()
Definition selection.hh:137
│ │ │ │ +
SelectionIterator< TS, TG, TL, N > iterator
The type of the iterator of the selected indices.
Definition selection.hh:130
│ │ │ │ +
TS AttributeSet
The type of the Set of attributes.
Definition selection.hh:107
│ │ │ │ +
iterator const_iterator
The type of the iterator of the selected indices.
Definition selection.hh:135
│ │ │ │ +
TG GlobalIndex
The type of the global index of the underlying index set.
Definition selection.hh:112
│ │ │ │ +
UncachedSelection(const ParallelIndexSet &indexset)
Definition selection.hh:141
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
The type of the underlying index set.
Definition selection.hh:125
│ │ │ │ +
TL LocalIndex
The type of the local index of the underlying index set.
Definition selection.hh:120
│ │ │ │ +
A cached selection of indices.
Definition selection.hh:178
│ │ │ │ +
TG GlobalIndex
The type of the global index of the underlying index set.
Definition selection.hh:193
│ │ │ │ +
Selection(const ParallelIndexSet &indexset)
Definition selection.hh:222
│ │ │ │ +
Selection()
Definition selection.hh:218
│ │ │ │ +
TL LocalIndex
The type of the local index of the underlying index set.
Definition selection.hh:201
│ │ │ │ +
TS AttributeSet
The type of the set of attributes.
Definition selection.hh:188
│ │ │ │ +
uint32_t * iterator
The type of the iterator of the selected indices.
Definition selection.hh:211
│ │ │ │ +
uint32_t * const_iterator
The type of the iterator of the selected indices.
Definition selection.hh:216
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
The type of the underlying index set.
Definition selection.hh:206
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,386 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ - * _s_t_d │ │ │ │ │ -utility.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +selection.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright (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_STD_UTILITY_HH │ │ │ │ │ -4#define DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ -5 │ │ │ │ │ -6#include │ │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +5#ifndef DUNE_SELECTION_HH │ │ │ │ │ +6#define DUNE_SELECTION_HH │ │ │ │ │ 7 │ │ │ │ │ -8#warning dune/common/std/utility.hh is deprecated and will be removed after │ │ │ │ │ -Dune 2.8.\ │ │ │ │ │ -9 Include instead │ │ │ │ │ +8#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +9#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h> │ │ │ │ │ 10 │ │ │ │ │ 11namespace _D_u_n_e │ │ │ │ │ 12{ │ │ │ │ │ -13 │ │ │ │ │ -14 namespace Std │ │ │ │ │ -15 { │ │ │ │ │ -16 │ │ │ │ │ -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 │ │ │ │ │ -25} // namespace Dune │ │ │ │ │ -26 │ │ │ │ │ -27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ +27 template │ │ │ │ │ +_2_8 class _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r │ │ │ │ │ +29 { │ │ │ │ │ +30 public: │ │ │ │ │ +_3_9 typedef TS _A_t_t_r_i_b_u_t_e_S_e_t; │ │ │ │ │ +40 │ │ │ │ │ +_4_4 typedef _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_T_G_,_T_L_,_N_> _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +45 │ │ │ │ │ +46 //typedef typename ParallelIndexSet::const_iterator │ │ │ │ │ +ParallelIndexSetIterator; │ │ │ │ │ +47 │ │ │ │ │ +_4_8 typedef _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_I_n_d_e_x_P_a_i_r_<_T_G_,_T_L_>, N, std::allocator > > _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_5_4 _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r& iter, const │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r& end) │ │ │ │ │ +55 : iter_(iter), end_(end) │ │ │ │ │ +56 { │ │ │ │ │ +57 // Step to the first valid entry │ │ │ │ │ +58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute())) │ │ │ │ │ +59 ++iter_; │ │ │ │ │ +60 } │ │ │ │ │ +61 │ │ │ │ │ +_6_2 void _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +63 { │ │ │ │ │ +64 assert(iter_!=end_); │ │ │ │ │ +65 for(++iter_; iter_!=end_; ++iter_) │ │ │ │ │ +66 if(AttributeSet::contains(iter_->local().attribute())) │ │ │ │ │ +67 break; │ │ │ │ │ +68 } │ │ │ │ │ +69 │ │ │ │ │ +70 │ │ │ │ │ +_7_1 uint32_t _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ +72 { │ │ │ │ │ +73 return iter_->local().local(); │ │ │ │ │ +74 } │ │ │ │ │ +75 │ │ │ │ │ +_7_6 bool _o_p_e_r_a_t_o_r_=_=(const _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_>& other) const │ │ │ │ │ +77 { │ │ │ │ │ +78 return iter_ == other.iter_; │ │ │ │ │ +79 } │ │ │ │ │ +80 │ │ │ │ │ +_8_1 bool _o_p_e_r_a_t_o_r_!_=(const _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_>& other) const │ │ │ │ │ +82 { │ │ │ │ │ +83 return iter_ != other.iter_; │ │ │ │ │ +84 } │ │ │ │ │ +85 │ │ │ │ │ +86 private: │ │ │ │ │ +87 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r iter_; │ │ │ │ │ +88 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r end_; │ │ │ │ │ +89 }; │ │ │ │ │ +90 │ │ │ │ │ +91 │ │ │ │ │ +95 template │ │ │ │ │ +_9_6 class _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n │ │ │ │ │ +97 { │ │ │ │ │ +98 public: │ │ │ │ │ +_1_0_7 typedef TS _A_t_t_r_i_b_u_t_e_S_e_t; │ │ │ │ │ +108 │ │ │ │ │ +_1_1_2 typedef TG _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +113 │ │ │ │ │ +_1_2_0 typedef TL _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +121 │ │ │ │ │ +_1_2_5 typedef _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_G_l_o_b_a_l_I_n_d_e_x_,_L_o_c_a_l_I_n_d_e_x_,_N_> _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +126 │ │ │ │ │ +_1_3_0 typedef _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_> _i_t_e_r_a_t_o_r; │ │ │ │ │ +131 │ │ │ │ │ +_1_3_5 typedef _i_t_e_r_a_t_o_r _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +136 │ │ │ │ │ +_1_3_7 _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n() │ │ │ │ │ +138 : indexSet_() │ │ │ │ │ +139 {} │ │ │ │ │ +140 │ │ │ │ │ +_1_4_1 _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset) │ │ │ │ │ +142 : indexSet_(&indexset) │ │ │ │ │ +143 {} │ │ │ │ │ +148 void _s_e_t_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset); │ │ │ │ │ +149 │ │ │ │ │ +153 //const ParallelIndexSet& indexSet() const; │ │ │ │ │ +154 │ │ │ │ │ +159 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +160 │ │ │ │ │ +165 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +166 │ │ │ │ │ +167 │ │ │ │ │ +168 private: │ │ │ │ │ +169 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t* indexSet_; │ │ │ │ │ +170 │ │ │ │ │ +171 }; │ │ │ │ │ +172 │ │ │ │ │ +176 template │ │ │ │ │ +_1_7_7 class _S_e_l_e_c_t_i_o_n │ │ │ │ │ +178 { │ │ │ │ │ +179 public: │ │ │ │ │ +_1_8_8 typedef TS _A_t_t_r_i_b_u_t_e_S_e_t; │ │ │ │ │ +189 │ │ │ │ │ +_1_9_3 typedef TG _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +194 │ │ │ │ │ +_2_0_1 typedef TL _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +202 │ │ │ │ │ +_2_0_6 typedef _D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_<_G_l_o_b_a_l_I_n_d_e_x_,_L_o_c_a_l_I_n_d_e_x_,_N_> _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +207 │ │ │ │ │ +_2_1_1 typedef uint32_t* _i_t_e_r_a_t_o_r; │ │ │ │ │ +212 │ │ │ │ │ +_2_1_6 typedef uint32_t* _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +217 │ │ │ │ │ +_2_1_8 _S_e_l_e_c_t_i_o_n() │ │ │ │ │ +219 : selected_() │ │ │ │ │ +220 {} │ │ │ │ │ +221 │ │ │ │ │ +_2_2_2 _S_e_l_e_c_t_i_o_n(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset) │ │ │ │ │ +223 : selected_(), size_(0), built_(false) │ │ │ │ │ +224 { │ │ │ │ │ +225 _s_e_t_I_n_d_e_x_S_e_t(indexset); │ │ │ │ │ +226 } │ │ │ │ │ +227 │ │ │ │ │ +228 _~_S_e_l_e_c_t_i_o_n(); │ │ │ │ │ +229 │ │ │ │ │ +234 void _s_e_t_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexset); │ │ │ │ │ +235 │ │ │ │ │ +239 void _f_r_e_e(); │ │ │ │ │ +240 │ │ │ │ │ +244 //IndexSet indexSet() const; │ │ │ │ │ +245 │ │ │ │ │ +250 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +251 │ │ │ │ │ +256 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +257 │ │ │ │ │ +258 │ │ │ │ │ +259 private: │ │ │ │ │ +260 uint32_t* selected_; │ │ │ │ │ +261 size_t size_; │ │ │ │ │ +262 bool built_; │ │ │ │ │ +263 │ │ │ │ │ +264 }; │ │ │ │ │ +265 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 inline void _S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_s_e_t_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +indexset) │ │ │ │ │ +268 { │ │ │ │ │ +269 if(built_) │ │ │ │ │ +270 free(); │ │ │ │ │ +271 │ │ │ │ │ +272 // Count the number of entries the selection has to hold │ │ │ │ │ +273 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +274 const _c_o_n_s_t___i_t_e_r_a_t_o_r end = indexset._e_n_d(); │ │ │ │ │ +275 int entries = 0; │ │ │ │ │ +276 │ │ │ │ │ +277 for(_c_o_n_s_t___i_t_e_r_a_t_o_r index = indexset._b_e_g_i_n(); index != end; ++index) │ │ │ │ │ +278 if(AttributeSet::contains(index->local().attribute())) │ │ │ │ │ +279 ++entries; │ │ │ │ │ +280 │ │ │ │ │ +281 selected_ = new uint32_t[entries]; │ │ │ │ │ +282 built_ = true; │ │ │ │ │ +283 │ │ │ │ │ +284 entries = 0; │ │ │ │ │ +285 for(_c_o_n_s_t___i_t_e_r_a_t_o_r index = indexset._b_e_g_i_n(); index != end; ++index) │ │ │ │ │ +286 if(AttributeSet::contains(index->local().attribute())) │ │ │ │ │ +287 selected_[entries++]= index->local().local(); │ │ │ │ │ +288 │ │ │ │ │ +289 size_=entries; │ │ │ │ │ +290 built_=true; │ │ │ │ │ +291 } │ │ │ │ │ +292 │ │ │ │ │ +293 template │ │ │ │ │ +_2_9_4 uint32_t* _S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_b_e_g_i_n() const │ │ │ │ │ +295 { │ │ │ │ │ +296 return selected_; │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 template │ │ │ │ │ +_3_0_0 uint32_t* _S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_e_n_d() const │ │ │ │ │ +301 { │ │ │ │ │ +302 return selected_+size_; │ │ │ │ │ +303 } │ │ │ │ │ +304 │ │ │ │ │ +305 template │ │ │ │ │ +_3_0_6 inline void _S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_f_r_e_e() │ │ │ │ │ +307 { │ │ │ │ │ +308 delete[] selected_; │ │ │ │ │ +309 size_=0; │ │ │ │ │ +310 built_=false; │ │ │ │ │ +311 } │ │ │ │ │ +312 │ │ │ │ │ +313 template │ │ │ │ │ +_3_1_4 inline _S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_~_S_e_l_e_c_t_i_o_n() │ │ │ │ │ +315 { │ │ │ │ │ +316 if(built_) │ │ │ │ │ +317 free(); │ │ │ │ │ +318 } │ │ │ │ │ +319 │ │ │ │ │ +320 template │ │ │ │ │ +_3_2_1 _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_> _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_b_e_g_i_n() const │ │ │ │ │ +322 { │ │ │ │ │ +323 return _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_>(indexSet_->begin(), │ │ │ │ │ +324 indexSet_->end()); │ │ │ │ │ +325 } │ │ │ │ │ +326 │ │ │ │ │ +327 template │ │ │ │ │ +_3_2_8 _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_> _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_e_n_d() const │ │ │ │ │ +329 { │ │ │ │ │ +330 return _S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_<_T_S_,_T_G_,_T_L_,_N_>(indexSet_->end(), │ │ │ │ │ +331 indexSet_->end()); │ │ │ │ │ +332 } │ │ │ │ │ +333 template │ │ │ │ │ +_3_3_4 void _U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_<_T_S_,_T_G_,_T_L_,_N_>_:_:_s_e_t_I_n_d_e_x_S_e_t(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +indexset) │ │ │ │ │ +335 { │ │ │ │ │ +336 indexSet_ = &indexset; │ │ │ │ │ +337 } │ │ │ │ │ +338 │ │ │ │ │ +342} │ │ │ │ │ +343#endif │ │ │ │ │ +_i_n_d_e_x_s_e_t_._h_h │ │ │ │ │ +Provides a map between global and local indices. │ │ │ │ │ +_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h │ │ │ │ │ +This file implements iterator facade classes for writing stl conformant │ │ │ │ │ +iterators. │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Get an iterator over the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_s_e_t_I_n_d_e_x_S_e_t │ │ │ │ │ +void setIndexSet(const ParallelIndexSet &indexset) │ │ │ │ │ +Set the index set of the selection. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_s_e_t_I_n_d_e_x_S_e_t │ │ │ │ │ +void setIndexSet(const ParallelIndexSet &indexset) │ │ │ │ │ +Set the index set of the selection. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Get an iterator over the indices positioned at the first index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +Get an iterator over the indices positioned after the last index. │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Get an iterator over the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Get the index set we are a selection for. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:294 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +Free allocated memory. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Get the index set we are a selection for. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:321 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_~_S_e_l_e_c_t_i_o_n │ │ │ │ │ +~Selection() │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:314 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +A constant random access iterator for the Dune::ArrayList class. │ │ │ │ │ +DDeeffiinniittiioonn arraylist.hh:370 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Manager class for the mapping between local indices and globally unique │ │ │ │ │ +indices. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r │ │ │ │ │ +A const iterator over an uncached selection. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune:: │ │ │ │ │ +IndexPair< TG, TL > > > ParallelIndexSetIterator │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +void operator++() │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +uint32_t operator*() const │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +TS AttributeSet │ │ │ │ │ +The type of the Set of attributes. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet │ │ │ │ │ +The type of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r │ │ │ │ │ +SelectionIterator(const ParallelIndexSetIterator &iter, const │ │ │ │ │ +ParallelIndexSetIterator &end) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n │ │ │ │ │ +An uncached selection of indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n │ │ │ │ │ +UncachedSelection() │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +SelectionIterator< TS, TG, TL, N > iterator │ │ │ │ │ +The type of the iterator of the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +TS AttributeSet │ │ │ │ │ +The type of the Set of attributes. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +iterator const_iterator │ │ │ │ │ +The type of the iterator of the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +The type of the global index of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n │ │ │ │ │ +UncachedSelection(const ParallelIndexSet &indexset) │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet │ │ │ │ │ +The type of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_U_n_c_a_c_h_e_d_S_e_l_e_c_t_i_o_n_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +TL LocalIndex │ │ │ │ │ +The type of the local index of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n │ │ │ │ │ +A cached selection of indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +The type of the global index of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_S_e_l_e_c_t_i_o_n │ │ │ │ │ +Selection(const ParallelIndexSet &indexset) │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_S_e_l_e_c_t_i_o_n │ │ │ │ │ +Selection() │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +TL LocalIndex │ │ │ │ │ +The type of the local index of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +TS AttributeSet │ │ │ │ │ +The type of the set of attributes. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +uint32_t * iterator │ │ │ │ │ +The type of the iterator of the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +uint32_t * const_iterator │ │ │ │ │ +The type of the iterator of the selected indices. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_S_e_l_e_c_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet │ │ │ │ │ +The type of the underlying index set. │ │ │ │ │ +DDeeffiinniittiioonn selection.hh:206 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: concept.hh File Reference │ │ │ │ +dune-common: mpiguard.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,95 +65,52 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
concept.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
mpiguard.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Infrastructure for concepts. │ │ │ │ +

Implements a MPIGuard which detects an error on a remote process. │ │ │ │ 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 "mpihelper.hh"
│ │ │ │ +#include "communication.hh"
│ │ │ │ +#include "mpicommunication.hh"
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Concept::Refines< BaseConcepts >
 Base class for refined concepts. More...
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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class C , class... T>
constexpr auto Dune::models ()
 Check if concept is modeled by given types.
 
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.

│ │ │ │ +

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

│ │ │ │ +
Author
Christian Engwer
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,79 +1,35 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -concept.hh File Reference │ │ │ │ │ -Infrastructure for concepts. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_l_i_s_t_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_u_p_l_e_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +mpiguard.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Implements a MPIGuard which detects an error on a remote process. _M_o_r_e_._._. │ │ │ │ │ +#include "_m_p_i_h_e_l_p_e_r_._h_h" │ │ │ │ │ +#include "_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h" │ │ │ │ │ +#include "_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_R_e_f_i_n_e_s_<_ _B_a_s_e_C_o_n_c_e_p_t_s_ _> │ │ │ │ │ -  Base class for refined concepts. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_M_P_I_G_u_a_r_d_E_r_r_o_r │ │ │ │ │ +  This exception is thrown if the _M_P_I_G_u_a_r_d detects an error on a remote │ │ │ │ │ + process. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +  detects a thrown exception and communicates to all other processes │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_C_o_n_c_e_p_t │ │ │ │ │ -  Namespace for concepts. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr auto  _D_u_n_e_:_:_m_o_d_e_l_s () │ │ │ │ │ -  Check if concept is modeled by given types. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr auto  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_t_u_p_l_e_E_n_t_r_i_e_s_M_o_d_e_l () -> typename Impl:: │ │ │ │ │ - TupleEntriesModelHelper< C, Tuple >::Result │ │ │ │ │ -  │ │ │ │ │ -template::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_T_r_u_e () │ │ │ │ │ -  │ │ │ │ │ -template(), │ │ │ │ │ -int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_c_e_p_t () │ │ │ │ │ -  │ │ │ │ │ -template(), │ │ │ │ │ -int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_c_e_p_t (T &&...) │ │ │ │ │ -  │ │ │ │ │ -template(), int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_c_e_p_t_F_o_r_T_u_p_l_e_E_n_t_r_i_e_s () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e (const From &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_T_y_p_e () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_B_a_s_e_O_f () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_B_a_s_e_O_f (const Derived &) │ │ │ │ │ -  │ │ │ │ │ -template:: │ │ │ │ │ -value, int >::type = 0> │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_S_a_m_e_T_y_p_e () │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Infrastructure for concepts. │ │ │ │ │ +Implements a MPIGuard which detects an error on a remote process. │ │ │ │ │ + Author │ │ │ │ │ + Christian Engwer │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: concept.hh Source File │ │ │ │ +dune-common: mpiguard.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,340 +70,212 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
concept.hh
│ │ │ │ +
mpiguard.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
│ │ │ │ -
7
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
16
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
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 // #############################################################################
│ │ │ │ +
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 // 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
│ │ │ │ +
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 &);
│ │ │ │ +
140
│ │ │ │ +
141 public:
│ │ │ │ +
│ │ │ │ +
146 MPIGuard (bool active=true) :
│ │ │ │ +
147 comm_(GuardCommunicator::create(
│ │ │ │ +
148 MPIHelper::getCommunication())),
│ │ │ │ +
149 active_(active)
│ │ │ │ +
150 {}
│ │ │ │
│ │ │ │
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 };
│ │ │ │ -
210 using Result = typename ReduceTuple<AccumulateFunctor, Tuple, std::true_type>::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<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.
│ │ │ │ -
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
│ │ │ │ +
│ │ │ │ +
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
│ │ │ │ +
Helpers for dealing with MPI.
│ │ │ │ +
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ +
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
│ │ │ │
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
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,360 +1,227 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -concept.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpiguard.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_l_i_s_t_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_u_p_l_e_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -16 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24 │ │ │ │ │ -_3_4namespace Concept { │ │ │ │ │ -35 │ │ │ │ │ -36 │ │ │ │ │ -37 │ │ │ │ │ -52template │ │ │ │ │ -_5_3struct _R_e_f_i_n_e_s │ │ │ │ │ -54{ │ │ │ │ │ -_5_5 typedef _T_y_p_e_L_i_s_t _B_a_s_e_C_o_n_c_e_p_t_L_i_s_t; │ │ │ │ │ -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 / │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ +5 │ │ │ │ │ +13#ifndef DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ +14#define DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ +15 │ │ │ │ │ +16#include "_m_p_i_h_e_l_p_e_r_._h_h" │ │ │ │ │ +17#include "_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h" │ │ │ │ │ +18#include "_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h" │ │ │ │ │ +19#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e │ │ │ │ │ +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 // Forward declaration │ │ │ │ │ -69 template │ │ │ │ │ -70 constexpr bool _m_o_d_e_l_s(); │ │ │ │ │ -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(_P_r_i_o_r_i_t_y_T_a_g_<_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(_P_r_i_o_r_i_t_y_T_a_g_<_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 _m_o_d_e_l_s() 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 _m_o_d_e_l_s() │ │ │ │ │ -142 { │ │ │ │ │ -143 return modelsConcept(PriorityTag<42>()); │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -146} // namespace Dune::Concept::Impl │ │ │ │ │ -147 │ │ │ │ │ -148#endif // DOXYGEN │ │ │ │ │ -149 │ │ │ │ │ -150} // namespace Dune::Concept │ │ │ │ │ +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 │ │ │ │ │ +_9_9 class _M_P_I_G_u_a_r_d_E_r_r_o_r : public _P_a_r_a_l_l_e_l_E_r_r_o_r {}; │ │ │ │ │ +100 │ │ │ │ │ +_1_3_3 class _M_P_I_G_u_a_r_d │ │ │ │ │ +134 { │ │ │ │ │ +135 GuardCommunicator * comm_; │ │ │ │ │ +136 bool active_; │ │ │ │ │ +137 │ │ │ │ │ +138 // we don't want to copy this class │ │ │ │ │ +139 _M_P_I_G_u_a_r_d (const _M_P_I_G_u_a_r_d &); │ │ │ │ │ +140 │ │ │ │ │ +141 public: │ │ │ │ │ +_1_4_6 _M_P_I_G_u_a_r_d (bool active=true) : │ │ │ │ │ +147 comm_(GuardCommunicator::create( │ │ │ │ │ +148 _M_P_I_H_e_l_p_e_r::getCommunication())), │ │ │ │ │ +149 active_(active) │ │ │ │ │ +150 {} │ │ │ │ │ 151 │ │ │ │ │ -152 │ │ │ │ │ -153 │ │ │ │ │ -183template │ │ │ │ │ -_1_8_4constexpr auto _m_o_d_e_l_s() │ │ │ │ │ -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 │ │ │ │ │ -_2_2_4constexpr auto _t_u_p_l_e_E_n_t_r_i_e_s_M_o_d_e_l() │ │ │ │ │ -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> │ │ │ │ │ -_2_3_9constexpr bool _r_e_q_u_i_r_e_T_r_u_e() │ │ │ │ │ -240{ │ │ │ │ │ -241 return true; │ │ │ │ │ -242} │ │ │ │ │ -243 │ │ │ │ │ -244// Helper function for use in concept definitions. │ │ │ │ │ -245template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ -_2_4_6constexpr bool _r_e_q_u_i_r_e_C_o_n_c_e_p_t() │ │ │ │ │ -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> │ │ │ │ │ -_2_5_4constexpr bool _r_e_q_u_i_r_e_C_o_n_c_e_p_t(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> │ │ │ │ │ -_2_6_2constexpr bool _r_e_q_u_i_r_e_C_o_n_c_e_p_t_F_o_r_T_u_p_l_e_E_n_t_r_i_e_s() │ │ │ │ │ -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> │ │ │ │ │ -_2_7_1constexpr bool _r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e() │ │ │ │ │ -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> │ │ │ │ │ -_2_8_0constexpr bool _r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e(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 │ │ │ │ │ -_2_9_0constexpr bool _r_e_q_u_i_r_e_T_y_p_e() │ │ │ │ │ -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> │ │ │ │ │ -_2_9_9constexpr bool _r_e_q_u_i_r_e_B_a_s_e_O_f() │ │ │ │ │ -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> │ │ │ │ │ -_3_0_8constexpr bool _r_e_q_u_i_r_e_B_a_s_e_O_f(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> │ │ │ │ │ -_3_1_7constexpr bool _r_e_q_u_i_r_e_S_a_m_e_T_y_p_e() │ │ │ │ │ -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 │ │ │ │ │ -_t_y_p_e_l_i_s_t_._h_h │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ -_t_u_p_l_e_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -Contains utility classes which can be used with std::tuple. │ │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t │ │ │ │ │ -std::tuple< MetaType< T >... > TypeList │ │ │ │ │ -A simple type list. │ │ │ │ │ -DDeeffiinniittiioonn typelist.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_m_o_d_e_l_s │ │ │ │ │ -constexpr auto models() │ │ │ │ │ -Check if concept is modeled by given types. │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:184 │ │ │ │ │ +_1_5_7 _M_P_I_G_u_a_r_d (_M_P_I_H_e_l_p_e_r & m, bool active=true) : │ │ │ │ │ +158 comm_(GuardCommunicator::create( │ │ │ │ │ +159 m.getCommunication())), │ │ │ │ │ +160 active_(active) │ │ │ │ │ +161 {} │ │ │ │ │ +162 │ │ │ │ │ +173 template │ │ │ │ │ +_1_7_4 _M_P_I_G_u_a_r_d (const C & comm, bool active=true) : │ │ │ │ │ +175 comm_(GuardCommunicator::create(comm)), │ │ │ │ │ +176 active_(active) │ │ │ │ │ +177 {} │ │ │ │ │ +178 │ │ │ │ │ +179#if HAVE_MPI │ │ │ │ │ +_1_8_0 _M_P_I_G_u_a_r_d (const MPI_Comm & comm, bool active=true) : │ │ │ │ │ +181 comm_(GuardCommunicator::create(comm)), │ │ │ │ │ +182 active_(active) │ │ │ │ │ +183 {} │ │ │ │ │ +184#endif │ │ │ │ │ +185 │ │ │ │ │ +_1_8_8 _~_M_P_I_G_u_a_r_d() │ │ │ │ │ +189 { │ │ │ │ │ +190 if (active_) │ │ │ │ │ +191 { │ │ │ │ │ +192 active_ = false; │ │ │ │ │ +193 _f_i_n_a_l_i_z_e(false); │ │ │ │ │ +194 } │ │ │ │ │ +195 delete comm_; │ │ │ │ │ +196 } │ │ │ │ │ +197 │ │ │ │ │ +_2_0_2 void _r_e_a_c_t_i_v_a_t_e() { │ │ │ │ │ +203 if (active_ == true) │ │ │ │ │ +204 _f_i_n_a_l_i_z_e(); │ │ │ │ │ +205 active_ = true; │ │ │ │ │ +206 } │ │ │ │ │ +207 │ │ │ │ │ +_2_1_8 void _f_i_n_a_l_i_z_e(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 _D_U_N_E___T_H_R_O_W(_M_P_I_G_u_a_r_d_E_r_r_o_r, "Terminating process " │ │ │ │ │ +227 << comm_->rank() << " due to " │ │ │ │ │ +228 << result << " remote error(s)"); │ │ │ │ │ +229 } │ │ │ │ │ +230 } │ │ │ │ │ +231 }; │ │ │ │ │ +232 │ │ │ │ │ +233} │ │ │ │ │ +234 │ │ │ │ │ +235#endif // DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ +_m_p_i_h_e_l_p_e_r_._h_h │ │ │ │ │ +Helpers for dealing with MPI. │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides collective communication methods for │ │ │ │ │ +sequential programs. │ │ │ │ │ +_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_c_e_p_t │ │ │ │ │ -constexpr bool requireConcept() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_T_r_u_e │ │ │ │ │ -constexpr bool requireTrue() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:239 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_S_a_m_e_T_y_p_e │ │ │ │ │ -constexpr bool requireSameType() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_t_u_p_l_e_E_n_t_r_i_e_s_M_o_d_e_l │ │ │ │ │ -constexpr auto tupleEntriesModel() -> typename Impl::TupleEntriesModelHelper< │ │ │ │ │ -C, Tuple >::Result │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_c_e_p_t_F_o_r_T_u_p_l_e_E_n_t_r_i_e_s │ │ │ │ │ -constexpr bool requireConceptForTupleEntries() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_B_a_s_e_O_f │ │ │ │ │ -constexpr bool requireBaseOf() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e │ │ │ │ │ -constexpr bool requireConvertible() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_r_e_q_u_i_r_e_T_y_p_e │ │ │ │ │ -constexpr bool requireType() │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_R_e_f_i_n_e_s │ │ │ │ │ -Base class for refined concepts. │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t_:_:_R_e_f_i_n_e_s_:_:_B_a_s_e_C_o_n_c_e_p_t_L_i_s_t │ │ │ │ │ -TypeList< BaseConcepts... > BaseConceptList │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_E_r_r_o_r │ │ │ │ │ +Default exception if an error in the parallel communication of the program │ │ │ │ │ +occurred. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_E_r_r_o_r │ │ │ │ │ +This exception is thrown if the MPIGuard detects an error on a remote process. │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +detects a thrown exception and communicates to all other processes │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_r_e_a_c_t_i_v_a_t_e │ │ │ │ │ +void reactivate() │ │ │ │ │ +reactivate the guard. │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_f_i_n_a_l_i_z_e │ │ │ │ │ +void finalize(bool success=true) │ │ │ │ │ +stop the guard. │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_~_M_P_I_G_u_a_r_d │ │ │ │ │ +~MPIGuard() │ │ │ │ │ +destroy the guard and check for undetected exceptions │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +MPIGuard(const C &comm, bool active=true) │ │ │ │ │ +create an MPIGuard operating on an arbitrary communicator. │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +MPIGuard(const MPI_Comm &comm, bool active=true) │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +MPIGuard(bool active=true) │ │ │ │ │ +create an MPIGuard operating on the Communicator of the global Dune::MPIHelper │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_G_u_a_r_d_:_:_M_P_I_G_u_a_r_d │ │ │ │ │ +MPIGuard(MPIHelper &m, bool active=true) │ │ │ │ │ +create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m │ │ │ │ │ +DDeeffiinniittiioonn mpiguard.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_H_e_l_p_e_r │ │ │ │ │ +A real mpi helper. │ │ │ │ │ +DDeeffiinniittiioonn mpihelper.hh:179 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: arraylist.hh File Reference │ │ │ │ +dune-common: mpipack.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,56 +65,51 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
arraylist.hh File Reference
│ │ │ │ +
mpipack.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

See MPI_Pack. │ │ │ │ More...

│ │ │ │ -
#include <array>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <vector>
│ │ │ │ -#include "iteratorfacades.hh"
│ │ │ │ +
#include <vector>
│ │ │ │ +#include <mpi.h>
│ │ │ │ +#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ +#include <dune/common/parallel/mpidata.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::MPIPack
 
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...
struct  Dune::MPIData< P, std::enable_if_t< std::is_same< std::remove_const_t< P >, MPIPack >::value > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

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

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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,41 +1,35 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -arraylist.hh File Reference │ │ │ │ │ -Implements a random-access container that can efficiently change size (similar │ │ │ │ │ -to std::deque) _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +mpipack.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +See MPI_Pack. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include "_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_d_a_t_a_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_<_ _T_,_ _N_,_ _A_ _> │ │ │ │ │ -  A dynamically growing random access list. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_P_I_P_a_c_k │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_ _T_,_ _N_,_ _A_ _> │ │ │ │ │ -  A random access iterator for the _D_u_n_e_:_:_A_r_r_a_y_L_i_s_t class. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_ _T_,_ _N_,_ _A_ _> │ │ │ │ │ -  A constant random access iterator for the _D_u_n_e_:_:_A_r_r_a_y_L_i_s_t class. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_< │ │ │ │ │ + _P_ _>_,_ _M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -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. │ │ │ │ │ +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 │ │ │ │ │ - Markus Blatt │ │ │ │ │ + Nils-Arne Dreier │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: arraylist.hh Source File │ │ │ │ +dune-common: mpipack.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,627 +70,283 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
arraylist.hh
│ │ │ │ +
mpipack.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_ARRAYLIST_HH
│ │ │ │ -
7#define DUNE_COMMON_ARRAYLIST_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <array>
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12#include <vector>
│ │ │ │ -
13#include "iteratorfacades.hh"
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune
│ │ │ │ -
16{
│ │ │ │ -
17 // forward declaration
│ │ │ │ -
18 template<class T, int N, class A>
│ │ │ │ -
19 class ArrayListIterator;
│ │ │ │ -
20
│ │ │ │ -
21 template<class T, int N, class A>
│ │ │ │ -
22 class ConstArrayListIterator;
│ │ │ │ -
23
│ │ │ │ -
60 template<class T, int N=100, class A=std::allocator<T> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
62 {
│ │ │ │ -
63 public:
│ │ │ │ -
69 typedef T MemberType;
│ │ │ │ -
70
│ │ │ │ -
74 typedef T value_type;
│ │ │ │ -
75
│ │ │ │ -
79 typedef T& reference;
│ │ │ │ -
80
│ │ │ │ -
84 typedef const T& const_reference;
│ │ │ │ -
85
│ │ │ │ -
89 typedef T* pointer;
│ │ │ │ -
90
│ │ │ │ -
94 typedef const T* const_pointer;
│ │ │ │ -
95
│ │ │ │ -
100 constexpr static int chunkSize_ = (N > 0) ? N : 1;
│ │ │ │ -
101
│ │ │ │ - │ │ │ │ -
106
│ │ │ │ - │ │ │ │ -
111
│ │ │ │ -
115 typedef std::size_t size_type;
│ │ │ │ -
116
│ │ │ │ -
120 typedef std::ptrdiff_t difference_type;
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
127
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
134
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
140
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
146
│ │ │ │ -
│ │ │ │ -
151 inline void push_back(const_reference entry);
│ │ │ │ -
152
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
159
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ -
│ │ │ │ -
171 inline size_type size() const;
│ │ │ │ -
172
│ │ │ │ -
│ │ │ │ -
180 inline void purge();
│ │ │ │ -
181
│ │ │ │ -
│ │ │ │ -
185 inline void clear();
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
190
│ │ │ │ -
191 private:
│ │ │ │ -
192
│ │ │ │ -
196 using SmartPointerAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::shared_ptr< std::array<MemberType,chunkSize_> > >;
│ │ │ │ -
197
│ │ │ │ -
201 using ArrayAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::array<MemberType,chunkSize_> >;
│ │ │ │ -
202
│ │ │ │ -
206 friend class ArrayListIterator<T,N,A>;
│ │ │ │ -
207 friend class ConstArrayListIterator<T,N,A>;
│ │ │ │ -
208
│ │ │ │ -
210 std::vector<std::shared_ptr<std::array<MemberType,chunkSize_> >,
│ │ │ │ -
211 SmartPointerAllocator> chunks_;
│ │ │ │ -
220 size_type capacity_;
│ │ │ │ -
222 size_type size_;
│ │ │ │ -
224 size_type start_;
│ │ │ │ -
233 inline reference elementAt(size_type i);
│ │ │ │ -
234
│ │ │ │ -
243 inline const_reference elementAt(size_type i) const;
│ │ │ │ -
244 };
│ │ │ │ -
245
│ │ │ │ -
246
│ │ │ │ -
250 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ -
251 class ArrayListIterator : public RandomAccessIteratorFacade<ArrayListIterator<T,N,A>,
│ │ │ │ -
252 typename A::value_type,
│ │ │ │ -
253 typename A::value_type &,
│ │ │ │ -
254 typename A::difference_type>
│ │ │ │ -
255 {
│ │ │ │ -
256
│ │ │ │ -
257 friend class ArrayList<T,N,A>;
│ │ │ │ -
258 friend class ConstArrayListIterator<T,N,A>;
│ │ │ │ -
259 public:
│ │ │ │ -
263 typedef typename A::value_type MemberType;
│ │ │ │ -
264
│ │ │ │ -
265 typedef typename A::difference_type difference_type;
│ │ │ │ -
266
│ │ │ │ -
267 typedef typename A::size_type size_type;
│ │ │ │ -
268
│ │ │ │ -
269 using reference = typename A::value_type &;
│ │ │ │ -
270
│ │ │ │ -
271 using const_reference = typename A::value_type const&;
│ │ │ │ -
272
│ │ │ │ -
278 constexpr static int chunkSize_ = (N > 0) ? N : 1;
│ │ │ │ -
279
│ │ │ │ -
280
│ │ │ │ -
286 inline bool equals(const ArrayListIterator<MemberType,N,A>& other) const;
│ │ │ │ -
287
│ │ │ │ -
293 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
│ │ │ │ -
294
│ │ │ │ -
298 inline void increment();
│ │ │ │ -
299
│ │ │ │ -
303 inline void decrement();
│ │ │ │ -
304
│ │ │ │ -
309 inline reference elementAt(size_type i) const;
│ │ │ │ -
310
│ │ │ │ -
315 inline reference dereference() const;
│ │ │ │ -
316
│ │ │ │ -
328 inline void eraseToHere();
│ │ │ │ -
329
│ │ │ │ -
331 inline size_type position(){return position_;}
│ │ │ │ -
332
│ │ │ │ -
334 inline void advance(difference_type n);
│ │ │ │ -
335
│ │ │ │ -
337 inline difference_type distanceTo(const ArrayListIterator<T,N,A>& other) const;
│ │ │ │ -
338
│ │ │ │ -
│ │ │ │ -
340 inline ArrayListIterator() : position_(0), list_(nullptr)
│ │ │ │ -
341 {}
│ │ │ │ -
│ │ │ │ -
342
│ │ │ │ -
343 private:
│ │ │ │ - │ │ │ │ -
350
│ │ │ │ -
354 size_type position_;
│ │ │ │ - │ │ │ │ -
359 };
│ │ │ │ -
│ │ │ │ -
360
│ │ │ │ -
364 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
366 : public RandomAccessIteratorFacade<ConstArrayListIterator<T,N,A>,
│ │ │ │ -
367 const typename A::value_type,
│ │ │ │ -
368 typename A::value_type const&,
│ │ │ │ -
369 typename A::difference_type>
│ │ │ │ -
370 {
│ │ │ │ -
371
│ │ │ │ -
372 friend class ArrayList<T,N,A>;
│ │ │ │ -
373 friend class ArrayListIterator<T,N,A>;
│ │ │ │ -
374
│ │ │ │ -
375 public:
│ │ │ │ -
379 typedef typename A::value_type MemberType;
│ │ │ │ -
380
│ │ │ │ -
381 typedef typename A::difference_type difference_type;
│ │ │ │ -
382
│ │ │ │ -
383 typedef typename A::size_type size_type;
│ │ │ │ -
384
│ │ │ │ -
385 using reference = typename A::value_type &;
│ │ │ │ -
386
│ │ │ │ -
387 using const_reference = typename A::value_type const&;
│ │ │ │ -
388
│ │ │ │ -
394 constexpr static int chunkSize_ = (N > 0) ? N : 1;
│ │ │ │ -
395
│ │ │ │ -
│ │ │ │ -
401 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
│ │ │ │ -
402
│ │ │ │ -
│ │ │ │ -
406 inline void increment();
│ │ │ │ -
407
│ │ │ │ -
│ │ │ │ -
411 inline void decrement();
│ │ │ │ -
412
│ │ │ │ -
│ │ │ │ -
414 inline void advance(difference_type n);
│ │ │ │ -
415
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
418
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
424
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
430
│ │ │ │ -
│ │ │ │ -
431 inline ConstArrayListIterator() : position_(0), list_(nullptr)
│ │ │ │ -
432 {}
│ │ │ │ -
│ │ │ │ -
433
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
435
│ │ │ │ -
436 private:
│ │ │ │ -
437
│ │ │ │ -
443 inline ConstArrayListIterator(const ArrayList<T,N,A>& arrayList, size_type position);
│ │ │ │ -
444
│ │ │ │ -
448 size_type position_;
│ │ │ │ -
452 const ArrayList<T,N,A>* list_;
│ │ │ │ -
453 };
│ │ │ │ -
454
│ │ │ │ -
455
│ │ │ │ -
456 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
458 : capacity_(0), size_(0), start_(0)
│ │ │ │ -
459 {
│ │ │ │ -
460 chunks_.reserve(100);
│ │ │ │ -
461 }
│ │ │ │ -
│ │ │ │ -
462
│ │ │ │ -
463 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
465 capacity_=0;
│ │ │ │ -
466 size_=0;
│ │ │ │ -
467 start_=0;
│ │ │ │ -
468 chunks_.clear();
│ │ │ │ -
469 }
│ │ │ │ -
│ │ │ │ -
470
│ │ │ │ -
471 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
473 {
│ │ │ │ -
474 return size_;
│ │ │ │ -
475 }
│ │ │ │ -
│ │ │ │ -
476
│ │ │ │ -
477 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
479 {
│ │ │ │ -
480 size_t index=start_+size_;
│ │ │ │ -
481 if(index==capacity_)
│ │ │ │ -
482 {
│ │ │ │ -
483 chunks_.push_back(std::make_shared<std::array<MemberType,chunkSize_> >());
│ │ │ │ -
484 capacity_ += chunkSize_;
│ │ │ │ -
485 }
│ │ │ │ -
486 elementAt(index)=entry;
│ │ │ │ -
487 ++size_;
│ │ │ │ -
488 }
│ │ │ │ -
│ │ │ │ -
489
│ │ │ │ -
490 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
492 {
│ │ │ │ -
493 return elementAt(start_+i);
│ │ │ │ -
494 }
│ │ │ │ -
│ │ │ │ -
495
│ │ │ │ -
496
│ │ │ │ -
497 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
499 {
│ │ │ │ -
500 return elementAt(start_+i);
│ │ │ │ -
501 }
│ │ │ │ -
│ │ │ │ -
502
│ │ │ │ -
503 template<class T, int N, class A>
│ │ │ │ - │ │ │ │ -
505 {
│ │ │ │ -
506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
│ │ │ │ -
507 }
│ │ │ │ -
508
│ │ │ │ -
509
│ │ │ │ -
510 template<class T, int N, class A>
│ │ │ │ -
511 typename ArrayList<T,N,A>::const_reference ArrayList<T,N,A>::elementAt(size_type i) const
│ │ │ │ -
512 {
│ │ │ │ -
513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
│ │ │ │ -
514 }
│ │ │ │ -
515
│ │ │ │ -
516 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
518 {
│ │ │ │ -
519 return ArrayListIterator<T,N,A>(*this, start_);
│ │ │ │ -
520 }
│ │ │ │ -
│ │ │ │ -
521
│ │ │ │ -
522 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
524 {
│ │ │ │ -
525 return ConstArrayListIterator<T,N,A>(*this, start_);
│ │ │ │ -
526 }
│ │ │ │ -
│ │ │ │ -
527
│ │ │ │ -
528 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
530 {
│ │ │ │ -
531 return ArrayListIterator<T,N,A>(*this, start_+size_);
│ │ │ │ -
532 }
│ │ │ │ -
│ │ │ │ -
533
│ │ │ │ -
534 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
536 {
│ │ │ │ -
537 return ConstArrayListIterator<T,N,A>(*this, start_+size_);
│ │ │ │ -
538 }
│ │ │ │ -
│ │ │ │ -
539
│ │ │ │ -
540 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
542 {
│ │ │ │ -
543 // Distance to copy to the left.
│ │ │ │ -
544 size_t distance = start_/chunkSize_;
│ │ │ │ -
545 if(distance>0) {
│ │ │ │ -
546 // Number of chunks with entries in it;
│ │ │ │ -
547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );
│ │ │ │ -
548
│ │ │ │ -
549 // Copy chunks to the left.
│ │ │ │ -
550 std::copy(chunks_.begin()+distance,
│ │ │ │ -
551 chunks_.begin()+(distance+chunks), chunks_.begin());
│ │ │ │ -
552
│ │ │ │ -
553 // Calculate new parameters
│ │ │ │ -
554 start_ = start_ % chunkSize_;
│ │ │ │ -
555 //capacity += distance * chunkSize_;
│ │ │ │ -
556 }
│ │ │ │ -
557 }
│ │ │ │ -
│ │ │ │ -
558
│ │ │ │ -
559 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
561 {
│ │ │ │ -
562 position_+=i;
│ │ │ │ -
563 }
│ │ │ │ -
│ │ │ │ -
564
│ │ │ │ -
565 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
567 {
│ │ │ │ -
568 position_+=i;
│ │ │ │ -
569 }
│ │ │ │ -
│ │ │ │ -
570
│ │ │ │ -
571
│ │ │ │ -
572 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
574 {
│ │ │ │ -
575 // Makes only sense if we reference a common list
│ │ │ │ -
576 assert(list_==(other.list_));
│ │ │ │ -
577 return position_==other.position_ ;
│ │ │ │ -
578 }
│ │ │ │ -
│ │ │ │ -
579
│ │ │ │ -
580
│ │ │ │ -
581 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
583 {
│ │ │ │ -
584 // Makes only sense if we reference a common list
│ │ │ │ -
585 assert(list_==(other.list_));
│ │ │ │ -
586 return position_==other.position_ ;
│ │ │ │ -
587 }
│ │ │ │ -
│ │ │ │ -
588
│ │ │ │ -
589
│ │ │ │ -
590 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
592 {
│ │ │ │ -
593 // Makes only sense if we reference a common list
│ │ │ │ -
594 assert(list_==(other.list_));
│ │ │ │ -
595 return position_==other.position_ ;
│ │ │ │ -
596 }
│ │ │ │ -
│ │ │ │ -
597
│ │ │ │ -
598 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
600 {
│ │ │ │ -
601 ++position_;
│ │ │ │ -
602 }
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
604 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
606 {
│ │ │ │ -
607 ++position_;
│ │ │ │ -
608 }
│ │ │ │ -
│ │ │ │ -
609
│ │ │ │ -
610 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
612 {
│ │ │ │ -
613 --position_;
│ │ │ │ -
614 }
│ │ │ │ -
│ │ │ │ -
615
│ │ │ │ -
616 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
618 {
│ │ │ │ -
619 --position_;
│ │ │ │ -
620 }
│ │ │ │ -
│ │ │ │ -
621
│ │ │ │ -
622 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
624 {
│ │ │ │ -
625 return list_->elementAt(i+position_);
│ │ │ │ -
626 }
│ │ │ │ -
│ │ │ │ -
627
│ │ │ │ -
628 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
630 {
│ │ │ │ -
631 return list_->elementAt(i+position_);
│ │ │ │ -
632 }
│ │ │ │ -
│ │ │ │ -
633
│ │ │ │ -
634 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
636 {
│ │ │ │ -
637 return list_->elementAt(position_);
│ │ │ │ -
638 }
│ │ │ │ -
│ │ │ │ -
639
│ │ │ │ -
640 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
642 {
│ │ │ │ -
643 return list_->elementAt(position_);
│ │ │ │ -
644 }
│ │ │ │ -
│ │ │ │ -
645
│ │ │ │ -
646 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
648 {
│ │ │ │ -
649 // Makes only sense if we reference a common list
│ │ │ │ -
650 assert(list_==(other.list_));
│ │ │ │ -
651 return other.position_ - position_;
│ │ │ │ -
652 }
│ │ │ │ -
│ │ │ │ -
653
│ │ │ │ -
654 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
656 {
│ │ │ │ -
657 // Makes only sense if we reference a common list
│ │ │ │ -
658 assert(list_==(other.list_));
│ │ │ │ -
659 return other.position_ - position_;
│ │ │ │ -
660 }
│ │ │ │ -
│ │ │ │ -
661
│ │ │ │ -
662 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
664 {
│ │ │ │ -
665 list_->size_ -= ++position_ - list_->start_;
│ │ │ │ -
666 // chunk number of the new position.
│ │ │ │ -
667 size_t posChunkStart = position_ / chunkSize_;
│ │ │ │ -
668 // number of chunks to deallocate
│ │ │ │ -
669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)
│ │ │ │ -
670 / chunkSize_;
│ │ │ │ -
671 list_->start_ = position_;
│ │ │ │ -
672
│ │ │ │ -
673 // Deallocate memory not needed any more.
│ │ │ │ -
674 for(size_t chunk=0; chunk<chunks; chunk++) {
│ │ │ │ -
675 --posChunkStart;
│ │ │ │ -
676 list_->chunks_[posChunkStart].reset();
│ │ │ │ -
677 }
│ │ │ │ -
678
│ │ │ │ -
679 // Capacity stays the same as the chunks before us
│ │ │ │ -
680 // are still there. They null pointers.
│ │ │ │ -
681 assert(list_->start_+list_->size_<=list_->capacity_);
│ │ │ │ -
682 }
│ │ │ │ -
│ │ │ │ -
683
│ │ │ │ -
684 template<class T, int N, class A>
│ │ │ │ - │ │ │ │ -
686 : position_(position), list_(&arrayList)
│ │ │ │ -
687 {}
│ │ │ │ -
688
│ │ │ │ -
689
│ │ │ │ -
690 template<class T, int N, class A>
│ │ │ │ -
691 ConstArrayListIterator<T,N,A>::ConstArrayListIterator(const ArrayList<T,N,A>& arrayList,
│ │ │ │ -
692 size_type position)
│ │ │ │ -
693 : position_(position), list_(&arrayList)
│ │ │ │ -
694 {}
│ │ │ │ -
695
│ │ │ │ -
696 template<class T, int N, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
698 : position_(other.position_), list_(other.list_)
│ │ │ │ -
699 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
700
│ │ │ │ -
701
│ │ │ │ -
703}
│ │ │ │ -
704#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
This file implements iterator facade classes for writing stl conformant iterators.
│ │ │ │ -
reference operator[](size_type i)
Get the element at specific position.
Definition arraylist.hh:491
│ │ │ │ -
iterator begin()
Get an iterator that is positioned at the first element.
Definition arraylist.hh:517
│ │ │ │ -
bool equals(const ArrayListIterator< MemberType, N, A > &other) const
Comares two iterators.
Definition arraylist.hh:573
│ │ │ │ -
void increment()
Increment the iterator.
Definition arraylist.hh:599
│ │ │ │ -
size_type size() const
Get the number of elements in the list.
Definition arraylist.hh:472
│ │ │ │ -
ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)
Definition arraylist.hh:697
│ │ │ │ -
void purge()
Purge the list.
Definition arraylist.hh:541
│ │ │ │ -
void decrement()
decrement the iterator.
Definition arraylist.hh:611
│ │ │ │ -
void eraseToHere()
Erase all entries before the current position and the one at the current position.
Definition arraylist.hh:663
│ │ │ │ -
ArrayList()
Constructs an Array list with one chunk.
Definition arraylist.hh:457
│ │ │ │ -
const_iterator begin() const
Get a random access iterator that is positioned at the first element.
Definition arraylist.hh:523
│ │ │ │ -
void increment()
Increment the iterator.
Definition arraylist.hh:605
│ │ │ │ -
iterator end()
Get a random access iterator positioned after the last element.
Definition arraylist.hh:529
│ │ │ │ -
const_reference elementAt(size_type i) const
Get the value of the list at an arbitrary position.
Definition arraylist.hh:629
│ │ │ │ -
const_reference operator[](size_type i) const
Get the element at specific position.
Definition arraylist.hh:498
│ │ │ │ -
void decrement()
decrement the iterator.
Definition arraylist.hh:617
│ │ │ │ -
void advance(difference_type n)
Definition arraylist.hh:566
│ │ │ │ -
const_iterator end() const
Get a random access iterator positioned after the last element.
Definition arraylist.hh:535
│ │ │ │ -
const_reference dereference() const
Access the element at the current position.
Definition arraylist.hh:641
│ │ │ │ -
void clear()
Delete all entries from the list.
Definition arraylist.hh:464
│ │ │ │ -
reference elementAt(size_type i) const
Get the value of the list at an arbitrary position.
Definition arraylist.hh:623
│ │ │ │ -
bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const
Comares to iterators.
Definition arraylist.hh:591
│ │ │ │ -
void advance(difference_type n)
Definition arraylist.hh:560
│ │ │ │ -
difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other) const
Definition arraylist.hh:655
│ │ │ │ -
reference dereference() const
Access the element at the current position.
Definition arraylist.hh:635
│ │ │ │ -
void push_back(const_reference entry)
Append an entry to the list.
Definition arraylist.hh:478
│ │ │ │ -
difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const
Definition arraylist.hh:647
│ │ │ │ +
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
│ │ │ │ +
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
│ │ │ │ +
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
A random access iterator for the Dune::ArrayList class.
Definition arraylist.hh:255
│ │ │ │ -
size_type position()
Definition arraylist.hh:331
│ │ │ │ -
A::value_type MemberType
The member type.
Definition arraylist.hh:263
│ │ │ │ -
ArrayListIterator()
Standard constructor.
Definition arraylist.hh:340
│ │ │ │ -
A::difference_type difference_type
Definition arraylist.hh:265
│ │ │ │ -
static constexpr int chunkSize_
The number of elements in one chunk of the list.
Definition arraylist.hh:278
│ │ │ │ -
A::size_type size_type
Definition arraylist.hh:267
│ │ │ │ -
typename A::value_type const & const_reference
Definition arraylist.hh:271
│ │ │ │ -
typename A::value_type & reference
Definition arraylist.hh:269
│ │ │ │ -
A constant random access iterator for the Dune::ArrayList class.
Definition arraylist.hh:370
│ │ │ │ -
static constexpr int chunkSize_
The number of elements in one chunk of the list.
Definition arraylist.hh:394
│ │ │ │ -
typename A::value_type & reference
Definition arraylist.hh:385
│ │ │ │ -
ConstArrayListIterator()
Definition arraylist.hh:431
│ │ │ │ -
A::value_type MemberType
The member type.
Definition arraylist.hh:379
│ │ │ │ -
A::difference_type difference_type
Definition arraylist.hh:381
│ │ │ │ -
typename A::value_type const & const_reference
Definition arraylist.hh:387
│ │ │ │ -
A::size_type size_type
Definition arraylist.hh:383
│ │ │ │ -
A dynamically growing random access list.
Definition arraylist.hh:62
│ │ │ │ -
T value_type
Value type for stl compliance.
Definition arraylist.hh:74
│ │ │ │ -
static constexpr int chunkSize_
The number of elements in one chunk of the list. This has to be at least one. The default is 100.
Definition arraylist.hh:100
│ │ │ │ -
const T * const_pointer
The type of a const pointer to the type we store.
Definition arraylist.hh:94
│ │ │ │ -
ArrayListIterator< MemberType, N, A > iterator
A random access iterator.
Definition arraylist.hh:105
│ │ │ │ -
const T & const_reference
The type of a const reference to the type we store.
Definition arraylist.hh:84
│ │ │ │ -
T & reference
The type of a reference to the type we store.
Definition arraylist.hh:79
│ │ │ │ -
std::size_t size_type
The size type.
Definition arraylist.hh:115
│ │ │ │ -
T MemberType
The member type that is stored.
Definition arraylist.hh:69
│ │ │ │ -
T * pointer
The type of a pointer to the type we store.
Definition arraylist.hh:89
│ │ │ │ -
ConstArrayListIterator< MemberType, N, A > const_iterator
A constant random access iterator.
Definition arraylist.hh:110
│ │ │ │ -
std::ptrdiff_t difference_type
The difference type.
Definition arraylist.hh:120
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:434
│ │ │ │ +
auto getMPIData(T &t)
Definition mpidata.hh:43
│ │ │ │ +
Collective communication interface and sequential default implementation.
Definition communication.hh:100
│ │ │ │ +
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
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,698 +1,323 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -arraylist.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpipack.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_ARRAYLIST_HH │ │ │ │ │ -7#define DUNE_COMMON_ARRAYLIST_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include "_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h" │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e │ │ │ │ │ -16{ │ │ │ │ │ -17 // forward declaration │ │ │ │ │ -18 template │ │ │ │ │ -19 class ArrayListIterator; │ │ │ │ │ -20 │ │ │ │ │ -21 template │ │ │ │ │ -22 class ConstArrayListIterator; │ │ │ │ │ -23 │ │ │ │ │ -60 template > │ │ │ │ │ -_6_1 class _A_r_r_a_y_L_i_s_t │ │ │ │ │ -62 { │ │ │ │ │ -63 public: │ │ │ │ │ -_6_9 typedef T _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -70 │ │ │ │ │ -_7_4 typedef T _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +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 <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +27#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_d_a_t_a_._h_h> │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e { │ │ │ │ │ +31 │ │ │ │ │ +_3_2 class _M_P_I_P_a_c_k { │ │ │ │ │ +33 std::vector _buffer; │ │ │ │ │ +34 int _position; │ │ │ │ │ +_3_5 MPI_Comm _comm; │ │ │ │ │ +36 │ │ │ │ │ +37 friend struct _M_P_I_D_a_t_a<_M_P_I_P_a_c_k>; │ │ │ │ │ +38 friend struct _M_P_I_D_a_t_a; │ │ │ │ │ +39 public: │ │ │ │ │ +_4_0 _M_P_I_P_a_c_k(_C_o_m_m_u_n_i_c_a_t_i_o_n_<_M_P_I___C_o_m_m_> comm, std::size_t _s_i_z_e = 0) │ │ │ │ │ +41 : _buffer(_s_i_z_e) │ │ │ │ │ +42 , _position(0) │ │ │ │ │ +43 , _comm(comm) │ │ │ │ │ +44 {} │ │ │ │ │ +45 │ │ │ │ │ +46 // Its not valid to copy a MPIPack but you can move it │ │ │ │ │ +_4_7 _M_P_I_P_a_c_k(const _M_P_I_P_a_c_k&) = delete; │ │ │ │ │ +_4_8 _M_P_I_P_a_c_k& _o_p_e_r_a_t_o_r_ _=_ (const _M_P_I_P_a_c_k& other) = delete; │ │ │ │ │ +_4_9 _M_P_I_P_a_c_k(_M_P_I_P_a_c_k&&) = default; │ │ │ │ │ +_5_0 _M_P_I_P_a_c_k& _o_p_e_r_a_t_o_r_ _=_ (_M_P_I_P_a_c_k&& other) = default; │ │ │ │ │ +51 │ │ │ │ │ +57 template │ │ │ │ │ +_5_8 void _p_a_c_k(const T& data){ │ │ │ │ │ +59 auto mpidata = _g_e_t_M_P_I_D_a_t_a(data); │ │ │ │ │ +60 int _s_i_z_e = _g_e_t_P_a_c_k_S_i_z_e(mpidata.size(), _comm, mpidata.type()); │ │ │ │ │ +61 constexpr bool has_static_size = decltype(_g_e_t_M_P_I_D_a_t_a(std::declval())):: │ │ │ │ │ +static_size; │ │ │ │ │ +62 if(!has_static_size) │ │ │ │ │ +63 _s_i_z_e += _g_e_t_P_a_c_k_S_i_z_e(1, _comm, MPI_INT); │ │ │ │ │ +64 if (_position + _s_i_z_e > 0 && size_t(_position + _s_i_z_e) > _buffer.size()) / │ │ │ │ │ +/ resize buffer if necessary │ │ │ │ │ +65 _buffer.resize(_position + _s_i_z_e); │ │ │ │ │ +66 if(!has_static_size){ │ │ │ │ │ +67 int _s_i_z_e = mpidata.size(); │ │ │ │ │ +68 MPI_Pack(&_s_i_z_e, 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 │ │ │ │ │ -_7_9 typedef T& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -80 │ │ │ │ │ -_8_4 typedef const T& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -85 │ │ │ │ │ -_8_9 typedef T* _p_o_i_n_t_e_r; │ │ │ │ │ -90 │ │ │ │ │ -_9_4 typedef const T* _c_o_n_s_t___p_o_i_n_t_e_r; │ │ │ │ │ -95 │ │ │ │ │ -_1_0_0 constexpr static int _c_h_u_n_k_S_i_z_e__ = (N > 0) ? N : 1; │ │ │ │ │ -101 │ │ │ │ │ -_1_0_5 typedef _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_> _i_t_e_r_a_t_o_r; │ │ │ │ │ -106 │ │ │ │ │ -_1_1_0 typedef _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_> _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -111 │ │ │ │ │ -_1_1_5 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ +80 template │ │ │ │ │ +_8_1 auto /*void*/ _u_n_p_a_c_k(T& data) │ │ │ │ │ +82 -> std::enable_if_t │ │ │ │ │ +83 { │ │ │ │ │ +84 auto mpidata = _g_e_t_M_P_I_D_a_t_a(data); │ │ │ │ │ +85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ +86 mpidata.ptr(), mpidata.size(), │ │ │ │ │ +87 mpidata.type(), _comm); │ │ │ │ │ +88 } │ │ │ │ │ +89 │ │ │ │ │ +94 template │ │ │ │ │ +_9_5 auto /*void*/ _u_n_p_a_c_k(T& data) │ │ │ │ │ +96 -> std::enable_if_t │ │ │ │ │ +97 { │ │ │ │ │ +98 auto mpidata = _g_e_t_M_P_I_D_a_t_a(data); │ │ │ │ │ +99 int _s_i_z_e = 0; │ │ │ │ │ +100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ +101 &_s_i_z_e, 1, │ │ │ │ │ +102 MPI_INT, _comm); │ │ │ │ │ +103 mpidata.resize(_s_i_z_e); │ │ │ │ │ +104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ +105 mpidata.ptr(), mpidata.size(), │ │ │ │ │ +106 mpidata.type(), _comm); │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +109 │ │ │ │ │ +111 template │ │ │ │ │ +_1_1_2 friend _M_P_I_P_a_c_k& _o_p_e_r_a_t_o_r_ _<_<_ (_M_P_I_P_a_c_k& p, const T& t){ │ │ │ │ │ +113 p._p_a_c_k(t); │ │ │ │ │ +114 return p; │ │ │ │ │ +115 } │ │ │ │ │ 116 │ │ │ │ │ -_1_2_0 typedef std::ptrdiff_t _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -121 │ │ │ │ │ -_1_2_6 _i_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ -127 │ │ │ │ │ -_1_3_3 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -134 │ │ │ │ │ -_1_3_9 _i_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ -140 │ │ │ │ │ -_1_4_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -146 │ │ │ │ │ -_1_5_1 inline void _p_u_s_h___b_a_c_k(_c_o_n_s_t___r_e_f_e_r_e_n_c_e entry); │ │ │ │ │ -152 │ │ │ │ │ -_1_5_8 inline _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e i); │ │ │ │ │ -159 │ │ │ │ │ -_1_6_5 inline _c_o_n_s_t___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e i) const; │ │ │ │ │ -166 │ │ │ │ │ -_1_7_1 inline _s_i_z_e___t_y_p_e _s_i_z_e() const; │ │ │ │ │ -172 │ │ │ │ │ -_1_8_0 inline void _p_u_r_g_e(); │ │ │ │ │ -181 │ │ │ │ │ -_1_8_5 inline void _c_l_e_a_r(); │ │ │ │ │ -_1_8_9 _A_r_r_a_y_L_i_s_t(); │ │ │ │ │ -190 │ │ │ │ │ -191 private: │ │ │ │ │ +118 template │ │ │ │ │ +_1_1_9 friend _M_P_I_P_a_c_k& _o_p_e_r_a_t_o_r_ _>_>_ (_M_P_I_P_a_c_k& p, T& t){ │ │ │ │ │ +120 p._u_n_p_a_c_k(t); │ │ │ │ │ +121 return p; │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +125 template │ │ │ │ │ +_1_2_6 _M_P_I_P_a_c_k& _r_e_a_d(T& t){ │ │ │ │ │ +127 _u_n_p_a_c_k(t); │ │ │ │ │ +128 return *this; │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +132 template │ │ │ │ │ +_1_3_3 _M_P_I_P_a_c_k& _w_r_i_t_e(const T& t){ │ │ │ │ │ +134 _p_a_c_k(t); │ │ │ │ │ +135 return *this; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +_1_4_1 void _r_e_s_i_z_e(size_t _s_i_z_e){ │ │ │ │ │ +142 _buffer.resize(_s_i_z_e); │ │ │ │ │ +143 } │ │ │ │ │ +144 │ │ │ │ │ +_1_4_7 void _e_n_l_a_r_g_e(int s) { │ │ │ │ │ +148 _buffer.resize(_buffer.size() + s); │ │ │ │ │ +149 } │ │ │ │ │ +150 │ │ │ │ │ +_1_5_3 size_t _s_i_z_e() const { │ │ │ │ │ +154 return _buffer.size(); │ │ │ │ │ +155 } │ │ │ │ │ +156 │ │ │ │ │ +_1_6_0 void _s_e_e_k(int p){ │ │ │ │ │ +161 _position = p; │ │ │ │ │ +162 } │ │ │ │ │ +163 │ │ │ │ │ +_1_6_7 int _t_e_l_l() const{ │ │ │ │ │ +168 return _position; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_7_3 bool _e_o_f() const{ │ │ │ │ │ +174 return std::size_t(_position)==_buffer.size(); │ │ │ │ │ +175 } │ │ │ │ │ +176 │ │ │ │ │ +_1_8_0 static int _g_e_t_P_a_c_k_S_i_z_e(int len, const MPI_Comm& comm, const MPI_Datatype& │ │ │ │ │ +dt){ │ │ │ │ │ +181 int _s_i_z_e; │ │ │ │ │ +182 MPI_Pack_size(len, dt, comm, &_s_i_z_e); │ │ │ │ │ +183 return _s_i_z_e; │ │ │ │ │ +184 } │ │ │ │ │ +185 │ │ │ │ │ +_1_8_6 friend bool _o_p_e_r_a_t_o_r_=_=(const _M_P_I_P_a_c_k& a, const _M_P_I_P_a_c_k& b) { │ │ │ │ │ +187 return a._buffer == b._buffer && a._comm == b._comm; │ │ │ │ │ +188 } │ │ │ │ │ +_1_8_9 friend bool _o_p_e_r_a_t_o_r_!_=(const _M_P_I_P_a_c_k& a, const _M_P_I_P_a_c_k& b) { │ │ │ │ │ +190 return !(a==b); │ │ │ │ │ +191 } │ │ │ │ │ 192 │ │ │ │ │ -196 using SmartPointerAllocator = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc< std::shared_ptr< std::array > >; │ │ │ │ │ -197 │ │ │ │ │ -201 using ArrayAllocator = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc< std::array >; │ │ │ │ │ -202 │ │ │ │ │ -206 friend class _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -207 friend class _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +193 }; │ │ │ │ │ +194 │ │ │ │ │ +195 template │ │ │ │ │ +_1_9_6 struct _M_P_I_D_a_t_a, │ │ │ │ │ +MPIPack>::value>> { │ │ │ │ │ +197 protected: │ │ │ │ │ +_1_9_8 friend auto getMPIData

(P& t); │ │ │ │ │ +_1_9_9 _M_P_I_D_a_t_a(P& t) : │ │ │ │ │ +200 _d_a_t_a__(t) │ │ │ │ │ +201 {} │ │ │ │ │ +202 public: │ │ │ │ │ +_2_0_3 static constexpr bool _s_t_a_t_i_c___s_i_z_e = std::is_const

::value; │ │ │ │ │ +204 │ │ │ │ │ +_2_0_5 void* _p_t_r() { │ │ │ │ │ +206 return (void*) _d_a_t_a__._buffer.data(); │ │ │ │ │ +207 } │ │ │ │ │ 208 │ │ │ │ │ -210 std::vector >, │ │ │ │ │ -211 SmartPointerAllocator> chunks_; │ │ │ │ │ -220 _s_i_z_e___t_y_p_e capacity_; │ │ │ │ │ -222 _s_i_z_e___t_y_p_e size_; │ │ │ │ │ -224 _s_i_z_e___t_y_p_e start_; │ │ │ │ │ -233 inline _r_e_f_e_r_e_n_c_e elementAt(_s_i_z_e___t_y_p_e i); │ │ │ │ │ -234 │ │ │ │ │ -_2_4_3 inline _c_o_n_s_t___r_e_f_e_r_e_n_c_e elementAt(_s_i_z_e___t_y_p_e i) const; │ │ │ │ │ -244 }; │ │ │ │ │ -245 │ │ │ │ │ -246 │ │ │ │ │ -250 template │ │ │ │ │ -_2_5_1 class _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r : public │ │ │ │ │ -_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e, │ │ │ │ │ -252 typename A::value_type, │ │ │ │ │ -253 typename A::value_type &, │ │ │ │ │ -254 typename A::difference_type> │ │ │ │ │ -255 { │ │ │ │ │ -256 │ │ │ │ │ -257 friend class _A_r_r_a_y_L_i_s_t; │ │ │ │ │ -258 friend class _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -259 public: │ │ │ │ │ -_2_6_3 typedef typename A::value_type _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -264 │ │ │ │ │ -_2_6_5 typedef typename A::difference_type _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -266 │ │ │ │ │ -_2_6_7 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -268 │ │ │ │ │ -_2_6_9 using _r_e_f_e_r_e_n_c_e = typename A::value_type &; │ │ │ │ │ -270 │ │ │ │ │ -_2_7_1 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = typename A::value_type const&; │ │ │ │ │ -272 │ │ │ │ │ -_2_7_8 constexpr static int _c_h_u_n_k_S_i_z_e__ = (N > 0) ? N : 1; │ │ │ │ │ -279 │ │ │ │ │ -280 │ │ │ │ │ -286 inline bool _e_q_u_a_l_s(const _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) const; │ │ │ │ │ -287 │ │ │ │ │ -293 inline bool _e_q_u_a_l_s(const _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) │ │ │ │ │ -const; │ │ │ │ │ -294 │ │ │ │ │ -298 inline void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -299 │ │ │ │ │ -303 inline void _d_e_c_r_e_m_e_n_t(); │ │ │ │ │ -304 │ │ │ │ │ -309 inline _r_e_f_e_r_e_n_c_e _e_l_e_m_e_n_t_A_t(_s_i_z_e___t_y_p_e i) const; │ │ │ │ │ -310 │ │ │ │ │ -315 inline _r_e_f_e_r_e_n_c_e _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ -316 │ │ │ │ │ -328 inline void _e_r_a_s_e_T_o_H_e_r_e(); │ │ │ │ │ -329 │ │ │ │ │ -_3_3_1 inline _s_i_z_e___t_y_p_e _p_o_s_i_t_i_o_n(){return position_;} │ │ │ │ │ -332 │ │ │ │ │ -334 inline void _a_d_v_a_n_c_e(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n); │ │ │ │ │ -335 │ │ │ │ │ -337 inline _d_i_f_f_e_r_e_n_c_e___t_y_p_e _d_i_s_t_a_n_c_e_T_o(const _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& other) │ │ │ │ │ -const; │ │ │ │ │ -338 │ │ │ │ │ -_3_4_0 inline _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r() : position_(0), list_(nullptr) │ │ │ │ │ -341 {} │ │ │ │ │ -342 │ │ │ │ │ -343 private: │ │ │ │ │ -349 inline _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(_A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>& arrayList, _s_i_z_e___t_y_p_e _p_o_s_i_t_i_o_n); │ │ │ │ │ -350 │ │ │ │ │ -354 _s_i_z_e___t_y_p_e position_; │ │ │ │ │ -_3_5_8 _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>* list_; │ │ │ │ │ -359 }; │ │ │ │ │ -360 │ │ │ │ │ -364 template │ │ │ │ │ -_3_6_5 class _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -366 : public _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e, │ │ │ │ │ -367 const typename A::value_type, │ │ │ │ │ -368 typename A::value_type const&, │ │ │ │ │ -369 typename A::difference_type> │ │ │ │ │ -370 { │ │ │ │ │ -371 │ │ │ │ │ -372 friend class _A_r_r_a_y_L_i_s_t; │ │ │ │ │ -373 friend class _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -374 │ │ │ │ │ -375 public: │ │ │ │ │ -_3_7_9 typedef typename A::value_type _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -380 │ │ │ │ │ -_3_8_1 typedef typename A::difference_type _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -382 │ │ │ │ │ -_3_8_3 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -384 │ │ │ │ │ -_3_8_5 using _r_e_f_e_r_e_n_c_e = typename A::value_type &; │ │ │ │ │ -386 │ │ │ │ │ -_3_8_7 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = typename A::value_type const&; │ │ │ │ │ -388 │ │ │ │ │ -_3_9_4 constexpr static int _c_h_u_n_k_S_i_z_e__ = (N > 0) ? N : 1; │ │ │ │ │ -395 │ │ │ │ │ -_4_0_1 inline bool _e_q_u_a_l_s(const _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) │ │ │ │ │ -const; │ │ │ │ │ -402 │ │ │ │ │ -_4_0_6 inline void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -407 │ │ │ │ │ -_4_1_1 inline void _d_e_c_r_e_m_e_n_t(); │ │ │ │ │ -412 │ │ │ │ │ -_4_1_4 inline void _a_d_v_a_n_c_e(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n); │ │ │ │ │ -415 │ │ │ │ │ -_4_1_7 inline _d_i_f_f_e_r_e_n_c_e___t_y_p_e _d_i_s_t_a_n_c_e_T_o(const _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& │ │ │ │ │ -other) const; │ │ │ │ │ -418 │ │ │ │ │ -_4_2_3 inline _c_o_n_s_t___r_e_f_e_r_e_n_c_e _e_l_e_m_e_n_t_A_t(_s_i_z_e___t_y_p_e i) const; │ │ │ │ │ -424 │ │ │ │ │ -_4_2_9 inline _c_o_n_s_t___r_e_f_e_r_e_n_c_e _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ -430 │ │ │ │ │ -_4_3_1 inline _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r() : position_(0), list_(nullptr) │ │ │ │ │ -432 {} │ │ │ │ │ -433 │ │ │ │ │ -_4_3_4 inline _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(const _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& other); │ │ │ │ │ -435 │ │ │ │ │ -436 private: │ │ │ │ │ -437 │ │ │ │ │ -443 inline _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(const _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>& arrayList, _s_i_z_e___t_y_p_e │ │ │ │ │ -position); │ │ │ │ │ -444 │ │ │ │ │ -448 _s_i_z_e___t_y_p_e position_; │ │ │ │ │ -452 const _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>* list_; │ │ │ │ │ -453 }; │ │ │ │ │ -454 │ │ │ │ │ -455 │ │ │ │ │ -456 template │ │ │ │ │ -_4_5_7 _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_A_r_r_a_y_L_i_s_t() │ │ │ │ │ -458 : capacity_(0), size_(0), start_(0) │ │ │ │ │ -459 { │ │ │ │ │ -460 chunks_.reserve(100); │ │ │ │ │ -461 } │ │ │ │ │ -462 │ │ │ │ │ -463 template │ │ │ │ │ -_4_6_4 void _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_c_l_e_a_r(){ │ │ │ │ │ -465 capacity_=0; │ │ │ │ │ -466 size_=0; │ │ │ │ │ -467 start_=0; │ │ │ │ │ -468 chunks_.clear(); │ │ │ │ │ -469 } │ │ │ │ │ -470 │ │ │ │ │ -471 template │ │ │ │ │ -_4_7_2 size_t _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_s_i_z_e() const │ │ │ │ │ -473 { │ │ │ │ │ -474 return size_; │ │ │ │ │ -475 } │ │ │ │ │ -476 │ │ │ │ │ -477 template │ │ │ │ │ -_4_7_8 void _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_p_u_s_h___b_a_c_k(_c_o_n_s_t___r_e_f_e_r_e_n_c_e entry) │ │ │ │ │ -479 { │ │ │ │ │ -480 size_t index=start_+size_; │ │ │ │ │ -481 if(index==capacity_) │ │ │ │ │ -482 { │ │ │ │ │ -483 chunks_.push_back(std::make_shared >()); │ │ │ │ │ -484 capacity_ += chunkSize_; │ │ │ │ │ -485 } │ │ │ │ │ -486 elementAt(index)=entry; │ │ │ │ │ -487 ++size_; │ │ │ │ │ -488 } │ │ │ │ │ -489 │ │ │ │ │ -490 template │ │ │ │ │ -_4_9_1 typename _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_r_e_f_e_r_e_n_c_e _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e │ │ │ │ │ -i) │ │ │ │ │ -492 { │ │ │ │ │ -493 return elementAt(start_+i); │ │ │ │ │ -494 } │ │ │ │ │ -495 │ │ │ │ │ -496 │ │ │ │ │ -497 template │ │ │ │ │ -_4_9_8 typename _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -499 { │ │ │ │ │ -500 return elementAt(start_+i); │ │ │ │ │ -501 } │ │ │ │ │ -502 │ │ │ │ │ -503 template │ │ │ │ │ -504 typename _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_r_e_f_e_r_e_n_c_e _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_e_l_e_m_e_n_t_A_t(size_type │ │ │ │ │ -i) │ │ │ │ │ -505 { │ │ │ │ │ -506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_); │ │ │ │ │ -507 } │ │ │ │ │ -508 │ │ │ │ │ -509 │ │ │ │ │ -510 template │ │ │ │ │ -511 typename ArrayList::const_reference ArrayList::elementAt │ │ │ │ │ -(size_type i) const │ │ │ │ │ -512 { │ │ │ │ │ -513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_); │ │ │ │ │ -514 } │ │ │ │ │ -515 │ │ │ │ │ -516 template │ │ │ │ │ -_5_1_7 _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_> _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_b_e_g_i_n() │ │ │ │ │ -518 { │ │ │ │ │ -519 return _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>(*this, start_); │ │ │ │ │ -520 } │ │ │ │ │ -521 │ │ │ │ │ -522 template │ │ │ │ │ -_5_2_3 _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_> _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_b_e_g_i_n() const │ │ │ │ │ -524 { │ │ │ │ │ -525 return _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>(*this, start_); │ │ │ │ │ -526 } │ │ │ │ │ -527 │ │ │ │ │ -528 template │ │ │ │ │ -_5_2_9 _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_> _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_e_n_d() │ │ │ │ │ -530 { │ │ │ │ │ -531 return _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>(*this, start_+size_); │ │ │ │ │ -532 } │ │ │ │ │ -533 │ │ │ │ │ -534 template │ │ │ │ │ -_5_3_5 _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_> _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_e_n_d() const │ │ │ │ │ -536 { │ │ │ │ │ -537 return _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>(*this, start_+size_); │ │ │ │ │ -538 } │ │ │ │ │ -539 │ │ │ │ │ -540 template │ │ │ │ │ -_5_4_1 void _A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>_:_:_p_u_r_g_e() │ │ │ │ │ -542 { │ │ │ │ │ -543 // Distance to copy to the left. │ │ │ │ │ -544 size_t distance = start_/chunkSize_; │ │ │ │ │ -545 if(distance>0) { │ │ │ │ │ -546 // Number of chunks with entries in it; │ │ │ │ │ -547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ ); │ │ │ │ │ -548 │ │ │ │ │ -549 // Copy chunks to the left. │ │ │ │ │ -550 std::copy(chunks_.begin()+distance, │ │ │ │ │ -551 chunks_.begin()+(distance+chunks), chunks_.begin()); │ │ │ │ │ -552 │ │ │ │ │ -553 // Calculate new parameters │ │ │ │ │ -554 start_ = start_ % chunkSize_; │ │ │ │ │ -555 //capacity += distance * chunkSize_; │ │ │ │ │ -556 } │ │ │ │ │ -557 } │ │ │ │ │ -558 │ │ │ │ │ -559 template │ │ │ │ │ -_5_6_0 void _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_a_d_v_a_n_c_e(_d_i_f_f_e_r_e_n_c_e___t_y_p_e i) │ │ │ │ │ -561 { │ │ │ │ │ -562 position_+=i; │ │ │ │ │ -563 } │ │ │ │ │ -564 │ │ │ │ │ -565 template │ │ │ │ │ -_5_6_6 void _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_a_d_v_a_n_c_e(_d_i_f_f_e_r_e_n_c_e___t_y_p_e i) │ │ │ │ │ -567 { │ │ │ │ │ -568 position_+=i; │ │ │ │ │ -569 } │ │ │ │ │ -570 │ │ │ │ │ -571 │ │ │ │ │ -572 template │ │ │ │ │ -_5_7_3 bool _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_e_q_u_a_l_s(const │ │ │ │ │ -_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) const │ │ │ │ │ -574 { │ │ │ │ │ -575 // Makes only sense if we reference a common list │ │ │ │ │ -576 assert(list_==(other.list_)); │ │ │ │ │ -577 return position_==other.position_ ; │ │ │ │ │ -578 } │ │ │ │ │ -579 │ │ │ │ │ -580 │ │ │ │ │ -581 template │ │ │ │ │ -_5_8_2 bool _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_e_q_u_a_l_s(const │ │ │ │ │ -_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) const │ │ │ │ │ -583 { │ │ │ │ │ -584 // Makes only sense if we reference a common list │ │ │ │ │ -585 assert(list_==(other.list_)); │ │ │ │ │ -586 return position_==other.position_ ; │ │ │ │ │ -587 } │ │ │ │ │ -588 │ │ │ │ │ -589 │ │ │ │ │ -590 template │ │ │ │ │ -_5_9_1 bool _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_e_q_u_a_l_s(const │ │ │ │ │ -_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_M_e_m_b_e_r_T_y_p_e_,_N_,_A_>& other) const │ │ │ │ │ -592 { │ │ │ │ │ -593 // Makes only sense if we reference a common list │ │ │ │ │ -594 assert(list_==(other.list_)); │ │ │ │ │ -595 return position_==other.position_ ; │ │ │ │ │ -596 } │ │ │ │ │ -597 │ │ │ │ │ -598 template │ │ │ │ │ -_5_9_9 void _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_i_n_c_r_e_m_e_n_t() │ │ │ │ │ -600 { │ │ │ │ │ -601 ++position_; │ │ │ │ │ -602 } │ │ │ │ │ -603 │ │ │ │ │ -604 template │ │ │ │ │ -_6_0_5 void _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_i_n_c_r_e_m_e_n_t() │ │ │ │ │ -606 { │ │ │ │ │ -607 ++position_; │ │ │ │ │ -608 } │ │ │ │ │ -609 │ │ │ │ │ -610 template │ │ │ │ │ -_6_1_1 void _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_e_c_r_e_m_e_n_t() │ │ │ │ │ -612 { │ │ │ │ │ -613 --position_; │ │ │ │ │ -614 } │ │ │ │ │ -615 │ │ │ │ │ -616 template │ │ │ │ │ -_6_1_7 void _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_e_c_r_e_m_e_n_t() │ │ │ │ │ -618 { │ │ │ │ │ -619 --position_; │ │ │ │ │ -620 } │ │ │ │ │ -621 │ │ │ │ │ -622 template │ │ │ │ │ -_6_2_3 typename _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_r_e_f_e_r_e_n_c_e _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_: │ │ │ │ │ -_e_l_e_m_e_n_t_A_t(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -624 { │ │ │ │ │ -625 return list_->elementAt(i+position_); │ │ │ │ │ -626 } │ │ │ │ │ -627 │ │ │ │ │ -628 template │ │ │ │ │ -_6_2_9 typename _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_e_l_e_m_e_n_t_A_t(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -630 { │ │ │ │ │ -631 return list_->elementAt(i+position_); │ │ │ │ │ -632 } │ │ │ │ │ -633 │ │ │ │ │ -634 template │ │ │ │ │ -_6_3_5 typename _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_r_e_f_e_r_e_n_c_e _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_: │ │ │ │ │ -_d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -636 { │ │ │ │ │ -637 return list_->elementAt(position_); │ │ │ │ │ -638 } │ │ │ │ │ -639 │ │ │ │ │ -640 template │ │ │ │ │ -_6_4_1 typename _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -642 { │ │ │ │ │ -643 return list_->elementAt(position_); │ │ │ │ │ -644 } │ │ │ │ │ -645 │ │ │ │ │ -646 template │ │ │ │ │ -_6_4_7 typename _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_i_s_t_a_n_c_e_T_o(const _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& other) │ │ │ │ │ -const │ │ │ │ │ -648 { │ │ │ │ │ -649 // Makes only sense if we reference a common list │ │ │ │ │ -650 assert(list_==(other.list_)); │ │ │ │ │ -651 return other.position_ - position_; │ │ │ │ │ -652 } │ │ │ │ │ -653 │ │ │ │ │ -654 template │ │ │ │ │ -_6_5_5 typename _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_d_i_s_t_a_n_c_e_T_o(const _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& │ │ │ │ │ -other) const │ │ │ │ │ -656 { │ │ │ │ │ -657 // Makes only sense if we reference a common list │ │ │ │ │ -658 assert(list_==(other.list_)); │ │ │ │ │ -659 return other.position_ - position_; │ │ │ │ │ -660 } │ │ │ │ │ -661 │ │ │ │ │ -662 template │ │ │ │ │ -_6_6_3 void _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_e_r_a_s_e_T_o_H_e_r_e() │ │ │ │ │ -664 { │ │ │ │ │ -665 list_->size_ -= ++position_ - list_->start_; │ │ │ │ │ -666 // chunk number of the new position. │ │ │ │ │ -667 size_t posChunkStart = position_ / chunkSize_; │ │ │ │ │ -668 // number of chunks to deallocate │ │ │ │ │ -669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_) │ │ │ │ │ -670 / chunkSize_; │ │ │ │ │ -671 list_->start_ = position_; │ │ │ │ │ -672 │ │ │ │ │ -673 // Deallocate memory not needed any more. │ │ │ │ │ -674 for(size_t chunk=0; chunkchunks_[posChunkStart].reset(); │ │ │ │ │ -677 } │ │ │ │ │ -678 │ │ │ │ │ -679 // Capacity stays the same as the chunks before us │ │ │ │ │ -680 // are still there. They null pointers. │ │ │ │ │ -681 assert(list_->start_+list_->size_<=list_->capacity_); │ │ │ │ │ -682 } │ │ │ │ │ -683 │ │ │ │ │ -684 template │ │ │ │ │ -685 _A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(_A_r_r_a_y_L_i_s_t_<_T_,_N_,_A_>& arrayList, │ │ │ │ │ -size_type position) │ │ │ │ │ -686 : position_(position), list_(&arrayList) │ │ │ │ │ -687 {} │ │ │ │ │ -688 │ │ │ │ │ -689 │ │ │ │ │ -690 template │ │ │ │ │ -691 _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(const │ │ │ │ │ -ArrayList& arrayList, │ │ │ │ │ -692 size_type position) │ │ │ │ │ -693 : position_(position), list_(&arrayList) │ │ │ │ │ -694 {} │ │ │ │ │ -695 │ │ │ │ │ -696 template │ │ │ │ │ -_6_9_7 _C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r(const │ │ │ │ │ -_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_N_,_A_>& other) │ │ │ │ │ -698 : position_(other.position_), list_(other.list_) │ │ │ │ │ -699 {} │ │ │ │ │ -700 │ │ │ │ │ -701 │ │ │ │ │ -703} │ │ │ │ │ -704#endif │ │ │ │ │ -_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Get the element at specific position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:491 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -Get an iterator that is positioned at the first element. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:517 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const ArrayListIterator< MemberType, N, A > &other) const │ │ │ │ │ -Comares two iterators. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:573 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment the iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:599 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Get the number of elements in the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:472 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstArrayListIterator(const ArrayListIterator< T, N, A > &other) │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:697 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_p_u_r_g_e │ │ │ │ │ -void purge() │ │ │ │ │ -Purge the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -decrement the iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:611 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_r_a_s_e_T_o_H_e_r_e │ │ │ │ │ -void eraseToHere() │ │ │ │ │ -Erase all entries before the current position and the one at the current │ │ │ │ │ -position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:663 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_A_r_r_a_y_L_i_s_t │ │ │ │ │ -ArrayList() │ │ │ │ │ -Constructs an Array list with one chunk. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:457 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get a random access iterator that is positioned at the first element. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:523 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment the iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:605 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_e_n_d │ │ │ │ │ -iterator end() │ │ │ │ │ -Get a random access iterator positioned after the last element. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:529 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -const_reference elementAt(size_type i) const │ │ │ │ │ -Get the value of the list at an arbitrary position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:629 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const_reference operator[](size_type i) const │ │ │ │ │ -Get the element at specific position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:498 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -decrement the iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:617 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -void advance(difference_type n) │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:566 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get a random access iterator positioned after the last element. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:535 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -const_reference dereference() const │ │ │ │ │ -Access the element at the current position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:641 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Delete all entries from the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:464 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -reference elementAt(size_type i) const │ │ │ │ │ -Get the value of the list at an arbitrary position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:623 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const │ │ │ │ │ -Comares to iterators. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:591 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -void advance(difference_type n) │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:655 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -reference dereference() const │ │ │ │ │ -Access the element at the current position. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:635 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ -void push_back(const_reference entry) │ │ │ │ │ -Append an entry to the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:478 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:647 │ │ │ │ │ +_2_0_9 int _s_i_z_e() { │ │ │ │ │ +210 return _d_a_t_a__.size(); │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +_2_1_3 MPI_Datatype _t_y_p_e() const{ │ │ │ │ │ +214 return MPI_PACKED; │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +_2_1_7 void _r_e_s_i_z_e(int _s_i_z_e){ │ │ │ │ │ +218 _d_a_t_a__.resize(_s_i_z_e); │ │ │ │ │ +219 } │ │ │ │ │ +220 protected: │ │ │ │ │ +_2_2_1 P& _d_a_t_a__; │ │ │ │ │ +222 }; │ │ │ │ │ +223 │ │ │ │ │ +224} // end namespace Dune │ │ │ │ │ +225 │ │ │ │ │ +226#endif │ │ │ │ │ +227#endif │ │ │ │ │ +_m_p_i_d_a_t_a_._h_h │ │ │ │ │ +Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ +MPI calls. │ │ │ │ │ +_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -A random access iterator for the Dune::ArrayList class. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ -size_type position() │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:331 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ -A::value_type MemberType │ │ │ │ │ -The member type. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ArrayListIterator() │ │ │ │ │ -Standard constructor. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -A::difference_type difference_type │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:265 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_c_h_u_n_k_S_i_z_e__ │ │ │ │ │ -static constexpr int chunkSize_ │ │ │ │ │ -The number of elements in one chunk of the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename A::value_type const & const_reference │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename A::value_type & reference │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -A constant random access iterator for the Dune::ArrayList class. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:370 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_c_h_u_n_k_S_i_z_e__ │ │ │ │ │ -static constexpr int chunkSize_ │ │ │ │ │ -The number of elements in one chunk of the list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:394 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename A::value_type & reference │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:385 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstArrayListIterator() │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:431 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ -A::value_type MemberType │ │ │ │ │ -The member type. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -A::difference_type difference_type │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:381 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -typename A::value_type const & const_reference │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:387 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_s_t_A_r_r_a_y_L_i_s_t_I_t_e_r_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:383 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t │ │ │ │ │ -A dynamically growing random access list. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -T value_type │ │ │ │ │ -Value type for stl compliance. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_h_u_n_k_S_i_z_e__ │ │ │ │ │ -static constexpr int chunkSize_ │ │ │ │ │ -The number of elements in one chunk of the list. This has to be at least one. │ │ │ │ │ -The default is 100. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ -const T * const_pointer │ │ │ │ │ -The type of a const pointer to the type we store. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -ArrayListIterator< MemberType, N, A > iterator │ │ │ │ │ -A random access iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const T & const_reference │ │ │ │ │ -The type of a const reference to the type we store. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -T & reference │ │ │ │ │ -The type of a reference to the type we store. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The size type. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ -T MemberType │ │ │ │ │ -The member type that is stored. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_p_o_i_n_t_e_r │ │ │ │ │ -T * pointer │ │ │ │ │ -The type of a pointer to the type we store. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -ConstArrayListIterator< MemberType, N, A > const_iterator │ │ │ │ │ -A constant random access iterator. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_A_r_r_a_y_L_i_s_t_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -std::ptrdiff_t difference_type │ │ │ │ │ -The difference type. │ │ │ │ │ -DDeeffiinniittiioonn arraylist.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:434 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t_M_P_I_D_a_t_a │ │ │ │ │ +auto getMPIData(T &t) │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Collective communication interface and sequential default implementation. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_d_a_t_a__ │ │ │ │ │ +T & data_ │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_s_i_z_e │ │ │ │ │ +int size() const │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_:_:_s_t_a_t_i_c___s_i_z_e │ │ │ │ │ +static constexpr bool static_size │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_e_n_l_a_r_g_e │ │ │ │ │ +void enlarge(int s) │ │ │ │ │ +Enlarges the internal buffer. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ +friend MPIPack & operator>>(MPIPack &p, T &t) │ │ │ │ │ +Unpacks data from the object. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +friend MPIPack & operator<<(MPIPack &p, const T &t) │ │ │ │ │ +Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +friend bool operator!=(const MPIPack &a, const MPIPack &b) │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_s_i_z_e │ │ │ │ │ +size_t size() const │ │ │ │ │ +Returns the size of the internal buffer. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +MPIPack & operator=(const MPIPack &other)=delete │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_M_P_I_P_a_c_k │ │ │ │ │ +MPIPack(Communication< MPI_Comm > comm, std::size_t size=0) │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_p_a_c_k │ │ │ │ │ +void pack(const T &data) │ │ │ │ │ +Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_u_n_p_a_c_k │ │ │ │ │ +auto unpack(T &data) -> std::enable_if_t │ │ │ │ │ +Unpacks data from the object. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_u_n_p_a_c_k │ │ │ │ │ +auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data)):: │ │ │ │ │ +static_size, void > │ │ │ │ │ +Unpacks data from the object. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +friend bool operator==(const MPIPack &a, const MPIPack &b) │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_M_P_I_P_a_c_k │ │ │ │ │ +MPIPack(const MPIPack &)=delete │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_s_e_e_k │ │ │ │ │ +void seek(int p) │ │ │ │ │ +Sets the position in the buffer where the next pack/unpack operation should │ │ │ │ │ +take place. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_e_o_f │ │ │ │ │ +bool eof() const │ │ │ │ │ +Checks whether the end of the buffer is reached. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_t size) │ │ │ │ │ +Resizes the internal buffer. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_t_e_l_l │ │ │ │ │ +int tell() const │ │ │ │ │ +Gets the position in the buffer where the next pack/unpack operation should │ │ │ │ │ +take place. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_M_P_I_P_a_c_k │ │ │ │ │ +MPIPack(MPIPack &&)=default │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_r_e_a_d │ │ │ │ │ +MPIPack & read(T &t) │ │ │ │ │ +Unpacks data from the object. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_g_e_t_P_a_c_k_S_i_z_e │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_P_a_c_k_:_:_w_r_i_t_e │ │ │ │ │ +MPIPack & write(const T &t) │ │ │ │ │ +Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +MPI_Datatype type() const │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:213 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_M_P_I_D_a_t_a │ │ │ │ │ +MPIData(P &t) │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_s_i_z_e │ │ │ │ │ +int size() │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_p_t_r │ │ │ │ │ +void * ptr() │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_d_a_t_a__ │ │ │ │ │ +P & data_ │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_D_a_t_a_<_ _P_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_<_ _s_t_d_:_:_r_e_m_o_v_e___c_o_n_s_t___t_<_ _P_ _>_, │ │ │ │ │ +_M_P_I_P_a_c_k_ _>_:_:_v_a_l_u_e_ _>_ _>_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(int size) │ │ │ │ │ +DDeeffiinniittiioonn mpipack.hh:217 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.cc File Reference │ │ │ │ +dune-common: mpicommunication.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,46 +65,112 @@ │ │ │ │

│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
fmatrixev.cc File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
mpicommunication.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Implements an utility class that provides MPI's collective communication methods. │ │ │ │ +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 DUNE_FMATRIXEIGENVALUES_CC
 
#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)
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_FMATRIXEIGENVALUES_CC

│ │ │ │ +

Detailed Description

│ │ │ │ +

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

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ ComposeMPIOp

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │
#define DUNE_FMATRIXEIGENVALUES_CC#define ComposeMPIOp( func,
 op 
)
│ │ │ │
│ │ │ │ - │ │ │ │ +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 & ) {} \
│ │ │ │ +
}
│ │ │ │ +
STL namespace.
│ │ │ │ +
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,69 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -fmatrixev.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +mpicommunication.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_i_n_a_r_y_f_u_n_c_t_i_o_n_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_f_u_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_d_a_t_a_._h_h> │ │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_G_e_n_e_r_i_c___M_P_I___O_p_<_ _T_y_p_e_,_ _B_i_n_a_r_y_F_u_n_c_t_i_o_n_,_ _E_n_a_b_l_e_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _M_P_I___C_o_m_m_ _> │ │ │ │ │ +  Specialization of _C_o_m_m_u_n_i_c_a_t_i_o_n for MPI. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ │ +  │ │ │ │ │ MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___F_M_A_T_R_I_X_E_I_G_E_N_V_A_L_U_E_S___C_C │ │ │ │ │ +#define  _C_o_m_p_o_s_e_M_P_I_O_p(func, op) │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +  _D_u_n_e_:_:_C_o_m_p_o_s_e_M_P_I_O_p (std::plus, MPI_SUM) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_C_o_m_p_o_s_e_M_P_I_O_p (std::multiplies, MPI_PROD) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_C_o_m_p_o_s_e_M_P_I_O_p (_M_i_n, MPI_MIN) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_C_o_m_p_o_s_e_M_P_I_O_p (_M_a_x, MPI_MAX) │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. │ │ │ │ │ ********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__FFMMAATTRRIIXXEEIIGGEENNVVAALLUUEESS__CCCC ********** │ │ │ │ │ -#define DUNE_FMATRIXEIGENVALUES_CC │ │ │ │ │ +********** _?◆_? CCoommppoosseeMMPPIIOOpp ********** │ │ │ │ │ +#define ComposeMPIOp (   func, │ │ │ │ │ +   op  │ │ │ │ │ + ) │ │ │ │ │ +VVaalluuee:: │ │ │ │ │ +template \ │ │ │ │ │ +class Generic_MPI_Op, _s_t_d::enable_if_t::is_intrinsic> > │ │ │ │ │ +{ \ │ │ │ │ │ +public: \ │ │ │ │ │ +static MPI_Op get(){ \ │ │ │ │ │ +return op; \ │ │ │ │ │ +} \ │ │ │ │ │ +private: \ │ │ │ │ │ +Generic_MPI_Op () {} \ │ │ │ │ │ +Generic_MPI_Op (const Generic_MPI_Op & ) {} \ │ │ │ │ │ +} │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: exceptions.hh File Reference │ │ │ │ +dune-common: future.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,87 +65,49 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
exceptions.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
future.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

A few common exception classes. │ │ │ │ -More...

│ │ │ │ -
#include <exception>
│ │ │ │ -#include <string>
│ │ │ │ -#include <sstream>
│ │ │ │ +
#include <memory>
│ │ │ │ +#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::ExceptionHook
 Base class to add a hook to the Dune::Exception. More...
 
class  Dune::IOError
 Default exception class for I/O errors. More...
 
class  Dune::MathError
 Default exception class for mathematical errors. More...
 
class  Dune::RangeError
 Default exception class for range errors. More...
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::NotImplemented
 Default exception for dummy implementations. 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::SystemError
 Default exception class for OS errors. More...
class  Dune::PseudoFuture< T >
 A wrapper-class for a object which is ready immediately. 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::PseudoFuture< void >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Macros

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

│ │ │ │ -Functions

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

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

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,63 +1,33 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -exceptions.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _E_x_c_e_p_t_i_o_n_ _h_a_n_d_l_i_n_g │ │ │ │ │ -A few common exception classes. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +future.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_E_x_c_e_p_t_i_o_n │ │ │ │ │ -  Base class for Dune-Exceptions. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ + 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. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_t_u_r_e_<_ _T_ _> │ │ │ │ │ +  Type-erasure for future-like objects. A future-like object is a object │ │ │ │ │ + satisfying the interface of FutureBase. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_H_o_o_k │ │ │ │ │ -  Base class to add a hook to the _D_u_n_e_:_:_E_x_c_e_p_t_i_o_n. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _T_ _> │ │ │ │ │ +  A wrapper-class for a object which is ready immediately. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_I_O_E_r_r_o_r │ │ │ │ │ -  Default exception class for I/O errors. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_a_t_h_E_r_r_o_r │ │ │ │ │ -  Default exception class for mathematical errors. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -  Default exception class for range errors. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_N_o_t_I_m_p_l_e_m_e_n_t_e_d │ │ │ │ │ -  Default exception for dummy implementations. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_y_s_t_e_m_E_r_r_o_r │ │ │ │ │ -  Default exception class for OS errors. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_u_t_O_f_M_e_m_o_r_y_E_r_r_o_r │ │ │ │ │ -  Default exception if memory allocation fails. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ -  Default exception if a function was called while the object is not in │ │ │ │ │ - a valid state for that function. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_E_r_r_o_r │ │ │ │ │ -  Default exception if an error in the parallel communication of the │ │ │ │ │ - program occurred. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___T_H_R_O_W(E, m) │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &stream, const _E_x_c_e_p_t_i_o_n &e) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -This file defines a common framework for generating exception subclasses and to │ │ │ │ │ -throw them in a simple manner │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: exceptions.hh Source File │ │ │ │ +dune-common: future.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,123 +70,254 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
exceptions.hh
│ │ │ │ +
future.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
│ │ │ │ -
8
│ │ │ │ -
9#include <exception>
│ │ │ │ -
10#include <string>
│ │ │ │ -
11#include <sstream>
│ │ │ │ +
5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH
│ │ │ │ +
6#define DUNE_COMMON_PARALLEL_FUTURE_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <memory>
│ │ │ │ + │ │ │ │ +
10
│ │ │ │ +
11namespace Dune{
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14
│ │ │ │ -
73 /* forward declarations */
│ │ │ │ -
74 class Exception;
│ │ │ │ -
75 struct ExceptionHook;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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 {}
│ │ │ │ +
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 }
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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 {};
│ │ │ │ -
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
│ │ │ │ +
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.
│ │ │ │
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
│ │ │ │ -
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
│ │ │ │ +
Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
Definition propertymap.hh:84
│ │ │ │
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
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,151 +1,264 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -exceptions.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +future.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH │ │ │ │ │ +6#define DUNE_COMMON_PARALLEL_FUTURE_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e{ │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14 │ │ │ │ │ -73 /* forward declarations */ │ │ │ │ │ -74 class Exception; │ │ │ │ │ -75 struct ExceptionHook; │ │ │ │ │ +_1_7 class _I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n : public _I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +18 {}; │ │ │ │ │ +19 │ │ │ │ │ +20 // forward declaration │ │ │ │ │ +21 template │ │ │ │ │ +22 class _P_s_e_u_d_o_F_u_t_u_r_e; │ │ │ │ │ +23 │ │ │ │ │ +27 template │ │ │ │ │ +_2_8 class _F_u_t_u_r_e{ │ │ │ │ │ +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 _g_e_t() = 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 {} │ │ │ │ │ +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 } │ │ │ │ │ +64 │ │ │ │ │ +65 virtual T _g_e_t() override{ │ │ │ │ │ +66 return (T)_future.get(); │ │ │ │ │ +67 } │ │ │ │ │ +68 }; │ │ │ │ │ +69 │ │ │ │ │ +70 std::unique_ptr _future; │ │ │ │ │ +71 public: │ │ │ │ │ +72 template │ │ │ │ │ +_7_3 _F_u_t_u_r_e(F&& f) │ │ │ │ │ +74 : _future(_s_t_d::make_unique>(_s_t_d::forward(f))) │ │ │ │ │ +75 {} │ │ │ │ │ 76 │ │ │ │ │ -_9_4 class _E_x_c_e_p_t_i_o_n │ │ │ │ │ -95 : public std::exception │ │ │ │ │ -96 { │ │ │ │ │ -97 public: │ │ │ │ │ -98 _E_x_c_e_p_t_i_o_n (); │ │ │ │ │ -99 void _m_e_s_s_a_g_e(const std::string &msg); │ │ │ │ │ -100 const char* _w_h_a_t() const noexcept override; │ │ │ │ │ -101 static void _r_e_g_i_s_t_e_r_H_o_o_k (_E_x_c_e_p_t_i_o_n_H_o_o_k * hook); │ │ │ │ │ -102 static void _c_l_e_a_r_H_o_o_k (); │ │ │ │ │ -103 private: │ │ │ │ │ -104 std::string _message; │ │ │ │ │ -105 static _E_x_c_e_p_t_i_o_n_H_o_o_k * _hook; │ │ │ │ │ -106 }; │ │ │ │ │ -107 │ │ │ │ │ -_1_7_3 struct _E_x_c_e_p_t_i_o_n_H_o_o_k │ │ │ │ │ -174 { │ │ │ │ │ -_1_7_5 virtual _~_E_x_c_e_p_t_i_o_n_H_o_o_k() {} │ │ │ │ │ -_1_7_6 virtual void _o_p_e_r_a_t_o_r_ _(_)_ () = 0; │ │ │ │ │ -177 }; │ │ │ │ │ -178 │ │ │ │ │ -_1_7_9 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream &stream, const _E_x_c_e_p_t_i_o_n &e) │ │ │ │ │ -180 { │ │ │ │ │ -181 return stream << e._w_h_a_t(); │ │ │ │ │ -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 │ │ │ │ │ -_2_1_8#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 │ │ │ │ │ -_2_3_1 class _I_O_E_r_r_o_r : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -232 │ │ │ │ │ -_2_4_1 class _M_a_t_h_E_r_r_o_r : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -242 │ │ │ │ │ -_2_5_4 class _R_a_n_g_e_E_r_r_o_r : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -255 │ │ │ │ │ -_2_6_3 class _N_o_t_I_m_p_l_e_m_e_n_t_e_d : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -264 │ │ │ │ │ -_2_7_1 class _S_y_s_t_e_m_E_r_r_o_r : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -272 │ │ │ │ │ -_2_7_6 class _O_u_t_O_f_M_e_m_o_r_y_E_r_r_o_r : public _S_y_s_t_e_m_E_r_r_o_r {}; │ │ │ │ │ -277 │ │ │ │ │ -_2_8_1 class _I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -282 │ │ │ │ │ -_2_8_7 class _P_a_r_a_l_l_e_l_E_r_r_o_r : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -288 │ │ │ │ │ -289} // end namespace │ │ │ │ │ -290 │ │ │ │ │ -291#endif │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_:_:_E_x_c_e_p_t_i_o_n │ │ │ │ │ -Exception() │ │ │ │ │ -DDeeffiinniittiioonn exceptions.cc:16 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_:_:_r_e_g_i_s_t_e_r_H_o_o_k │ │ │ │ │ -static void registerHook(ExceptionHook *hook) │ │ │ │ │ -add a functor which is called before a Dune::Exception is emitted (see Dune:: │ │ │ │ │ -ExceptionHook) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.cc:22 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_:_:_c_l_e_a_r_H_o_o_k │ │ │ │ │ -static void clearHook() │ │ │ │ │ -remove all hooks │ │ │ │ │ -DDeeffiinniittiioonn exceptions.cc:27 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_:_:_m_e_s_s_a_g_e │ │ │ │ │ -void message(const std::string &msg) │ │ │ │ │ -store string in internal message buffer │ │ │ │ │ -DDeeffiinniittiioonn exceptions.cc:32 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_H_o_o_k_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -virtual void operator()()=0 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_H_o_o_k_:_:_~_E_x_c_e_p_t_i_o_n_H_o_o_k │ │ │ │ │ -virtual ~ExceptionHook() │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_:_:_w_h_a_t │ │ │ │ │ -const char * what() const noexcept override │ │ │ │ │ -output internal message buffer │ │ │ │ │ -DDeeffiinniittiioonn exceptions.cc:37 │ │ │ │ │ +77 template::value && !std:: │ │ │ │ │ +is_same::value>> │ │ │ │ │ +_7_8 _F_u_t_u_r_e(U&& data) │ │ │ │ │ +79 : _future(_s_t_d::make_unique>>(_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +(_s_t_d::forward(data)))) │ │ │ │ │ +80 {} │ │ │ │ │ +81 │ │ │ │ │ +_8_2 _F_u_t_u_r_e() = default; │ │ │ │ │ +83 │ │ │ │ │ +_8_7 void _w_a_i_t(){ │ │ │ │ │ +88 _future->wait(); │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +_9_5 T _g_e_t() { │ │ │ │ │ +96 return _future->get(); │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_3 bool _r_e_a_d_y() const { │ │ │ │ │ +104 return _future->ready(); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +_1_1_2 bool _v_a_l_i_d() const { │ │ │ │ │ +113 if(_future) │ │ │ │ │ +114 return _future->valid(); │ │ │ │ │ +115 return false; │ │ │ │ │ +116 } │ │ │ │ │ +117 }; │ │ │ │ │ +118 │ │ │ │ │ +121 template │ │ │ │ │ +_1_2_2 class _P_s_e_u_d_o_F_u_t_u_r_e{ │ │ │ │ │ +123 bool valid_; │ │ │ │ │ +124 T data_; │ │ │ │ │ +125 public: │ │ │ │ │ +_1_2_6 _P_s_e_u_d_o_F_u_t_u_r_e() : │ │ │ │ │ +127 valid_(false) │ │ │ │ │ +128 {} │ │ │ │ │ +129 │ │ │ │ │ +130 template │ │ │ │ │ +_1_3_1 _P_s_e_u_d_o_F_u_t_u_r_e(U&& u) : │ │ │ │ │ +132 valid_(true), │ │ │ │ │ +133 data_(_s_t_d::forward(u)) │ │ │ │ │ +134 {} │ │ │ │ │ +135 │ │ │ │ │ +_1_3_6 void _w_a_i_t() { │ │ │ │ │ +137 if(!valid_) │ │ │ │ │ +138 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +_1_4_1 bool _r_e_a_d_y() const { │ │ │ │ │ +142 if(!valid_) │ │ │ │ │ +143 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +144 return true; │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +_1_4_7 T _g_e_t() { │ │ │ │ │ +148 if(!valid_) │ │ │ │ │ +149 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +150 valid_ = false; │ │ │ │ │ +151 return std::forward(data_); │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +_1_5_4 bool _v_a_l_i_d() const { │ │ │ │ │ +155 return valid_; │ │ │ │ │ +156 } │ │ │ │ │ +157 }; │ │ │ │ │ +158 │ │ │ │ │ +159 template<> │ │ │ │ │ +_1_6_0 class _P_s_e_u_d_o_F_u_t_u_r_e{ │ │ │ │ │ +161 bool valid_; │ │ │ │ │ +162 public: │ │ │ │ │ +_1_6_3 _P_s_e_u_d_o_F_u_t_u_r_e(bool _v_a_l_i_d = false) : │ │ │ │ │ +164 valid_(_v_a_l_i_d) │ │ │ │ │ +165 {} │ │ │ │ │ +166 │ │ │ │ │ +_1_6_7 void _w_a_i_t(){ │ │ │ │ │ +168 if(!valid_) │ │ │ │ │ +169 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +170 } │ │ │ │ │ +_1_7_1 bool _r_e_a_d_y() const{ │ │ │ │ │ +172 if(!valid_) │ │ │ │ │ +173 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +174 return true; │ │ │ │ │ +175 } │ │ │ │ │ +176 │ │ │ │ │ +_1_7_7 void _g_e_t(){ │ │ │ │ │ +178 if(!valid_) │ │ │ │ │ +179 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The PseudoFuture is not valid"); │ │ │ │ │ +180 valid_ = false; │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +_1_8_3 bool _v_a_l_i_d() const{ │ │ │ │ │ +184 return valid_; │ │ │ │ │ +185 } │ │ │ │ │ +186 }; │ │ │ │ │ +187} │ │ │ │ │ +188 │ │ │ │ │ +189#endif │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n │ │ │ │ │ -Base class for Dune-Exceptions. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n_H_o_o_k │ │ │ │ │ -Base class to add a hook to the Dune::Exception. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_I_O_E_r_r_o_r │ │ │ │ │ -Default exception class for I/O errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:231 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_E_r_r_o_r │ │ │ │ │ -Default exception class for mathematical errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_N_o_t_I_m_p_l_e_m_e_n_t_e_d │ │ │ │ │ -Default exception for dummy implementations. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_S_y_s_t_e_m_E_r_r_o_r │ │ │ │ │ -Default exception class for OS errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_O_u_t_O_f_M_e_m_o_r_y_E_r_r_o_r │ │ │ │ │ -Default exception if memory allocation fails. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ +Key &key) │ │ │ │ │ +DDeeffiinniittiioonn propertymap.hh:84 │ │ │ │ │ _D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ Default exception if a function was called while the object is not in a valid │ │ │ │ │ state for that function... │ │ │ │ │ DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_E_r_r_o_r │ │ │ │ │ -Default exception if an error in the parallel communication of the program │ │ │ │ │ -occurred. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +This exception is thrown when ready(), wait() or get() is called on an invalid │ │ │ │ │ +future.... │ │ │ │ │ +DDeeffiinniittiioonn future.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +A wrapper-class for a object which is ready immediately. │ │ │ │ │ +DDeeffiinniittiioonn future.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_r_e_a_d_y │ │ │ │ │ +bool ready() const │ │ │ │ │ +DDeeffiinniittiioonn future.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_g_e_t │ │ │ │ │ +T get() │ │ │ │ │ +DDeeffiinniittiioonn future.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +PseudoFuture(U &&u) │ │ │ │ │ +DDeeffiinniittiioonn future.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +PseudoFuture() │ │ │ │ │ +DDeeffiinniittiioonn future.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_w_a_i_t │ │ │ │ │ +void wait() │ │ │ │ │ +DDeeffiinniittiioonn future.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_:_:_v_a_l_i_d │ │ │ │ │ +bool valid() const │ │ │ │ │ +DDeeffiinniittiioonn future.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e │ │ │ │ │ +Type-erasure for future-like objects. A future-like object is a object │ │ │ │ │ +satisfying the interface of Fu... │ │ │ │ │ +DDeeffiinniittiioonn future.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_r_e_a_d_y │ │ │ │ │ +bool ready() const │ │ │ │ │ +DDeeffiinniittiioonn future.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_w_a_i_t │ │ │ │ │ +void wait() │ │ │ │ │ +wait until the future is ready │ │ │ │ │ +DDeeffiinniittiioonn future.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_F_u_t_u_r_e │ │ │ │ │ +Future(U &&data) │ │ │ │ │ +DDeeffiinniittiioonn future.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_g_e_t │ │ │ │ │ +T get() │ │ │ │ │ +Waits until the future is ready and returns the resulting value. │ │ │ │ │ +DDeeffiinniittiioonn future.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_F_u_t_u_r_e │ │ │ │ │ +Future()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_v_a_l_i_d │ │ │ │ │ +bool valid() const │ │ │ │ │ +Checks whether the future is valid. I.e. ‘get()’ was not called on that │ │ │ │ │ +future and when it was not de... │ │ │ │ │ +DDeeffiinniittiioonn future.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_t_u_r_e_:_:_F_u_t_u_r_e │ │ │ │ │ +Future(F &&f) │ │ │ │ │ +DDeeffiinniittiioonn future.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _>_:_:_r_e_a_d_y │ │ │ │ │ +bool ready() const │ │ │ │ │ +DDeeffiinniittiioonn future.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _>_:_:_v_a_l_i_d │ │ │ │ │ +bool valid() const │ │ │ │ │ +DDeeffiinniittiioonn future.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _>_:_:_g_e_t │ │ │ │ │ +void get() │ │ │ │ │ +DDeeffiinniittiioonn future.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _>_:_:_P_s_e_u_d_o_F_u_t_u_r_e │ │ │ │ │ +PseudoFuture(bool valid=false) │ │ │ │ │ +DDeeffiinniittiioonn future.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_P_s_e_u_d_o_F_u_t_u_r_e_<_ _v_o_i_d_ _>_:_:_w_a_i_t │ │ │ │ │ +void wait() │ │ │ │ │ +DDeeffiinniittiioonn future.hh:167 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: keywords.hh File Reference │ │ │ │ +dune-common: mpicollectivecommunication.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,68 +65,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Macros
│ │ │ │ -
keywords.hh File Reference
│ │ │ │ +
mpicollectivecommunication.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ - │ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -Macros

#define DUNE_INLINE_VARIABLE   inline
 
#define DUNE_GENERALIZED_CONSTEXPR   constexpr
 
│ │ │ │ -

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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ +
#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │
│ │ │ │ +

Go to the source code of this file.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,29 +1,12 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -keywords.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _C_+_+_ _u_t_i_l_i_t_i_e_s_ _a_n_d_ _b_a_c_k_p_o_r_t_s │ │ │ │ │ -Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpicollectivecommunication.hh File Reference │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___I_N_L_I_N_E___V_A_R_I_A_B_L_E   inline │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___G_E_N_E_R_A_L_I_Z_E_D___C_O_N_S_T_E_X_P_R   constexpr │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -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. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEENNEERRAALLIIZZEEDD__CCOONNSSTTEEXXPPRR ********** │ │ │ │ │ -#define DUNE_GENERALIZED_CONSTEXPR   constexpr │ │ │ │ │ -********** _?◆_? DDUUNNEE__IINNLLIINNEE__VVAARRIIAABBLLEE ********** │ │ │ │ │ -#define DUNE_INLINE_VARIABLE   inline │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: keywords.hh Source File │ │ │ │ +dune-common: mpicollectivecommunication.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,43 +70,27 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
keywords.hh
│ │ │ │ +
mpicollectivecommunication.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
│ │ │ │ +
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.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,21 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -keywords.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpicollectivecommunication.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ -_1_9#define DUNE_INLINE_VARIABLE inline │ │ │ │ │ -20#else │ │ │ │ │ -22 │ │ │ │ │ -25#define DUNE_INLINE_VARIABLE │ │ │ │ │ -26#endif │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -29#if __cpp_constexpr >= 201304 │ │ │ │ │ -_3_0#define DUNE_GENERALIZED_CONSTEXPR constexpr │ │ │ │ │ -31#else │ │ │ │ │ -33 │ │ │ │ │ -36#define DUNE_GENERALIZED_CONSTEXPR │ │ │ │ │ -37#endif │ │ │ │ │ -38 │ │ │ │ │ -39 │ │ │ │ │ -40#endif // DUNE_COMMON_KEYWORDS_HH │ │ │ │ │ +3// Will be removed after the 2.7 release │ │ │ │ │ +4#warning "Deprecated header, use #include instead!" │ │ │ │ │ +5#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +_m_p_i_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides MPI's collective communication │ │ │ │ │ +methods. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: overloadset.hh File Reference │ │ │ │ +dune-common: mpitraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,47 +65,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
overloadset.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
mpitraits.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <cstdint>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <mpi.h>
│ │ │ │
│ │ │ │

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

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class... F>
auto Dune::overload (F &&... f)
 Create an overload set.
 
template<class... F>
auto Dune::orderedOverload (F &&... f)
 Create an ordered overload set.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Traits classes for mapping types onto MPI_Datatype.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,27 +1,33 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -overloadset.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +mpitraits.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Traits classes for mapping types onto MPI_Datatype. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +  A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_o_v_e_r_l_o_a_d (F &&... f) │ │ │ │ │ -  Create an overload set. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_o_r_d_e_r_e_d_O_v_e_r_l_o_a_d (F &&... f) │ │ │ │ │ -  Create an ordered overload set. │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: overloadset.hh Source File │ │ │ │ +dune-common: mpitraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,143 +70,218 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
overloadset.hh
│ │ │ │ +
mpitraits.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_OVERLOADSET_HH
│ │ │ │ -
6#define DUNE_COMMON_OVERLOADSET_HH
│ │ │ │ +
5#ifndef DUNE_MPITRAITS_HH
│ │ │ │ +
6#define DUNE_MPITRAITS_HH
│ │ │ │
7
│ │ │ │ -
8#include <utility>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ - │ │ │ │ -
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13
│ │ │ │ -
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 {}
│ │ │ │ +
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
│ │ │ │ -
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 F0::operator()(std::forward<Args>(args)...);
│ │ │ │ -
88 }
│ │ │ │ -
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 {}
│ │ │ │ +
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
│ │ │ │ +
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 // 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
│ │ │ │ +
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
│ │ │ │ -
149template<class... F>
│ │ │ │ -
│ │ │ │ -
150auto orderedOverload(F&&... f)
│ │ │ │ -
151{
│ │ │ │ -
152 return Impl::OrderedOverloadSet<std::decay_t<F>...>(std::forward<F>(f)...);
│ │ │ │ -
153}
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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.
│ │ │ │
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,139 +1,221 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -overloadset.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpitraits.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_OVERLOADSET_HH │ │ │ │ │ -6#define DUNE_COMMON_OVERLOADSET_HH │ │ │ │ │ +5#ifndef DUNE_MPITRAITS_HH │ │ │ │ │ +6#define DUNE_MPITRAITS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -11 │ │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ │ -13 │ │ │ │ │ -14namespace Impl { │ │ │ │ │ -15 │ │ │ │ │ -16 template │ │ │ │ │ -17 class OverloadSet │ │ │ │ │ -18 : public F... │ │ │ │ │ -19 { │ │ │ │ │ -20 │ │ │ │ │ -21 public: │ │ │ │ │ -22 │ │ │ │ │ -23 template │ │ │ │ │ -24 OverloadSet(FF&&... ff) │ │ │ │ │ -25 : F(_s_t_d::forward(ff))... │ │ │ │ │ -26 {} │ │ │ │ │ +18#if HAVE_MPI │ │ │ │ │ +19 │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25 │ │ │ │ │ +26#include │ │ │ │ │ 27 │ │ │ │ │ -28 using F::operator()...; │ │ │ │ │ -29 │ │ │ │ │ -30 }; │ │ │ │ │ -31 │ │ │ │ │ -32} // end namespace Impl │ │ │ │ │ -33 │ │ │ │ │ -34 │ │ │ │ │ -35 │ │ │ │ │ -60template │ │ │ │ │ -_6_1auto _o_v_e_r_l_o_a_d(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(_s_t_d::forward(ff)...), │ │ │ │ │ -79 F0(_s_t_d::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 F0::operator()(std::forward(args)...); │ │ │ │ │ -88 } │ │ │ │ │ -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::value, int> = 0> │ │ │ │ │ -95 decltype(auto) operator()(Args&&... args) │ │ │ │ │ -96 { │ │ │ │ │ -97 return Base::operator()(std::forward(args)...); │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -100 }; │ │ │ │ │ -101 │ │ │ │ │ -102 template │ │ │ │ │ -103 class OrderedOverloadSet: public F0 │ │ │ │ │ -104 { │ │ │ │ │ -105 public: │ │ │ │ │ -106 │ │ │ │ │ -107 template │ │ │ │ │ -108 OrderedOverloadSet(FF0&& f0) : │ │ │ │ │ -109 F0(_s_t_d::forward(f0)) │ │ │ │ │ -110 {} │ │ │ │ │ +28namespace _D_u_n_e │ │ │ │ │ +29{ │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 struct _M_P_I_T_r_a_i_t_s │ │ │ │ │ +41 { │ │ │ │ │ +42 private: │ │ │ │ │ +43 _M_P_I_T_r_a_i_t_s(){} │ │ │ │ │ +44 _M_P_I_T_r_a_i_t_s(const _M_P_I_T_r_a_i_t_s&){} │ │ │ │ │ +45 static MPI_Datatype datatype; │ │ │ │ │ +46 static MPI_Datatype vectortype; │ │ │ │ │ +47 public: │ │ │ │ │ +_4_8 static inline MPI_Datatype _g_e_t_T_y_p_e() │ │ │ │ │ +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 } │ │ │ │ │ +_5_6 static constexpr bool _i_s___i_n_t_r_i_n_s_i_c = false; │ │ │ │ │ +57 }; │ │ │ │ │ +58 template │ │ │ │ │ +59 MPI_Datatype _M_P_I_T_r_a_i_t_s_<_T_>_:_:_d_a_t_a_t_y_p_e = MPI_DATATYPE_NULL; │ │ │ │ │ +60 │ │ │ │ │ +61#ifndef DOXYGEN │ │ │ │ │ +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 _F_i_e_l_d_V_e_c_t_o_r; │ │ │ │ │ +92 │ │ │ │ │ +93 template │ │ │ │ │ +94 struct _M_P_I_T_r_a_i_t_s<_F_i_e_l_d_V_e_c_t_o_r > │ │ │ │ │ +95 { │ │ │ │ │ +96 static MPI_Datatype datatype; │ │ │ │ │ +97 static MPI_Datatype vectortype; │ │ │ │ │ +98 │ │ │ │ │ +99 static inline MPI_Datatype _g_e_t_T_y_p_e() │ │ │ │ │ +100 { │ │ │ │ │ +101 if(datatype==MPI_DATATYPE_NULL) { │ │ │ │ │ +102 MPI_Type_contiguous(n, _M_P_I_T_r_a_i_t_s_<_K_>_:_:_g_e_t_T_y_p_e(), &vectortype); │ │ │ │ │ +103 MPI_Type_commit(&vectortype); │ │ │ │ │ +104 _F_i_e_l_d_V_e_c_t_o_r_<_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 // Forward to operator() of F0. If it cannot be called with │ │ │ │ │ -113 // the given arguments a static assertion will fail. │ │ │ │ │ -114 template │ │ │ │ │ -115 decltype(auto) operator()(Args&&... args) │ │ │ │ │ -116 { │ │ │ │ │ -117 static_assert(IsCallable::value, │ │ │ │ │ -118 "No matching overload found in OrderedOverloadSet"); │ │ │ │ │ -119 return F0::operator()(std::forward(args)...); │ │ │ │ │ -120 } │ │ │ │ │ -121 }; │ │ │ │ │ -122 │ │ │ │ │ -123} // end namespace Impl │ │ │ │ │ +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 │ │ │ │ │ -149template │ │ │ │ │ -_1_5_0auto _o_r_d_e_r_e_d_O_v_e_r_l_o_a_d(F&&... f) │ │ │ │ │ -151{ │ │ │ │ │ -152 return Impl::OrderedOverloadSet...>(std::forward(f)...); │ │ │ │ │ -153} │ │ │ │ │ -154 │ │ │ │ │ +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 _g_e_t_T_y_p_e() │ │ │ │ │ +136 { │ │ │ │ │ +137 if(datatype==MPI_DATATYPE_NULL) { │ │ │ │ │ +138 MPI_Type_contiguous(_b_i_g_u_n_s_i_g_n_e_d_i_n_t_<_k_>_:_:_n, _M_P_I_T_r_a_i_t_s_<_s_t_d_:_:_u_i_n_t_1_6___t_>_:_:_g_e_t_T_y_p_e │ │ │ │ │ +(), │ │ │ │ │ +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 │ │ │ │ │ -156 │ │ │ │ │ -157} // end namespace Dune │ │ │ │ │ -158 │ │ │ │ │ -159#endif // DUNE_COMMON_OVERLOADSET_HH │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_D_u_n_e_:_:_o_r_d_e_r_e_d_O_v_e_r_l_o_a_d │ │ │ │ │ -auto orderedOverload(F &&... f) │ │ │ │ │ -Create an ordered overload set. │ │ │ │ │ -DDeeffiinniittiioonn overloadset.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_o_v_e_r_l_o_a_d │ │ │ │ │ -auto overload(F &&... f) │ │ │ │ │ -Create an overload set. │ │ │ │ │ -DDeeffiinniittiioonn overloadset.hh:61 │ │ │ │ │ +156namespace _D_u_n_e │ │ │ │ │ +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<_s_t_d::pair > │ │ │ │ │ +165 { │ │ │ │ │ +166 public: │ │ │ │ │ +167 inline static MPI_Datatype _g_e_t_T_y_p_e(); │ │ │ │ │ +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] = {_M_P_I_T_r_a_i_t_s_<_T_1_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +178 _M_P_I_T_r_a_i_t_s_<_T_2_>_:_:_g_e_t_T_y_p_e()}; │ │ │ │ │ +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 │ │ │ │ │ _s_t_d │ │ │ │ │ STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s │ │ │ │ │ +A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_g_e_t_T_y_p_e │ │ │ │ │ +static MPI_Datatype getType() │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_i_s___i_n_t_r_i_n_s_i_c │ │ │ │ │ +static constexpr bool is_intrinsic │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_b_i_g_u_n_s_i_g_n_e_d_i_n_t_:_:_n │ │ │ │ │ +static constexpr int n │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +vector space out of a tensor product of fields. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:95 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: math.hh File Reference │ │ │ │ +dune-common: mpifuture.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,202 +65,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
math.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
mpifuture.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Some useful basic math stuff. │ │ │ │ -More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ +
#include <optional>
│ │ │ │ +#include <dune/common/parallel/communication.hh>
│ │ │ │ +#include <dune/common/parallel/future.hh>
│ │ │ │ +#include <dune/common/parallel/mpidata.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::StandardMathematicalConstants< T >
 Standard implementation of MathematicalConstants. More...
 
struct  Dune::MathematicalConstants< Field >
 Provides commonly used mathematical constants. More...
 
struct  Dune::Factorial< m >
struct  Dune::impl::Buffer< T >
 
struct  Dune::Factorial< 0 >
 end of recursion of factorial via specialization More...
struct  Dune::impl::Buffer< T & >
 
struct  Dune::MathOverloads::ADLTag
 Tag to make sure the functions in this namespace can be found by ADL. More...
struct  Dune::impl::Buffer< void >
 
struct  Dune::MathImpl::isUnorderedImpl
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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::MathOverloads
 namespace for customization of math functions with Dune-Semantics
namespace  Dune::impl
 
namespace  Dune::MathImpl
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
 
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class Base , class Exponent >
constexpr Base Dune::power (Base m, Exponent p)
 Power method for integer exponents.
 
template<class T >
static constexpr T Dune::factorial (const T &n) noexcept
 calculate the factorial of n as a constexpr
 
template<class T , T n>
static constexpr auto Dune::factorial (std::integral_constant< T, n >) noexcept
 calculate the factorial of n as a constexpr
 
template<class T >
static constexpr T Dune::binomial (const T &n, const T &k) noexcept
 calculate the binomial coefficient n over k as a constexpr
 
template<class T , T n, T k>
static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, k >) noexcept
 calculate the binomial coefficient n over k as a constexpr
 
template<class T , T n>
static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, n >) noexcept
 
template<class K >
Dune::conjugateComplex (const K &x)
 compute conjugate complex of x
 
template<class T >
int Dune::sign (const T &val)
 Return the sign of the value.
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isNaN, isnan)
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isInf, isinf)
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isFinite, isfinite)
 
template<class T >
auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 1 >, ADLTag) -> decltype(isUnordered(t1, t2))
 
template<class T >
auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 0 >, ADLTag)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isNaN)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isInf)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isFinite)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isNaN (const T &t, PriorityTag< 2 >, ADLTag)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isInf (const T &t, PriorityTag< 2 >, ADLTag)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isFinite (const T &t, PriorityTag< 2 >, ADLTag)
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Some useful basic math stuff.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_COMMON_MATH_ISFUNCTION

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_COMMON_MATH_ISFUNCTION( function,
 stdfunction 
)
│ │ │ │ -
│ │ │ │ -Value:
template<class T> \
│ │ │ │ -
auto function(const T &t, PriorityTag<1>, ADLTag) \
│ │ │ │ -
-> decltype(function(t)) { \
│ │ │ │ -
return function(t); \
│ │ │ │ -
} \
│ │ │ │ -
template<class T> \
│ │ │ │ -
auto function(const T &t, PriorityTag<0>, ADLTag) { \
│ │ │ │ -
using std::stdfunction; \
│ │ │ │ -
return stdfunction(t); \
│ │ │ │ -
} \
│ │ │ │ -
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

◆ DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR( function)
│ │ │ │ -
│ │ │ │ -Value:
struct function##Impl { \
│ │ │ │ -
template<class T> \
│ │ │ │ -
constexpr auto operator()(const T &t) const { \
│ │ │ │ -
return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \
│ │ │ │ -
} \
│ │ │ │ -
}; \
│ │ │ │ -
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,154 +1,35 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -math.hh File Reference │ │ │ │ │ -Some useful basic math stuff. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +mpifuture.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_f_u_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_d_a_t_a_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_ _T_ _> │ │ │ │ │ -  Standard implementation of _M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_ _F_i_e_l_d_ _> │ │ │ │ │ -  Provides commonly used mathematical constants. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _&_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_<_ _m_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _v_o_i_d_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_<_ _0_ _> │ │ │ │ │ -  end of recursion of factorial via specialization _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g │ │ │ │ │ -  Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l │ │ │ │ │ + class   _D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_<_ _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. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s │ │ │ │ │ -  namespace for customization of math functions with Dune-Semantics │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_M_a_t_h_I_m_p_l │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(function, stdfunction) │ │ │ │ │ +namespace   _D_u_n_e_:_:_i_m_p_l │ │ │ │ │   │ │ │ │ │ -#define  _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(function) │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - constexpr Base  _D_u_n_e_:_:_p_o_w_e_r (Base m, Exponent p) │ │ │ │ │ -  _P_o_w_e_r method for integer exponents. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static constexpr T  _D_u_n_e_:_:_f_a_c_t_o_r_i_a_l (const T &n) noexcept │ │ │ │ │ -  calculate the factorial of n as a constexpr │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_f_a_c_t_o_r_i_a_l (std::integral_constant< T, n >) │ │ │ │ │ - noexcept │ │ │ │ │ -  calculate the factorial of n as a constexpr │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static constexpr T  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (const T &n, const T &k) noexcept │ │ │ │ │ -  calculate the binomial coefficient n over k as a │ │ │ │ │ - constexpr │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (std::integral_constant< T, n >, std:: │ │ │ │ │ - integral_constant< T, k >) noexcept │ │ │ │ │ -  calculate the binomial coefficient n over k as a │ │ │ │ │ - constexpr │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (std::integral_constant< T, n >, std:: │ │ │ │ │ - integral_constant< T, n >) noexcept │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - K  _D_u_n_e_:_:_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const K &x) │ │ │ │ │ -  compute conjugate complex of x │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - int  _D_u_n_e_:_:_s_i_g_n (const T &val) │ │ │ │ │ -  Return the sign of the value. │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N (_i_s_N_a_N, │ │ │ │ │ - isnan) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N (_i_s_I_n_f, │ │ │ │ │ - isinf) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N │ │ │ │ │ - (_i_s_F_i_n_i_t_e, isfinite) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d (const T &t1, const T │ │ │ │ │ - &t2, _P_r_i_o_r_i_t_y_T_a_g< 1 >, _A_D_L_T_a_g) -> decltype(isUnordered │ │ │ │ │ - (t1, t2)) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d (const T &t1, const T │ │ │ │ │ - &t2, _P_r_i_o_r_i_t_y_T_a_g< 0 >, _A_D_L_T_a_g) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ - (isNaN) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ - (isInf) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ - (isFinite) │ │ │ │ │ -  │ │ │ │ │ -template::value>> │ │ │ │ │ - auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_N_a_N (const T &t, _P_r_i_o_r_i_t_y_T_a_g< 2 │ │ │ │ │ - >, _A_D_L_T_a_g) │ │ │ │ │ -  │ │ │ │ │ -template::value>> │ │ │ │ │ - auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_I_n_f (const T &t, _P_r_i_o_r_i_t_y_T_a_g< 2 │ │ │ │ │ - >, _A_D_L_T_a_g) │ │ │ │ │ -  │ │ │ │ │ -template::value>> │ │ │ │ │ - auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_F_i_n_i_t_e (const T &t, _P_r_i_o_r_i_t_y_T_a_g< │ │ │ │ │ - 2 >, _A_D_L_T_a_g) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Some useful basic math stuff. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__CCOOMMMMOONN__MMAATTHH__IISSFFUUNNCCTTIIOONN ********** │ │ │ │ │ -#define DUNE_COMMON_MATH_ISFUNCTION (   function, │ │ │ │ │ -   stdfunction  │ │ │ │ │ - ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -template \ │ │ │ │ │ -auto function(const T &t, PriorityTag<1>, ADLTag) \ │ │ │ │ │ --> decltype(function(t)) { \ │ │ │ │ │ -return function(t); \ │ │ │ │ │ -} \ │ │ │ │ │ -template \ │ │ │ │ │ -auto function(const T &t, PriorityTag<0>, ADLTag) { \ │ │ │ │ │ -using std::stdfunction; \ │ │ │ │ │ -return stdfunction(t); \ │ │ │ │ │ -} \ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -********** _?◆_? DDUUNNEE__CCOOMMMMOONN__MMAATTHH__IISSFFUUNNCCTTIIOONN__FFUUNNCCTTOORR ********** │ │ │ │ │ -#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (   function ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -struct function##Impl { \ │ │ │ │ │ -template \ │ │ │ │ │ -constexpr auto operator()(const T &t) const { \ │ │ │ │ │ -return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \ │ │ │ │ │ -} \ │ │ │ │ │ -}; \ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: math.hh Source File │ │ │ │ +dune-common: mpifuture.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,377 +70,290 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
math.hh
│ │ │ │ +
mpifuture.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_MATH_HH
│ │ │ │ -
6#define DUNE_MATH_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH
│ │ │ │ +
6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
│ │ │ │
7
│ │ │ │ -
12#include <cmath>
│ │ │ │ -
13#include <complex>
│ │ │ │ -
14#include <limits>
│ │ │ │ -
15#include <type_traits>
│ │ │ │ +
8#include <optional>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14#if HAVE_MPI
│ │ │ │ +
15namespace Dune{
│ │ │ │
16
│ │ │ │ - │ │ │ │ -
18
│ │ │ │ -
19namespace Dune
│ │ │ │ -
20{
│ │ │ │ -
21
│ │ │ │ -
32 template< class T >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34 {
│ │ │ │ -
│ │ │ │ -
38 static const T e ()
│ │ │ │ -
39 {
│ │ │ │ -
40 using std::exp;
│ │ │ │ -
41 static const T e = exp( T( 1 ) );
│ │ │ │ -
42 return e;
│ │ │ │ -
43 }
│ │ │ │ -
│ │ │ │ -
44
│ │ │ │ -
│ │ │ │ -
48 static const T pi ()
│ │ │ │ -
49 {
│ │ │ │ -
50 using std::acos;
│ │ │ │ -
51 static const T pi = acos( T( -1 ) );
│ │ │ │ -
52 return pi;
│ │ │ │ -
53 }
│ │ │ │ -
│ │ │ │ -
54 };
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
56
│ │ │ │ -
64 template< class Field >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
66 : public StandardMathematicalConstants<Field>
│ │ │ │ -
67 {};
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
74 template <class Base, class Exponent>
│ │ │ │ -
│ │ │ │ -
75 constexpr Base power(Base m, Exponent p)
│ │ │ │ -
76 {
│ │ │ │ -
77 static_assert(std::numeric_limits<Exponent>::is_integer, "Exponent must be an integer type!");
│ │ │ │ -
78
│ │ │ │ -
79 auto result = Base(1);
│ │ │ │ -
80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not constexpr
│ │ │ │ -
81 for (Exponent i = Exponent(0); i<absp; i++)
│ │ │ │ -
82 result *= m;
│ │ │ │ -
83
│ │ │ │ -
84 if (p<0)
│ │ │ │ -
85 result = Base(1)/result;
│ │ │ │ -
86
│ │ │ │ -
87 return result;
│ │ │ │ -
88 }
│ │ │ │ -
│ │ │ │ -
89
│ │ │ │ -
92 template <int m>
│ │ │ │ -
│ │ │ │ -
93 struct Factorial
│ │ │ │ -
94 {
│ │ │ │ -
96 static constexpr int factorial = m * Factorial<m-1>::factorial;
│ │ │ │ -
97 };
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
100 template <>
│ │ │ │ -
│ │ │ │ -
101 struct [[deprecated("Use function factorial instead! Will be removed after Dune 2.9")]] Factorial<0>
│ │ │ │ -
102 {
│ │ │ │ -
103 // 0! = 1
│ │ │ │ -
104 static constexpr int factorial = 1;
│ │ │ │ -
105 };
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
107
│ │ │ │ -
109 // T has to be an integral type
│ │ │ │ -
110 template<class T>
│ │ │ │ -
│ │ │ │ -
111 constexpr inline static T factorial(const T& n) noexcept
│ │ │ │ -
112 {
│ │ │ │ -
113 static_assert(std::numeric_limits<T>::is_integer, "`factorial(n)` has to be called with an integer type.");
│ │ │ │ -
114 T fac = 1;
│ │ │ │ -
115 for(T k = 0; k < n; ++k)
│ │ │ │ -
116 fac *= k+1;
│ │ │ │ -
117 return fac;
│ │ │ │ -
118 }
│ │ │ │ +
│ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
119
│ │ │ │ -
121 template<class T, T n>
│ │ │ │ +
121
│ │ │ │
│ │ │ │ -
122 constexpr inline static auto factorial (std::integral_constant<T, n>) noexcept
│ │ │ │ -
123 {
│ │ │ │ -
124 return std::integral_constant<T, factorial(n)>{};
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
127
│ │ │ │ -
129 // T has to be an integral type
│ │ │ │ -
130 template<class T>
│ │ │ │ + │ │ │ │ +
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 constexpr inline static T binomial (const T& n, const T& k) noexcept
│ │ │ │ -
132 {
│ │ │ │ -
133 static_assert(std::numeric_limits<T>::is_integer, "`binomial(n, k)` has to be called with an integer type.");
│ │ │ │ -
134
│ │ │ │ -
135 if( k < 0 || k > n )
│ │ │ │ -
136 return 0;
│ │ │ │ -
137
│ │ │ │ -
138 if (2*k > n)
│ │ │ │ -
139 return binomial(n, n-k);
│ │ │ │ -
140
│ │ │ │ -
141 T bin = 1;
│ │ │ │ -
142 for(auto i = n-k; i < n; ++i)
│ │ │ │ -
143 bin *= i+1;
│ │ │ │ -
144 return bin / factorial(k);
│ │ │ │ -
145 }
│ │ │ │ + │ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
146
│ │ │ │ -
148 template<class T, T n, T k>
│ │ │ │ +
148
│ │ │ │
│ │ │ │ -
149 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, k>) noexcept
│ │ │ │ -
150 {
│ │ │ │ -
151 return std::integral_constant<T, binomial(n, k)>{};
│ │ │ │ -
152 }
│ │ │ │ +
149 bool ready() const{
│ │ │ │ +
150 int flag = -1;
│ │ │ │ +
151 MPI_Test(&req_, &flag, &status_);
│ │ │ │ +
152 return flag;
│ │ │ │ +
153 }
│ │ │ │
│ │ │ │ -
153
│ │ │ │ -
154 template<class T, T n>
│ │ │ │ +
154
│ │ │ │
│ │ │ │ -
155 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, n>) noexcept
│ │ │ │ -
156 {
│ │ │ │ -
157 return std::integral_constant<T, (n >= 0 ? 1 : 0)>{};
│ │ │ │ -
158 }
│ │ │ │ +
155 R get() {
│ │ │ │ +
156 wait();
│ │ │ │ +
157 return data_.get();
│ │ │ │ +
158 }
│ │ │ │
│ │ │ │
159
│ │ │ │ -
160
│ │ │ │ -
162 // conjugate complex does nothing for non-complex types
│ │ │ │ -
163 template<class K>
│ │ │ │ -
│ │ │ │ -
164 inline K conjugateComplex (const K& x)
│ │ │ │ -
165 {
│ │ │ │ -
166 return x;
│ │ │ │ -
167 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
161 wait();
│ │ │ │ +
162 return send_data_.get();
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
166 return getMPIData(*data_);
│ │ │ │ +
167 }
│ │ │ │
│ │ │ │
168
│ │ │ │ -
169#ifndef DOXYGEN
│ │ │ │ -
170 // specialization for complex
│ │ │ │ -
171 template<class K>
│ │ │ │ -
172 inline std::complex<K> conjugateComplex (const std::complex<K>& c)
│ │ │ │ -
173 {
│ │ │ │ -
174 return std::complex<K>(c.real(),-c.imag());
│ │ │ │ -
175 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
170 return getMPIData(*send_data_);
│ │ │ │ +
171 }
│ │ │ │ +
│ │ │ │ +
172 };
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
174}
│ │ │ │ +
175#endif
│ │ │ │
176#endif
│ │ │ │ -
177
│ │ │ │ -
179 template <class T>
│ │ │ │ -
│ │ │ │ -
180 int sign(const T& val)
│ │ │ │ -
181 {
│ │ │ │ -
182 return (val < 0 ? -1 : 1);
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
185
│ │ │ │ -
186 namespace Impl {
│ │ │ │ -
187 // Returns whether a given type behaves like std::complex<>, i.e. whether
│ │ │ │ -
188 // real() and imag() are defined
│ │ │ │ -
189 template<class T>
│ │ │ │ -
190 struct isComplexLike {
│ │ │ │ -
191 private:
│ │ │ │ -
192 template<class U>
│ │ │ │ -
193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type());
│ │ │ │ -
194
│ │ │ │ -
195 template<class U>
│ │ │ │ -
196 static auto test(...) -> decltype(std::false_type());
│ │ │ │ -
197
│ │ │ │ -
198 public:
│ │ │ │ -
199 static const bool value = decltype(test<T>(0))::value;
│ │ │ │ -
200 };
│ │ │ │ -
201 } // namespace Impl
│ │ │ │ -
202
│ │ │ │ -
204
│ │ │ │ -
227 namespace MathOverloads {
│ │ │ │ -
228
│ │ │ │ -
230 struct ADLTag {};
│ │ │ │ -
231
│ │ │ │ -
│ │ │ │ -
232#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \
│ │ │ │ -
233 template<class T> \
│ │ │ │ -
234 auto function(const T &t, PriorityTag<1>, ADLTag) \
│ │ │ │ -
235 -> decltype(function(t)) { \
│ │ │ │ -
236 return function(t); \
│ │ │ │ -
237 } \
│ │ │ │ -
238 template<class T> \
│ │ │ │ -
239 auto function(const T &t, PriorityTag<0>, ADLTag) { \
│ │ │ │ -
240 using std::stdfunction; \
│ │ │ │ -
241 return stdfunction(t); \
│ │ │ │ -
242 } \
│ │ │ │ -
243 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
248#undef DUNE_COMMON_MATH_ISFUNCTION
│ │ │ │ -
249
│ │ │ │ -
250 template<class T>
│ │ │ │ -
│ │ │ │ -
251 auto isUnordered(const T &t1, const T &t2, PriorityTag<1>, ADLTag)
│ │ │ │ -
252 -> decltype(isUnordered(t1, t2)) {
│ │ │ │ -
253 return isUnordered(t1, t2);
│ │ │ │ -
254 }
│ │ │ │ -
│ │ │ │ -
255
│ │ │ │ -
256 template<class T>
│ │ │ │ -
│ │ │ │ -
257 auto isUnordered(const T &t1, const T &t2, PriorityTag<0>, ADLTag) {
│ │ │ │ -
258 using std::isunordered;
│ │ │ │ -
259 return isunordered(t1, t2);
│ │ │ │ -
260 }
│ │ │ │ -
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
│ │ │ │ -
263 namespace MathImpl {
│ │ │ │ -
264
│ │ │ │ -
265 // NOTE: it is important that these functors have names different from the
│ │ │ │ -
266 // names of the functions they are forwarding to. Otherwise the
│ │ │ │ -
267 // unqualified call would find the functor type, not a function, and ADL
│ │ │ │ -
268 // would never be attempted.
│ │ │ │ -
│ │ │ │ -
269#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \
│ │ │ │ -
270 struct function##Impl { \
│ │ │ │ -
271 template<class T> \
│ │ │ │ -
272 constexpr auto operator()(const T &t) const { \
│ │ │ │ -
273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \
│ │ │ │ -
274 } \
│ │ │ │ -
275 }; \
│ │ │ │ -
276 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR
│ │ │ │ -
282
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
284 template<class T>
│ │ │ │ -
│ │ │ │ -
285 constexpr auto operator()(const T &t1, const T &t2) const {
│ │ │ │ -
286 return isUnordered(t1, t2, PriorityTag<10>{}, MathOverloads::ADLTag{});
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288 };
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
290 } //MathImpl
│ │ │ │ -
│ │ │ │ -
291
│ │ │ │ -
292
│ │ │ │ -
293 namespace Impl {
│ │ │ │ -
294 /* This helper has a math functor as a static constexpr member. Doing
│ │ │ │ -
295 this as a static member of a template struct means we can do this
│ │ │ │ -
296 without violating the ODR or putting the definition into a separate
│ │ │ │ -
297 compilation unit, while still still ensuring the functor is the same
│ │ │ │ -
298 lvalue across all compilation units.
│ │ │ │ -
299 */
│ │ │ │ -
300 template<class T>
│ │ │ │ -
301 struct MathDummy
│ │ │ │ -
302 {
│ │ │ │ -
303 static constexpr T value{};
│ │ │ │ -
304 };
│ │ │ │ -
305
│ │ │ │ -
306 template<class T>
│ │ │ │ -
307 constexpr T MathDummy<T>::value;
│ │ │ │ -
308
│ │ │ │ -
309 } //namespace Impl
│ │ │ │ -
310
│ │ │ │ -
311 namespace {
│ │ │ │ -
312 /* Provide the math functors directly in the `Dune` namespace.
│ │ │ │ -
313
│ │ │ │ -
314 This actually declares a different name in each translation unit, but
│ │ │ │ -
315 they all resolve to the same lvalue.
│ │ │ │ -
316 */
│ │ │ │ -
317
│ │ │ │ -
319
│ │ │ │ -
323 constexpr auto const &isNaN = Impl::MathDummy<MathImpl::isNaNImpl>::value;
│ │ │ │ -
324
│ │ │ │ -
326
│ │ │ │ -
330 constexpr auto const &isInf = Impl::MathDummy<MathImpl::isInfImpl>::value;
│ │ │ │ -
331
│ │ │ │ -
333
│ │ │ │ -
337 constexpr auto const &isFinite = Impl::MathDummy<MathImpl::isFiniteImpl>::value;
│ │ │ │ -
338
│ │ │ │ -
340
│ │ │ │ -
345 constexpr auto const &isUnordered = Impl::MathDummy<MathImpl::isUnorderedImpl>::value;
│ │ │ │ -
346 }
│ │ │ │ -
347
│ │ │ │ -
348 namespace MathOverloads {
│ │ │ │ -
349 /*Overloads for complex types*/
│ │ │ │ -
350 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ -
│ │ │ │ -
351 auto isNaN(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ -
352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t));
│ │ │ │ -
353 }
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
355 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ -
│ │ │ │ -
356 auto isInf(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ -
357 return Dune::isInf(real(t)) || Dune::isInf(imag(t));
│ │ │ │ -
358 }
│ │ │ │ -
│ │ │ │ -
359
│ │ │ │ -
360 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ -
│ │ │ │ -
361 auto isFinite(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ -
362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t));
│ │ │ │ -
363 }
│ │ │ │ -
│ │ │ │ -
364 } //MathOverloads
│ │ │ │ -
365}
│ │ │ │ -
366
│ │ │ │ -
367#endif // #ifndef DUNE_MATH_HH
│ │ │ │ -
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
Definition math.hh:269
│ │ │ │ -
#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
Definition math.hh:232
│ │ │ │ -
Utilities for type computations, constraining overloads, ...
│ │ │ │ +
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
│ │ │ │ +
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ + │ │ │ │ +
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.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
static constexpr T binomial(const T &n, const T &k) noexcept
calculate the binomial coefficient n over k as a constexpr
Definition math.hh:131
│ │ │ │ -
constexpr Base power(Base m, Exponent p)
Power method for integer exponents.
Definition math.hh:75
│ │ │ │ -
static constexpr T factorial(const T &n) noexcept
calculate the factorial of n as a constexpr
Definition math.hh:111
│ │ │ │ -
int sign(const T &val)
Return the sign of the value.
Definition math.hh:180
│ │ │ │ -
K conjugateComplex(const K &x)
compute conjugate complex of x
Definition math.hh:164
│ │ │ │ -
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
│ │ │ │ -
Standard implementation of MathematicalConstants.
Definition math.hh:34
│ │ │ │ -
static const T e()
Euler's number.
Definition math.hh:38
│ │ │ │ -
static const T pi()
Archimedes' constant.
Definition math.hh:48
│ │ │ │ -
Provides commonly used mathematical constants.
Definition math.hh:67
│ │ │ │ -
Definition math.hh:94
│ │ │ │ -
static constexpr int factorial
factorial stores m!
Definition math.hh:96
│ │ │ │ -
Tag to make sure the functions in this namespace can be found by ADL.
Definition math.hh:230
│ │ │ │ -
Definition math.hh:283
│ │ │ │ -
constexpr auto operator()(const T &t1, const T &t2) const
Definition math.hh:285
│ │ │ │ -
Helper class for tagging priorities.
Definition typeutilities.hh:73
│ │ │ │ +
auto getMPIData(T &t)
Definition mpidata.hh:43
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,381 +1,297 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -math.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +mpifuture.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_MATH_HH │ │ │ │ │ -6#define DUNE_MATH_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH │ │ │ │ │ +6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_f_u_t_u_r_e_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_d_a_t_a_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +14#if HAVE_MPI │ │ │ │ │ +15namespace _D_u_n_e{ │ │ │ │ │ 16 │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e │ │ │ │ │ -20{ │ │ │ │ │ -21 │ │ │ │ │ -32 template< class T > │ │ │ │ │ -_3_3 struct _S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ -34 { │ │ │ │ │ -_3_8 static const T _e () │ │ │ │ │ -39 { │ │ │ │ │ -40 using std::exp; │ │ │ │ │ -41 static const T _e = exp( T( 1 ) ); │ │ │ │ │ -42 return _e; │ │ │ │ │ -43 } │ │ │ │ │ -44 │ │ │ │ │ -_4_8 static const T _p_i () │ │ │ │ │ -49 { │ │ │ │ │ -50 using std::acos; │ │ │ │ │ -51 static const T _p_i = acos( T( -1 ) ); │ │ │ │ │ -52 return _p_i; │ │ │ │ │ -53 } │ │ │ │ │ -54 }; │ │ │ │ │ -55 │ │ │ │ │ -56 │ │ │ │ │ -64 template< class Field > │ │ │ │ │ -_6_5 struct _M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ -66 : public _S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ -67 {}; │ │ │ │ │ -68 │ │ │ │ │ -69 │ │ │ │ │ -74 template │ │ │ │ │ -_7_5 constexpr Base _p_o_w_e_r(Base m, Exponent p) │ │ │ │ │ -76 { │ │ │ │ │ -77 static_assert(std::numeric_limits::is_integer, "Exponent must be │ │ │ │ │ -an integer type!"); │ │ │ │ │ -78 │ │ │ │ │ -79 auto result = Base(1); │ │ │ │ │ -80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not │ │ │ │ │ -constexpr │ │ │ │ │ -81 for (Exponent i = Exponent(0); i │ │ │ │ │ -_9_3 struct _F_a_c_t_o_r_i_a_l │ │ │ │ │ -94 { │ │ │ │ │ -_9_6 static constexpr int _f_a_c_t_o_r_i_a_l = m * _F_a_c_t_o_r_i_a_l_:_:_f_a_c_t_o_r_i_a_l; │ │ │ │ │ -97 }; │ │ │ │ │ -98 │ │ │ │ │ -100 template <> │ │ │ │ │ -_1_0_1 struct [[deprecated("Use function factorial instead! Will be removed after │ │ │ │ │ -Dune 2.9")]] _F_a_c_t_o_r_i_a_l<0> │ │ │ │ │ -102 { │ │ │ │ │ -103 // 0! = 1 │ │ │ │ │ -_1_0_4 static constexpr int _f_a_c_t_o_r_i_a_l = 1; │ │ │ │ │ -105 }; │ │ │ │ │ -106 │ │ │ │ │ -107 │ │ │ │ │ -109 // T has to be an integral type │ │ │ │ │ -110 template │ │ │ │ │ -_1_1_1 constexpr inline static T _f_a_c_t_o_r_i_a_l(const T& n) noexcept │ │ │ │ │ -112 { │ │ │ │ │ -113 static_assert(std::numeric_limits::is_integer, "`factorial(n)` has to be │ │ │ │ │ -called with an integer type."); │ │ │ │ │ -114 T fac = 1; │ │ │ │ │ -115 for(T k = 0; k < n; ++k) │ │ │ │ │ -116 fac *= k+1; │ │ │ │ │ -117 return fac; │ │ │ │ │ +_1_7 namespace impl{ │ │ │ │ │ +18 template │ │ │ │ │ +_1_9 struct _B_u_f_f_e_r{ │ │ │ │ │ +_2_0 _B_u_f_f_e_r(bool valid){ │ │ │ │ │ +21 if(valid) │ │ │ │ │ +22 _v_a_l_u_e = std::make_unique(); │ │ │ │ │ +23 } │ │ │ │ │ +24 template │ │ │ │ │ +_2_5 _B_u_f_f_e_r(V&& t) │ │ │ │ │ +26 : _v_a_l_u_e(_s_t_d::make_unique(_s_t_d::forward(t))) │ │ │ │ │ +27 {} │ │ │ │ │ +_2_8 std::unique_ptr _v_a_l_u_e; │ │ │ │ │ +_2_9 T _g_e_t(){ │ │ │ │ │ +30 T tmp = std::move(*_v_a_l_u_e); │ │ │ │ │ +31 _v_a_l_u_e.reset(); │ │ │ │ │ +32 return tmp; │ │ │ │ │ +33 } │ │ │ │ │ +_3_4 operator bool () const { │ │ │ │ │ +35 return (bool)_v_a_l_u_e; │ │ │ │ │ +36 } │ │ │ │ │ +_3_7 T& _o_p_e_r_a_t_o_r_ _*() const{ │ │ │ │ │ +38 return *_v_a_l_u_e; │ │ │ │ │ +39 } │ │ │ │ │ +40 }; │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 struct _B_u_f_f_e_r{ │ │ │ │ │ +_4_4 _B_u_f_f_e_r(bool valid = false) │ │ │ │ │ +45 { │ │ │ │ │ +46 if(valid) │ │ │ │ │ +47 value = T(); │ │ │ │ │ +48 } │ │ │ │ │ +49 template │ │ │ │ │ +_5_0 _B_u_f_f_e_r(V&& t) │ │ │ │ │ +51 : value(_s_t_d::forward(t)) │ │ │ │ │ +52 {} │ │ │ │ │ +_5_3 std::optional> _v_a_l_u_e; │ │ │ │ │ +_5_4 T& _g_e_t(){ │ │ │ │ │ +55 T& tmp = *value; │ │ │ │ │ +56 value.reset(); │ │ │ │ │ +57 return tmp; │ │ │ │ │ +58 } │ │ │ │ │ +_5_9 operator bool () const{ │ │ │ │ │ +60 return (bool)value; │ │ │ │ │ +61 } │ │ │ │ │ +_6_2 T& _o_p_e_r_a_t_o_r_ _*() const{ │ │ │ │ │ +63 return *value; │ │ │ │ │ +64 } │ │ │ │ │ +65 }; │ │ │ │ │ +66 │ │ │ │ │ +67 template<> │ │ │ │ │ +_6_8 struct _B_u_f_f_e_r{ │ │ │ │ │ +_6_9 bool _v_a_l_i_d__; │ │ │ │ │ +_7_0 _B_u_f_f_e_r(bool valid = false) │ │ │ │ │ +71 : valid_(valid) │ │ │ │ │ +72 {} │ │ │ │ │ +_7_3 operator bool () const{ │ │ │ │ │ +74 return valid_; │ │ │ │ │ +75 } │ │ │ │ │ +_7_6 void _g_e_t(){} │ │ │ │ │ +77 }; │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +84 template │ │ │ │ │ +_8_5 class _M_P_I_F_u_t_u_r_e{ │ │ │ │ │ +86 mutable MPI_Request req_; │ │ │ │ │ +87 mutable MPI_Status status_; │ │ │ │ │ +88 _i_m_p_l_:_:_B_u_f_f_e_r_<_R_> data_; │ │ │ │ │ +_8_9 _i_m_p_l_:_:_B_u_f_f_e_r_<_S_> send_data_; │ │ │ │ │ +90 friend class _C_o_m_m_u_n_i_c_a_t_i_o_n; │ │ │ │ │ +91 public: │ │ │ │ │ +_9_2 _M_P_I_F_u_t_u_r_e(bool _v_a_l_i_d = false) │ │ │ │ │ +93 : req_(MPI_REQUEST_NULL) │ │ │ │ │ +94 , data_(_v_a_l_i_d) │ │ │ │ │ +95 {} │ │ │ │ │ +96 │ │ │ │ │ +97 // Hide this constructor if R or S is void │ │ │ │ │ +98 template │ │ │ │ │ +_9_9 _M_P_I_F_u_t_u_r_e(V&& recv_data, U&& send_data, typename std::enable_if_t::value && !std::is_void::value>* = 0) : │ │ │ │ │ +100 req_(MPI_REQUEST_NULL) │ │ │ │ │ +101 , data_(_s_t_d::forward(recv_data)) │ │ │ │ │ +102 , send_data_(_s_t_d::forward(send_data)) │ │ │ │ │ +103 {} │ │ │ │ │ +104 │ │ │ │ │ +105 // hide this constructor if R is void │ │ │ │ │ +106 template │ │ │ │ │ +_1_0_7 _M_P_I_F_u_t_u_r_e(V&& recv_data, typename std::enable_if_t:: │ │ │ │ │ +value>* = 0) │ │ │ │ │ +108 : req_(MPI_REQUEST_NULL) │ │ │ │ │ +109 , data_(_s_t_d::forward(recv_data)) │ │ │ │ │ +110 {} │ │ │ │ │ +111 │ │ │ │ │ +_1_1_2 _~_M_P_I_F_u_t_u_r_e() { │ │ │ │ │ +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 │ │ │ │ │ -121 template │ │ │ │ │ -_1_2_2 constexpr inline static auto _f_a_c_t_o_r_i_a_l (std::integral_constant) │ │ │ │ │ -noexcept │ │ │ │ │ -123 { │ │ │ │ │ -124 return std::integral_constant{}; │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -127 │ │ │ │ │ -129 // T has to be an integral type │ │ │ │ │ -130 template │ │ │ │ │ -_1_3_1 constexpr inline static T _b_i_n_o_m_i_a_l (const T& n, const T& k) noexcept │ │ │ │ │ -132 { │ │ │ │ │ -133 static_assert(std::numeric_limits::is_integer, "`binomial(n, k)` has to │ │ │ │ │ -be called with an integer type."); │ │ │ │ │ -134 │ │ │ │ │ -135 if( k < 0 || k > n ) │ │ │ │ │ -136 return 0; │ │ │ │ │ -137 │ │ │ │ │ -138 if (2*k > n) │ │ │ │ │ -139 return _b_i_n_o_m_i_a_l(n, n-k); │ │ │ │ │ -140 │ │ │ │ │ -141 T bin = 1; │ │ │ │ │ -142 for(auto i = n-k; i < n; ++i) │ │ │ │ │ -143 bin *= i+1; │ │ │ │ │ -144 return bin / _f_a_c_t_o_r_i_a_l(k); │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -148 template │ │ │ │ │ -_1_4_9 constexpr inline static auto _b_i_n_o_m_i_a_l (std::integral_constant, std:: │ │ │ │ │ -integral_constant) noexcept │ │ │ │ │ -150 { │ │ │ │ │ -151 return std::integral_constant{}; │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -154 template │ │ │ │ │ -_1_5_5 constexpr inline static auto _b_i_n_o_m_i_a_l (std::integral_constant, std:: │ │ │ │ │ -integral_constant) noexcept │ │ │ │ │ -156 { │ │ │ │ │ -157 return std::integral_constant= 0 ? 1 : 0)>{}; │ │ │ │ │ +119 } │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +_1_2_2 _M_P_I_F_u_t_u_r_e(_M_P_I_F_u_t_u_r_e&& f) │ │ │ │ │ +123 : req_(MPI_REQUEST_NULL) │ │ │ │ │ +124 , data_(_s_t_d::move(f.data_)) │ │ │ │ │ +125 , send_data_(_s_t_d::move(f.send_data_)) │ │ │ │ │ +126 { │ │ │ │ │ +127 std::swap(req_, f.req_); │ │ │ │ │ +128 std::swap(status_, f.status_); │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +_1_3_1 _M_P_I_F_u_t_u_r_e& _o_p_e_r_a_t_o_r_=(_M_P_I_F_u_t_u_r_e&& 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 │ │ │ │ │ +_1_3_9 bool _v_a_l_i_d() const{ │ │ │ │ │ +140 return (bool)data_; │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +_1_4_3 void _w_a_i_t(){ │ │ │ │ │ +144 if(!_v_a_l_i_d()) │ │ │ │ │ +145 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n, "The MPIFuture is not valid!"); │ │ │ │ │ +146 MPI_Wait(&req_, &status_); │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +_1_4_9 bool _r_e_a_d_y() const{ │ │ │ │ │ +150 int flag = -1; │ │ │ │ │ +151 MPI_Test(&req_, &flag, &status_); │ │ │ │ │ +152 return flag; │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +_1_5_5 R _g_e_t() { │ │ │ │ │ +156 _w_a_i_t(); │ │ │ │ │ +157 return data_.get(); │ │ │ │ │ 158 } │ │ │ │ │ 159 │ │ │ │ │ -160 │ │ │ │ │ -162 // conjugate complex does nothing for non-complex types │ │ │ │ │ -163 template │ │ │ │ │ -_1_6_4 inline K _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const K& x) │ │ │ │ │ -165 { │ │ │ │ │ -166 return x; │ │ │ │ │ +_1_6_0 S _g_e_t___s_e_n_d___d_a_t_a(){ │ │ │ │ │ +161 _w_a_i_t(); │ │ │ │ │ +162 return send_data_._g_e_t(); │ │ │ │ │ +163 } │ │ │ │ │ +164 │ │ │ │ │ +_1_6_5 auto _g_e_t___m_p_i_d_a_t_a(){ │ │ │ │ │ +166 return _g_e_t_M_P_I_D_a_t_a(*data_); │ │ │ │ │ 167 } │ │ │ │ │ 168 │ │ │ │ │ -169#ifndef DOXYGEN │ │ │ │ │ -170 // specialization for complex │ │ │ │ │ -171 template │ │ │ │ │ -172 inline std::complex _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const std::complex& c) │ │ │ │ │ -173 { │ │ │ │ │ -174 return std::complex(c.real(),-c.imag()); │ │ │ │ │ -175 } │ │ │ │ │ +_1_6_9 auto _g_e_t___s_e_n_d___m_p_i_d_a_t_a(){ │ │ │ │ │ +170 return _g_e_t_M_P_I_D_a_t_a(*send_data_); │ │ │ │ │ +171 } │ │ │ │ │ +172 }; │ │ │ │ │ +173 │ │ │ │ │ +174} │ │ │ │ │ +175#endif │ │ │ │ │ 176#endif │ │ │ │ │ -177 │ │ │ │ │ -179 template │ │ │ │ │ -_1_8_0 int _s_i_g_n(const T& val) │ │ │ │ │ -181 { │ │ │ │ │ -182 return (val < 0 ? -1 : 1); │ │ │ │ │ -183 } │ │ │ │ │ -184 │ │ │ │ │ -185 │ │ │ │ │ -186 namespace Impl { │ │ │ │ │ -187 // Returns whether a given type behaves like std::complex<>, i.e. whether │ │ │ │ │ -188 // real() and imag() are defined │ │ │ │ │ -189 template │ │ │ │ │ -190 struct isComplexLike { │ │ │ │ │ -191 private: │ │ │ │ │ -192 template │ │ │ │ │ -193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type()); │ │ │ │ │ -194 │ │ │ │ │ -195 template │ │ │ │ │ -196 static auto test(...) -> decltype(std::false_type()); │ │ │ │ │ -197 │ │ │ │ │ -198 public: │ │ │ │ │ -199 static const bool value = decltype(test(0))::value; │ │ │ │ │ -200 }; │ │ │ │ │ -201 } // namespace Impl │ │ │ │ │ -202 │ │ │ │ │ -204 │ │ │ │ │ -227 namespace MathOverloads { │ │ │ │ │ -228 │ │ │ │ │ -_2_3_0 struct _A_D_L_T_a_g {}; │ │ │ │ │ -231 │ │ │ │ │ -_2_3_2#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \ │ │ │ │ │ -233 template \ │ │ │ │ │ -234 auto function(const T &t, PriorityTag<1>, ADLTag) \ │ │ │ │ │ -235 -> decltype(function(t)) { \ │ │ │ │ │ -236 return function(t); \ │ │ │ │ │ -237 } \ │ │ │ │ │ -238 template \ │ │ │ │ │ -239 auto function(const T &t, PriorityTag<0>, ADLTag) { \ │ │ │ │ │ -240 using std::stdfunction; \ │ │ │ │ │ -241 return stdfunction(t); \ │ │ │ │ │ -242 } \ │ │ │ │ │ -243 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -244 │ │ │ │ │ -_2_4_5 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_N_a_N,isnan); │ │ │ │ │ -_2_4_6 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_I_n_f,isinf); │ │ │ │ │ -_2_4_7 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_F_i_n_i_t_e,isfinite); │ │ │ │ │ -248#undef DUNE_COMMON_MATH_ISFUNCTION │ │ │ │ │ -249 │ │ │ │ │ -250 template │ │ │ │ │ -_2_5_1 auto _i_s_U_n_o_r_d_e_r_e_d(const T &t1, const T &t2, _P_r_i_o_r_i_t_y_T_a_g_<_1_>, _A_D_L_T_a_g) │ │ │ │ │ -252 -> decltype(_i_s_U_n_o_r_d_e_r_e_d(t1, t2)) { │ │ │ │ │ -253 return _i_s_U_n_o_r_d_e_r_e_d(t1, t2); │ │ │ │ │ -254 } │ │ │ │ │ -255 │ │ │ │ │ -256 template │ │ │ │ │ -_2_5_7 auto _i_s_U_n_o_r_d_e_r_e_d(const T &t1, const T &t2, _P_r_i_o_r_i_t_y_T_a_g_<_0_>, _A_D_L_T_a_g) { │ │ │ │ │ -258 using std::isunordered; │ │ │ │ │ -259 return isunordered(t1, t2); │ │ │ │ │ -260 } │ │ │ │ │ -261 } │ │ │ │ │ -262 │ │ │ │ │ -_2_6_3 namespace MathImpl { │ │ │ │ │ -264 │ │ │ │ │ -265 // NOTE: it is important that these functors have names different from the │ │ │ │ │ -266 // names of the functions they are forwarding to. Otherwise the │ │ │ │ │ -267 // unqualified call would find the functor type, not a function, and ADL │ │ │ │ │ -268 // would never be attempted. │ │ │ │ │ -_2_6_9#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \ │ │ │ │ │ -270 struct function##Impl { \ │ │ │ │ │ -271 template \ │ │ │ │ │ -272 constexpr auto operator()(const T &t) const { \ │ │ │ │ │ -273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \ │ │ │ │ │ -274 } \ │ │ │ │ │ -275 }; \ │ │ │ │ │ -276 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -277 │ │ │ │ │ -_2_7_8 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isNaN); │ │ │ │ │ -_2_7_9 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isInf); │ │ │ │ │ -_2_8_0 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isFinite); │ │ │ │ │ -281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR │ │ │ │ │ -282 │ │ │ │ │ -_2_8_3 struct _i_s_U_n_o_r_d_e_r_e_d_I_m_p_l { │ │ │ │ │ -284 template │ │ │ │ │ -_2_8_5 constexpr auto _o_p_e_r_a_t_o_r_(_)(const T &t1, const T &t2) const { │ │ │ │ │ -286 return isUnordered(t1, t2, _P_r_i_o_r_i_t_y_T_a_g_<_1_0_>{}, _M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g{}); │ │ │ │ │ -287 } │ │ │ │ │ -288 }; │ │ │ │ │ -289 │ │ │ │ │ -290 } //MathImpl │ │ │ │ │ -291 │ │ │ │ │ -292 │ │ │ │ │ -293 namespace Impl { │ │ │ │ │ -294 /* This helper has a math functor as a static constexpr member. Doing │ │ │ │ │ -295 this as a static member of a template struct means we can do this │ │ │ │ │ -296 without violating the ODR or putting the definition into a separate │ │ │ │ │ -297 compilation unit, while still still ensuring the functor is the same │ │ │ │ │ -298 lvalue across all compilation units. │ │ │ │ │ -299 */ │ │ │ │ │ -300 template │ │ │ │ │ -301 struct MathDummy │ │ │ │ │ -302 { │ │ │ │ │ -303 static constexpr T value{}; │ │ │ │ │ -304 }; │ │ │ │ │ -305 │ │ │ │ │ -306 template │ │ │ │ │ -307 constexpr T MathDummy::value; │ │ │ │ │ -308 │ │ │ │ │ -309 } //namespace Impl │ │ │ │ │ -310 │ │ │ │ │ -311 namespace { │ │ │ │ │ -312 /* Provide the math functors directly in the `Dune` namespace. │ │ │ │ │ -313 │ │ │ │ │ -314 This actually declares a different name in each translation unit, but │ │ │ │ │ -315 they all resolve to the same lvalue. │ │ │ │ │ -316 */ │ │ │ │ │ -317 │ │ │ │ │ -319 │ │ │ │ │ -323 constexpr auto const &_i_s_N_a_N = Impl::MathDummy::value; │ │ │ │ │ -324 │ │ │ │ │ -326 │ │ │ │ │ -330 constexpr auto const &_i_s_I_n_f = Impl::MathDummy::value; │ │ │ │ │ -331 │ │ │ │ │ -333 │ │ │ │ │ -337 constexpr auto const &_i_s_F_i_n_i_t_e = Impl::MathDummy:: │ │ │ │ │ -value; │ │ │ │ │ -338 │ │ │ │ │ -340 │ │ │ │ │ -345 constexpr auto const &_i_s_U_n_o_r_d_e_r_e_d = Impl::MathDummy::value; │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -348 namespace MathOverloads { │ │ │ │ │ -349 /*Overloads for complex types*/ │ │ │ │ │ -350 template::value> > │ │ │ │ │ -_3_5_1 auto _i_s_N_a_N(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ -352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t)); │ │ │ │ │ -353 } │ │ │ │ │ -354 │ │ │ │ │ -355 template::value> > │ │ │ │ │ -_3_5_6 auto _i_s_I_n_f(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ -357 return Dune::isInf(real(t)) || Dune::isInf(imag(t)); │ │ │ │ │ -358 } │ │ │ │ │ -359 │ │ │ │ │ -360 template::value> > │ │ │ │ │ -_3_6_1 auto _i_s_F_i_n_i_t_e(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ -362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t)); │ │ │ │ │ -363 } │ │ │ │ │ -364 } //MathOverloads │ │ │ │ │ -365} │ │ │ │ │ -366 │ │ │ │ │ -367#endif // #ifndef DUNE_MATH_HH │ │ │ │ │ -_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ -#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) │ │ │ │ │ -DDeeffiinniittiioonn math.hh:269 │ │ │ │ │ -_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N │ │ │ │ │ -#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) │ │ │ │ │ -DDeeffiinniittiioonn math.hh:232 │ │ │ │ │ -_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ +_m_p_i_d_a_t_a_._h_h │ │ │ │ │ +Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ +MPI calls. │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n_._h_h │ │ │ │ │ +Implements an utility class that provides collective communication methods for │ │ │ │ │ +sequential programs. │ │ │ │ │ +_f_u_t_u_r_e_._h_h │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:549 │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_b_i_n_o_m_i_a_l │ │ │ │ │ -static constexpr T binomial(const T &n, const T &k) noexcept │ │ │ │ │ -calculate the binomial coefficient n over k as a constexpr │ │ │ │ │ -DDeeffiinniittiioonn math.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_p_o_w_e_r │ │ │ │ │ -constexpr Base power(Base m, Exponent p) │ │ │ │ │ -Power method for integer exponents. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_f_a_c_t_o_r_i_a_l │ │ │ │ │ -static constexpr T factorial(const T &n) noexcept │ │ │ │ │ -calculate the factorial of n as a constexpr │ │ │ │ │ -DDeeffiinniittiioonn math.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_s_i_g_n │ │ │ │ │ -int sign(const T &val) │ │ │ │ │ -Return the sign of the value. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x │ │ │ │ │ -K conjugateComplex(const K &x) │ │ │ │ │ -compute conjugate complex of x │ │ │ │ │ -DDeeffiinniittiioonn math.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_N_a_N │ │ │ │ │ -bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:604 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_I_n_f │ │ │ │ │ -bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:594 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_F_i_n_i_t_e │ │ │ │ │ -auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:584 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d │ │ │ │ │ -bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, │ │ │ │ │ -PriorityTag< 2 >, ADLTag) │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:614 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ -Standard implementation of MathematicalConstants. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_:_:_e │ │ │ │ │ -static const T e() │ │ │ │ │ -Euler's number. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_:_:_p_i │ │ │ │ │ -static const T pi() │ │ │ │ │ -Archimedes' constant. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ -Provides commonly used mathematical constants. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_a_c_t_o_r_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn math.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_:_:_f_a_c_t_o_r_i_a_l │ │ │ │ │ -static constexpr int factorial │ │ │ │ │ -factorial stores m! │ │ │ │ │ -DDeeffiinniittiioonn math.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g │ │ │ │ │ -Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ -DDeeffiinniittiioonn math.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l │ │ │ │ │ -DDeeffiinniittiioonn math.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -constexpr auto operator()(const T &t1, const T &t2) const │ │ │ │ │ -DDeeffiinniittiioonn math.hh:285 │ │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t_M_P_I_D_a_t_a │ │ │ │ │ +auto getMPIData(T &t) │ │ │ │ │ +DDeeffiinniittiioonn mpidata.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +Collective communication interface and sequential default implementation. │ │ │ │ │ +DDeeffiinniittiioonn communication.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_F_u_t_u_r_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +This exception is thrown when ready(), wait() or get() is called on an invalid │ │ │ │ │ +future.... │ │ │ │ │ +DDeeffiinniittiioonn future.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_:_:_v_a_l_u_e │ │ │ │ │ +std::unique_ptr< T > value │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +T & operator*() const │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_:_:_B_u_f_f_e_r │ │ │ │ │ +Buffer(V &&t) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_:_:_g_e_t │ │ │ │ │ +T get() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_:_:_B_u_f_f_e_r │ │ │ │ │ +Buffer(bool valid) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:20 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _&_ _>_:_:_v_a_l_u_e │ │ │ │ │ +std::optional< std::reference_wrapper< T > > value │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _&_ _>_:_:_B_u_f_f_e_r │ │ │ │ │ +Buffer(bool valid=false) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _&_ _>_:_:_g_e_t │ │ │ │ │ +T & get() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _T_ _&_ _>_:_:_B_u_f_f_e_r │ │ │ │ │ +Buffer(V &&t) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _v_o_i_d_ _>_:_:_v_a_l_i_d__ │ │ │ │ │ +bool valid_ │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _v_o_i_d_ _>_:_:_g_e_t │ │ │ │ │ +void get() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_:_:_B_u_f_f_e_r_<_ _v_o_i_d_ _>_:_:_B_u_f_f_e_r │ │ │ │ │ +Buffer(bool valid=false) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e │ │ │ │ │ +Provides a future-like object for MPI communication. It contains the object │ │ │ │ │ +that will be received and... │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_M_P_I_F_u_t_u_r_e │ │ │ │ │ +MPIFuture(V &&recv_data, typename std::enable_if_t::value > │ │ │ │ │ +*=0) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_r_e_a_d_y │ │ │ │ │ +bool ready() const │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_v_a_l_i_d │ │ │ │ │ +bool valid() const │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_~_M_P_I_F_u_t_u_r_e │ │ │ │ │ +~MPIFuture() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_M_P_I_F_u_t_u_r_e │ │ │ │ │ +MPIFuture(bool valid=false) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +MPIFuture & operator=(MPIFuture &&f) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_g_e_t___s_e_n_d___m_p_i_d_a_t_a │ │ │ │ │ +auto get_send_mpidata() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_w_a_i_t │ │ │ │ │ +void wait() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_g_e_t___m_p_i_d_a_t_a │ │ │ │ │ +auto get_mpidata() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_g_e_t │ │ │ │ │ +R get() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_M_P_I_F_u_t_u_r_e │ │ │ │ │ +MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t::value &&!std::is_void< U >::value > *=0) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_g_e_t___s_e_n_d___d_a_t_a │ │ │ │ │ +S get_send_data() │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_F_u_t_u_r_e_:_:_M_P_I_F_u_t_u_r_e │ │ │ │ │ +MPIFuture(MPIFuture &&f) │ │ │ │ │ +DDeeffiinniittiioonn mpifuture.hh:122 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: simd.hh File Reference │ │ │ │ +dune-common: remoteindices.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,101 +65,89 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
simd.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │
#include <cassert>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <set>
│ │ │ │ #include <utility>
│ │ │ │ -#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>
│ │ │ │ +#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

struct  Dune::SimdScalarTypeTraits< T >
class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
 
struct  Dune::SimdScalarTypeTraits< AlignedNumber< T, align > >
 deduce the underlying scalar data type of an AlignedNumber More...
class  Dune::RemoteIndex< T1, T2 >
 Information about an index residing on another processor. More...
 
struct  Dune::SimdIndexTypeTraits< V, typename >
class  Dune::RemoteIndices< T, A >
 The indices present on remote processes. More...
 
struct  Dune::SimdMaskTypeTraits< V, typename >
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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -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.
 
template<typename V >
using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type
 A simd vector of truth values corresponding to a simd vector V.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

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

Detailed Description

│ │ │ │ -

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

Classes describing a distributed indexset.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,79 +1,72 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -simd.hh File Reference │ │ │ │ │ -Abstractions for support of dedicated SIMD data types. _M_o_r_e_._._. │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +remoteindices.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Classes describing a distributed indexset. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_d_i_t_i_o_n_a_l_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_b_u_g_a_l_i_g_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_c_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_d_e_x_s_e_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_p_l_o_c_a_l_i_n_d_e_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_l_l_i_s_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_<_ _I_n_d_e_x_P_a_i_r_<_ _T_G_,_ _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_ _T_A_ _>_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ -  deduce the underlying scalar data type of an AlignedNumber _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +  Information about an index residing on another processor. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_<_ _V_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_<_ _T_,_ _A_ _> │ │ │ │ │ +  The indices present on remote processes. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_<_ _V_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_ _T_,_ _A_,_ _m_o_d_e_ _> │ │ │ │ │ +  Modifier for adding and/or deleting remote indices from the remote │ │ │ │ │ + index list. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_ _T_,_ _A_,_ _m_o_d_e_ _>_:_:_I_n_v_a_l_i_d_P_o_s_i_t_i_o_n │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ +  A collective iterator for moving over the remote indices for all │ │ │ │ │ + processes collectively. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_ _T_,_ _A_ _>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +  Iterator over the valid underlying iterators. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r = typename _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< T >::type │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_S_i_m_d_I_n_d_e_x = typename _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s< V >::type │ │ │ │ │ -  An simd vector of indices corresponding to a simd vector V. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_S_i_m_d_M_a_s_k = typename _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s< V >::type │ │ │ │ │ -  A simd vector of truth values corresponding to a simd vector V. │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::size_t  _D_u_n_e_:_:_l_a_n_e_s (const T &) │ │ │ │ │ -  get the number of lanes of a simd vector (scalar version) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T  _D_u_n_e_:_:_l_a_n_e (std::size_t l, const T &v) │ │ │ │ │ -  access a lane of a simd vector (scalar version) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T &  _D_u_n_e_:_:_l_a_n_e (std::size_t l, T &v) │ │ │ │ │ -  access a lane of a simd vector (scalar version) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_a_s_s_i_g_n (T &dst, const T &src, bool mask) │ │ │ │ │ -  masked _S_i_m_d assignment (scalar version) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_s_w_a_p (T &v1, T &v2, bool mask) │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _R_e_m_o_t_e_I_n_d_e_x< T1, T2 > │ │ │ │ │ + &index) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _R_e_m_o_t_e_I_n_d_i_c_e_s< T, A > │ │ │ │ │ + &indices) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _R_e_m_o_t_e_I_n_d_e_x< TG, TA > │ │ │ │ │ + &index) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Abstractions for support of dedicated SIMD data types. │ │ │ │ │ -Libraries like Vc (_h_t_t_p_s_:_/_/_g_i_t_h_u_b_._c_o_m_/_V_c_D_e_v_e_l_/_V_c) 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 _c_o_n_d_i_t_i_o_n_a_l_._h_h and range_utils.hh headers. │ │ │ │ │ - _DD_ee_pp_rr_ee_cc_aa_tt_ee_dd_:: │ │ │ │ │ - Use the newer simd architecture from _d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_s_i_m_d_._h_h instead. │ │ │ │ │ +Classes describing a distributed indexset. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: simd.hh Source File │ │ │ │ +dune-common: remoteindices.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,522 +70,1697 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
simd.hh
│ │ │ │ +
remoteindices.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_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{
│ │ │ │ +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_REMOTEINDICES_HH
│ │ │ │ +
6#define DUNE_REMOTEINDICES_HH
│ │ │ │ +
7
│ │ │ │ +
8#if HAVE_MPI
│ │ │ │ +
9
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <iostream>
│ │ │ │ +
12#include <ostream>
│ │ │ │ +
13#include <map>
│ │ │ │ +
14#include <memory>
│ │ │ │ +
15#include <set>
│ │ │ │ +
16#include <utility>
│ │ │ │ +
17#include <vector>
│ │ │ │ +
18
│ │ │ │ +
19#include <mpi.h>
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
25#include <dune/common/sllist.hh>
│ │ │ │ + │ │ │ │ +
27
│ │ │ │ +
28namespace Dune {
│ │ │ │ +
40 template<typename TG, typename TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
42 {
│ │ │ │ +
43 public:
│ │ │ │ +
44 inline static MPI_Datatype getType();
│ │ │ │ +
45 private:
│ │ │ │ +
46 static MPI_Datatype type;
│ │ │ │ +
47 };
│ │ │ │ +
│ │ │ │
48
│ │ │ │ -
49#if HAVE_VC
│ │ │ │ -
50 namespace VcImpl {
│ │ │ │ +
49
│ │ │ │ +
50 template<typename T, typename A>
│ │ │ │ +
51 class RemoteIndices;
│ │ │ │
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_]; }
│ │ │ │ +
53 template<typename T1, typename T2>
│ │ │ │ +
54 class RemoteIndex;
│ │ │ │ +
55
│ │ │ │ +
56 // forward declaration needed for friend declaration.
│ │ │ │ +
57 template<typename T>
│ │ │ │ +
58 class IndicesSyncer;
│ │ │ │ +
59
│ │ │ │ +
60 template<typename T1, typename T2>
│ │ │ │ +
61 std::ostream& operator<<(std::ostream& os, const RemoteIndex<T1,T2>& index);
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ +
64 template<typename T, typename A, bool mode>
│ │ │ │ + │ │ │ │ +
66
│ │ │ │ +
67
│ │ │ │ +
71 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
73 {
│ │ │ │ +
74 template<typename T>
│ │ │ │ +
75 friend class IndicesSyncer;
│ │ │ │ +
76
│ │ │ │ +
77 template<typename T, typename A, typename A1>
│ │ │ │ +
78 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >&,
│ │ │ │ + │ │ │ │ +
80 const T&);
│ │ │ │
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(>>);
│ │ │ │ +
82 template<typename T, typename A, bool mode>
│ │ │ │ + │ │ │ │ +
84
│ │ │ │ +
85 public:
│ │ │ │ +
90 typedef T1 GlobalIndex;
│ │ │ │ +
99 typedef T2 Attribute;
│ │ │ │ +
100
│ │ │ │ + │ │ │ │ + │ │ │ │ +
106
│ │ │ │ +
111 const Attribute attribute() const;
│ │ │ │ +
112
│ │ │ │ +
118 const PairType& localIndexPair() const;
│ │ │ │ +
119
│ │ │ │ +
123 RemoteIndex();
│ │ │ │
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 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 };
│ │ │ │ +
125
│ │ │ │ +
131 RemoteIndex(const T2& attribute,
│ │ │ │ +
132 const PairType* local);
│ │ │ │ +
133
│ │ │ │ +
134
│ │ │ │ +
140 RemoteIndex(const T2& attribute);
│ │ │ │ +
141
│ │ │ │ +
142 bool operator==(const RemoteIndex& ri) const;
│ │ │ │ +
143
│ │ │ │ +
144 bool operator!=(const RemoteIndex& ri) const;
│ │ │ │ +
145 private:
│ │ │ │ +
147 const PairType* localIndex_;
│ │ │ │ +
148
│ │ │ │ +
150 char attribute_;
│ │ │ │ +
151 };
│ │ │ │
│ │ │ │ +
152
│ │ │ │ +
153 template<class T, class A>
│ │ │ │ +
154 std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices);
│ │ │ │ +
155
│ │ │ │ +
156 class InterfaceBuilder;
│ │ │ │ +
157
│ │ │ │ +
158 template<class T, class A>
│ │ │ │ +
159 class CollectiveIterator;
│ │ │ │ +
160
│ │ │ │ +
161 // forward declaration needed for friend declaration.
│ │ │ │ +
162 template<class T>
│ │ │ │ +
163 class IndicesSyncer;
│ │ │ │ +
164
│ │ │ │ +
165 // forward declaration needed for friend declaration.
│ │ │ │ +
166 template<typename T1, typename T2>
│ │ │ │ + │ │ │ │ +
168
│ │ │ │ +
169
│ │ │ │ +
186 template<class T, class A=std::allocator<RemoteIndex<typename T::GlobalIndex,
│ │ │ │ +
187 typename T::LocalIndex::Attribute> > >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 {
│ │ │ │ +
190 friend class InterfaceBuilder;
│ │ │ │ +
191 friend class IndicesSyncer<T>;
│ │ │ │ +
192 template<typename T1, typename A2, typename A1>
│ │ │ │ +
193 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T1::GlobalIndex, typename T1::LocalIndex::Attribute>,A2> >&,
│ │ │ │ + │ │ │ │ +
195 const T1&);
│ │ │ │ +
196
│ │ │ │ +
197 template<class G, class T1, class T2>
│ │ │ │ + │ │ │ │ +
199 friend std::ostream& operator<<<>(std::ostream&, const RemoteIndices<T>&);
│ │ │ │ +
200
│ │ │ │ +
201 public:
│ │ │ │ +
202
│ │ │ │ + │ │ │ │ +
207
│ │ │ │ + │ │ │ │ +
211
│ │ │ │ + │ │ │ │ +
216
│ │ │ │ +
217
│ │ │ │ + │ │ │ │ +
222
│ │ │ │ +
226 typedef typename LocalIndex::Attribute Attribute;
│ │ │ │ +
227
│ │ │ │ + │ │ │ │
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
│ │ │ │ -
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
│ │ │ │ +
233
│ │ │ │ +
237 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
│ │ │ │ +
238
│ │ │ │ + │ │ │ │ + │ │ │ │ +
242
│ │ │ │ +
244 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
│ │ │ │ + │ │ │ │ +
246
│ │ │ │ +
247 typedef typename RemoteIndexMap::const_iterator const_iterator;
│ │ │ │ +
248
│ │ │ │ +
266 inline RemoteIndices(const ParallelIndexSet& source, const ParallelIndexSet& destination,
│ │ │ │ +
267 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>(), bool includeSelf=false);
│ │ │ │ +
268
│ │ │ │ + │ │ │ │ +
270
│ │ │ │ +
278 void setIncludeSelf(bool includeSelf);
│ │ │ │ +
279
│ │ │ │ +
296 void setIndexSets(const ParallelIndexSet& source, const ParallelIndexSet& destination,
│ │ │ │ +
297 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>());
│ │ │ │ +
298
│ │ │ │ +
299 template<typename C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 neighbourIds.clear();
│ │ │ │ +
303 neighbourIds.insert(neighbours.begin(), neighbours.end());
│ │ │ │
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 }
│ │ │ │ +
305 }
│ │ │ │ +
│ │ │ │ +
306
│ │ │ │ +
│ │ │ │ +
307 const std::set<int>& getNeighbours() const
│ │ │ │ +
308 {
│ │ │ │ +
309 return neighbourIds;
│ │ │ │ +
310 }
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ + │ │ │ │
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 }
│ │ │ │ +
326 template<bool ignorePublic>
│ │ │ │ +
327 void rebuild();
│ │ │ │
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 return Vc::Vector<T, A>::size();
│ │ │ │ -
385 }
│ │ │ │ -
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#endif // HAVE_VC
│ │ │ │ +
329 bool operator==(const RemoteIndices& ri) const;
│ │ │ │ +
330
│ │ │ │ +
338 inline bool isSynced() const;
│ │ │ │ +
339
│ │ │ │ +
343 inline MPI_Comm communicator() const;
│ │ │ │ +
344
│ │ │ │ +
359 template<bool mode, bool send>
│ │ │ │ + │ │ │ │ +
361
│ │ │ │ +
368 inline const_iterator find(int proc) const;
│ │ │ │ +
369
│ │ │ │ +
374 inline const_iterator begin() const;
│ │ │ │ +
375
│ │ │ │ +
380 inline const_iterator end() const;
│ │ │ │ +
381
│ │ │ │ +
385 template<bool send>
│ │ │ │ +
386 inline CollectiveIteratorT iterator() const;
│ │ │ │ +
387
│ │ │ │ +
391 inline void free();
│ │ │ │ +
392
│ │ │ │ +
397 inline int neighbours() const;
│ │ │ │ +
398
│ │ │ │ +
400 inline const ParallelIndexSet& sourceIndexSet() const;
│ │ │ │ +
401
│ │ │ │ +
403 inline const ParallelIndexSet& destinationIndexSet() const;
│ │ │ │ +
404
│ │ │ │ +
405 private:
│ │ │ │ +
407 RemoteIndices(const RemoteIndices&) = delete;
│ │ │ │ +
408
│ │ │ │ +
410 const ParallelIndexSet* source_;
│ │ │ │ +
411
│ │ │ │ +
413 const ParallelIndexSet* target_;
│ │ │ │ +
414
│ │ │ │ +
416 MPI_Comm comm_;
│ │ │ │ +
417
│ │ │ │ +
420 std::set<int> neighbourIds;
│ │ │ │ +
421
│ │ │ │ +
423 const static int commTag_=333;
│ │ │ │ +
424
│ │ │ │ +
429 int sourceSeqNo_;
│ │ │ │ +
430
│ │ │ │ +
435 int destSeqNo_;
│ │ │ │ +
436
│ │ │ │ +
440 bool publicIgnored;
│ │ │ │
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
│ │ │ │ -
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
│ │ │ │ +
445 bool firstBuild;
│ │ │ │ +
446
│ │ │ │ +
447 /*
│ │ │ │ +
448 * @brief If true, sending from indices of the processor to other
│ │ │ │ +
449 * indices on the same processor is enabled even if the same indexset is used
│ │ │ │ +
450 * on both the
│ │ │ │ +
451 * sending and receiving side.
│ │ │ │ +
452 */
│ │ │ │ +
453 bool includeSelf;
│ │ │ │ +
454
│ │ │ │ + │ │ │ │ +
457 PairType;
│ │ │ │ +
458
│ │ │ │ +
465 RemoteIndexMap remoteIndices_;
│ │ │ │ +
466
│ │ │ │ +
477 template<bool ignorePublic>
│ │ │ │ +
478 inline void buildRemote(bool includeSelf);
│ │ │ │ +
479
│ │ │ │ +
485 inline int noPublic(const ParallelIndexSet& indexSet);
│ │ │ │ +
486
│ │ │ │ +
498 template<bool ignorePublic>
│ │ │ │ +
499 inline void packEntries(PairType** myPairs, const ParallelIndexSet& indexSet,
│ │ │ │ +
500 char* p_out, MPI_Datatype type, int bufferSize,
│ │ │ │ +
501 int* position, int n);
│ │ │ │
502
│ │ │ │ -
503#endif // DUNE_COMMON_SIMD_HH
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ - │ │ │ │ -
Compatibility header for including <Vc/Vc>
│ │ │ │ -
Utilities for reduction like operations on ranges.
│ │ │ │ - │ │ │ │ +
516 inline void unpackIndices(RemoteIndexList& remote, int remoteEntries,
│ │ │ │ +
517 PairType** local, int localEntries, char* p_in,
│ │ │ │ +
518 MPI_Datatype type, int* position, int bufferSize,
│ │ │ │ +
519 bool fromOurself);
│ │ │ │ +
520
│ │ │ │ +
521 inline void unpackIndices(RemoteIndexList& send, RemoteIndexList& receive,
│ │ │ │ +
522 int remoteEntries, PairType** localSource,
│ │ │ │ +
523 int localSourceEntries, PairType** localDest,
│ │ │ │ +
524 int localDestEntries, char* p_in,
│ │ │ │ +
525 MPI_Datatype type, int* position, int bufferSize);
│ │ │ │ +
526
│ │ │ │ +
527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** DestPairs,
│ │ │ │ +
528 int remoteProc, int sourcePublish, int destPublish,
│ │ │ │ +
529 int bufferSize, bool sendTwo, bool fromOurSelf=false);
│ │ │ │ +
530 };
│ │ │ │ +
│ │ │ │ +
531
│ │ │ │ +
549 template<class T, class A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
551 {
│ │ │ │ +
552
│ │ │ │ +
553 template<typename T1, typename A1>
│ │ │ │ +
554 friend class RemoteIndices;
│ │ │ │ +
555
│ │ │ │ +
556 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
558 {};
│ │ │ │ +
│ │ │ │ +
559
│ │ │ │ +
568 constexpr static bool MODIFYINDEXSET = mode;
│ │ │ │ +
569
│ │ │ │ + │ │ │ │ +
574
│ │ │ │ + │ │ │ │ +
579
│ │ │ │ + │ │ │ │ +
584
│ │ │ │ +
588 typedef typename LocalIndex::Attribute Attribute;
│ │ │ │ +
589
│ │ │ │ + │ │ │ │ +
594
│ │ │ │ +
598 typedef A Allocator;
│ │ │ │ +
599
│ │ │ │ + │ │ │ │ + │ │ │ │ +
603
│ │ │ │ + │ │ │ │ +
608
│ │ │ │ + │ │ │ │ +
613
│ │ │ │ +
627 void insert(const RemoteIndex& index);
│ │ │ │ +
628
│ │ │ │ +
629
│ │ │ │ +
644 void insert(const RemoteIndex& index, const GlobalIndex& global);
│ │ │ │ +
645
│ │ │ │ +
653 bool remove(const GlobalIndex& global);
│ │ │ │ +
654
│ │ │ │ + │ │ │ │ +
668
│ │ │ │ +
669
│ │ │ │ + │ │ │ │ +
671
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
677 : glist_()
│ │ │ │ +
678 {}
│ │ │ │ +
│ │ │ │ +
679
│ │ │ │ +
680 private:
│ │ │ │ +
681
│ │ │ │ + │ │ │ │ +
688 RemoteIndexList& rList);
│ │ │ │ +
689
│ │ │ │ +
690 typedef SLList<GlobalIndex,Allocator> GlobalList;
│ │ │ │ +
691 typedef typename GlobalList::ModifyIterator GlobalModifyIterator;
│ │ │ │ +
692 RemoteIndexList* rList_;
│ │ │ │ +
693 const ParallelIndexSet* indexSet_;
│ │ │ │ +
694 GlobalList glist_;
│ │ │ │ +
695 ModifyIterator iter_;
│ │ │ │ +
696 GlobalModifyIterator giter_;
│ │ │ │ +
697 ConstIterator end_;
│ │ │ │ +
698 bool first_;
│ │ │ │ +
699 GlobalIndex last_;
│ │ │ │ +
700 };
│ │ │ │ +
│ │ │ │ +
701
│ │ │ │ +
706 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
708 {
│ │ │ │ +
709
│ │ │ │ +
713 typedef T ParallelIndexSet;
│ │ │ │ +
714
│ │ │ │ +
718 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ +
719
│ │ │ │ +
723 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
│ │ │ │ +
724
│ │ │ │ +
728 typedef typename LocalIndex::Attribute Attribute;
│ │ │ │ +
729
│ │ │ │ + │ │ │ │ +
732
│ │ │ │ +
734 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
│ │ │ │ +
735
│ │ │ │ + │ │ │ │ +
738
│ │ │ │ +
740 typedef std::map<int,std::pair<typename RemoteIndexList::const_iterator,
│ │ │ │ +
741 const typename RemoteIndexList::const_iterator> >
│ │ │ │ +
742 Map;
│ │ │ │ +
743
│ │ │ │ +
744 public:
│ │ │ │ +
745
│ │ │ │ +
747 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
│ │ │ │ + │ │ │ │ +
749
│ │ │ │ +
755 inline CollectiveIterator(const RemoteIndexMap& map_, bool send);
│ │ │ │ +
756
│ │ │ │ +
765 inline void advance(const GlobalIndex& global);
│ │ │ │ +
766
│ │ │ │ +
776 inline void advance(const GlobalIndex& global, const Attribute& attribute);
│ │ │ │ +
777
│ │ │ │ + │ │ │ │ +
779
│ │ │ │ +
783 inline bool empty() const;
│ │ │ │ +
784
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
792 {
│ │ │ │ +
793 public:
│ │ │ │ +
794 typedef typename Map::iterator RealIterator;
│ │ │ │ +
795 typedef typename Map::iterator ConstRealIterator;
│ │ │ │ +
796
│ │ │ │ +
797
│ │ │ │ +
│ │ │ │ +
799 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex& index)
│ │ │ │ +
800 : iter_(iter), end_(end), index_(index), hasAttribute(false)
│ │ │ │ +
801 {
│ │ │ │ +
802 // Move to the first valid entry
│ │ │ │ +
803 while(iter_!=end_ && iter_->second.first->localIndexPair().global()!=index_)
│ │ │ │ +
804 ++iter_;
│ │ │ │ +
805 }
│ │ │ │ +
│ │ │ │ +
806
│ │ │ │ +
│ │ │ │ +
807 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex index,
│ │ │ │ +
808 Attribute attribute)
│ │ │ │ +
809 : iter_(iter), end_(end), index_(index), attribute_(attribute), hasAttribute(true)
│ │ │ │ +
810 {
│ │ │ │ +
811 // Move to the first valid entry or the end
│ │ │ │ +
812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_
│ │ │ │ +
813 || iter_->second.first->localIndexPair().local().attribute()!=attribute))
│ │ │ │ +
814 ++iter_;
│ │ │ │ +
815 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
817 iterator(const iterator& other)
│ │ │ │ +
818 : iter_(other.iter_), end_(other.end_), index_(other.index_)
│ │ │ │ +
819 { }
│ │ │ │ +
│ │ │ │ +
820
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
823 {
│ │ │ │ +
824 ++iter_;
│ │ │ │ +
825 // If entry is not valid move on
│ │ │ │ +
826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_ ||
│ │ │ │ +
827 (hasAttribute &&
│ │ │ │ +
828 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))
│ │ │ │ +
829 ++iter_;
│ │ │ │ +
830 assert(iter_==end_ ||
│ │ │ │ +
831 (iter_->second.first->localIndexPair().global()==index_));
│ │ │ │ +
832 assert(iter_==end_ || !hasAttribute ||
│ │ │ │ +
833 (iter_->second.first->localIndexPair().local().attribute()==attribute_));
│ │ │ │ +
834 return *this;
│ │ │ │ +
835 }
│ │ │ │ +
│ │ │ │ +
836
│ │ │ │ +
│ │ │ │ +
838 const RemoteIndex& operator*() const
│ │ │ │ +
839 {
│ │ │ │ +
840 return *(iter_->second.first);
│ │ │ │ +
841 }
│ │ │ │ +
│ │ │ │ +
842
│ │ │ │ +
│ │ │ │ +
844 int process() const
│ │ │ │ +
845 {
│ │ │ │ +
846 return iter_->first;
│ │ │ │ +
847 }
│ │ │ │ +
│ │ │ │ +
848
│ │ │ │ +
│ │ │ │ +
850 const RemoteIndex* operator->() const
│ │ │ │ +
851 {
│ │ │ │ +
852 return iter_->second.first.operator->();
│ │ │ │ +
853 }
│ │ │ │ +
│ │ │ │ +
854
│ │ │ │ +
│ │ │ │ +
856 bool operator==(const iterator& other) const
│ │ │ │ +
857 {
│ │ │ │ +
858 return other.iter_==iter_;
│ │ │ │ +
859 }
│ │ │ │ +
│ │ │ │ +
860
│ │ │ │ +
│ │ │ │ +
862 bool operator!=(const iterator& other) const
│ │ │ │ +
863 {
│ │ │ │ +
864 return other.iter_!=iter_;
│ │ │ │ +
865 }
│ │ │ │ +
│ │ │ │ +
866
│ │ │ │ +
867 private:
│ │ │ │ +
868 iterator();
│ │ │ │ +
869
│ │ │ │ +
870 RealIterator iter_;
│ │ │ │ +
871 RealIterator end_;
│ │ │ │ +
872 GlobalIndex index_;
│ │ │ │ +
873 Attribute attribute_;
│ │ │ │ +
874 bool hasAttribute;
│ │ │ │ +
875 };
│ │ │ │ +
│ │ │ │ +
876
│ │ │ │ +
877 iterator begin();
│ │ │ │ +
878
│ │ │ │ +
879 iterator end();
│ │ │ │ +
880
│ │ │ │ +
881 private:
│ │ │ │ +
882
│ │ │ │ +
883 Map map_;
│ │ │ │ +
884 GlobalIndex index_;
│ │ │ │ +
885 Attribute attribute_;
│ │ │ │ +
886 bool noattribute;
│ │ │ │ +
887 };
│ │ │ │ +
│ │ │ │ +
888
│ │ │ │ +
889 template<typename TG, typename TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
891 {
│ │ │ │ +
892 if(type==MPI_DATATYPE_NULL) {
│ │ │ │ +
893 int length[2] = {1, 1};
│ │ │ │ +
894 MPI_Aint base;
│ │ │ │ +
895 MPI_Aint disp[2];
│ │ │ │ +
896 MPI_Datatype types[2] = {MPITraits<TG>::getType(),
│ │ │ │ + │ │ │ │ + │ │ │ │ +
899 MPI_Get_address(&rep, &base); // lower bound of the datatype
│ │ │ │ +
900 MPI_Get_address(&(rep.global_), &disp[0]);
│ │ │ │ +
901 MPI_Get_address(&(rep.local_), &disp[1]);
│ │ │ │ +
902 for (MPI_Aint& d : disp)
│ │ │ │ +
903 d -= base;
│ │ │ │ +
904
│ │ │ │ +
905 MPI_Datatype tmp;
│ │ │ │ +
906 MPI_Type_create_struct(2, length, disp, types, &tmp);
│ │ │ │ +
907
│ │ │ │ +
908 MPI_Type_create_resized(tmp, 0, sizeof(IndexPair<TG,ParallelLocalIndex<TA> >), &type);
│ │ │ │ +
909 MPI_Type_commit(&type);
│ │ │ │ +
910
│ │ │ │ +
911 MPI_Type_free(&tmp);
│ │ │ │ +
912 }
│ │ │ │ +
913 return type;
│ │ │ │ +
914 }
│ │ │ │ +
│ │ │ │ +
915
│ │ │ │ +
916 template<typename TG, typename TA>
│ │ │ │ +
917 MPI_Datatype MPITraits<IndexPair<TG,ParallelLocalIndex<TA> > >::type=MPI_DATATYPE_NULL;
│ │ │ │ +
918
│ │ │ │ +
919 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ +
920 RemoteIndex<T1,T2>::RemoteIndex(const T2& attribute, const PairType* local)
│ │ │ │ +
921 : localIndex_(local), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
│ │ │ │ +
922 {}
│ │ │ │ +
│ │ │ │ +
923
│ │ │ │ +
924 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
926 : localIndex_(0), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
│ │ │ │ +
927 {}
│ │ │ │ +
│ │ │ │ +
928
│ │ │ │ +
929 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
931 : localIndex_(0), attribute_()
│ │ │ │ +
932 {}
│ │ │ │ +
│ │ │ │ +
933 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ +
934 inline bool RemoteIndex<T1,T2>::operator==(const RemoteIndex& ri) const
│ │ │ │ +
935 {
│ │ │ │ +
936 return localIndex_==ri.localIndex_ && attribute_==ri.attribute;
│ │ │ │ +
937 }
│ │ │ │ +
│ │ │ │ +
938
│ │ │ │ +
939 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ +
940 inline bool RemoteIndex<T1,T2>::operator!=(const RemoteIndex& ri) const
│ │ │ │ +
941 {
│ │ │ │ +
942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;
│ │ │ │ +
943 }
│ │ │ │ +
│ │ │ │ +
944
│ │ │ │ +
945 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ +
946 inline const T2 RemoteIndex<T1,T2>::attribute() const
│ │ │ │ +
947 {
│ │ │ │ +
948 return T2(attribute_);
│ │ │ │ +
949 }
│ │ │ │ +
│ │ │ │ +
950
│ │ │ │ +
951 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
953 {
│ │ │ │ +
954 return *localIndex_;
│ │ │ │ +
955 }
│ │ │ │ +
│ │ │ │ +
956
│ │ │ │ +
957 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
959 const ParallelIndexSet& destination,
│ │ │ │ +
960 const MPI_Comm& comm,
│ │ │ │ +
961 const std::vector<int>& neighbours,
│ │ │ │ +
962 bool includeSelf_)
│ │ │ │ +
963 : source_(&source), target_(&destination), comm_(comm),
│ │ │ │ +
964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),
│ │ │ │ +
965 includeSelf(includeSelf_)
│ │ │ │ +
966 {
│ │ │ │ + │ │ │ │ +
968 }
│ │ │ │ +
│ │ │ │ +
969
│ │ │ │ +
970 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
972 {
│ │ │ │ +
973 includeSelf=b;
│ │ │ │ +
974 }
│ │ │ │ +
│ │ │ │ +
975
│ │ │ │ +
976 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
978 : source_(0), target_(0), sourceSeqNo_(-1),
│ │ │ │ +
979 destSeqNo_(-1), publicIgnored(false), firstBuild(true),
│ │ │ │ +
980 includeSelf(false)
│ │ │ │ +
981 {}
│ │ │ │ +
│ │ │ │ +
982
│ │ │ │ +
983 template<class T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
985 const ParallelIndexSet& destination,
│ │ │ │ +
986 const MPI_Comm& comm,
│ │ │ │ +
987 const std::vector<int>& neighbours)
│ │ │ │ +
988 {
│ │ │ │ +
989 free();
│ │ │ │ +
990 source_ = &source;
│ │ │ │ +
991 target_ = &destination;
│ │ │ │ +
992 comm_ = comm;
│ │ │ │ +
993 firstBuild = true;
│ │ │ │ +
994 setNeighbours(neighbours);
│ │ │ │ +
995 }
│ │ │ │ +
│ │ │ │ +
996
│ │ │ │ +
997 template<typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
1000 {
│ │ │ │ +
1001 return *source_;
│ │ │ │ +
1002 }
│ │ │ │ +
│ │ │ │ +
1003
│ │ │ │ +
1004
│ │ │ │ +
1005 template<typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
1008 {
│ │ │ │ +
1009 return *target_;
│ │ │ │ +
1010 }
│ │ │ │ +
│ │ │ │ +
1011
│ │ │ │ +
1012
│ │ │ │ +
1013 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1015 {
│ │ │ │ +
1016 free();
│ │ │ │ +
1017 }
│ │ │ │ +
│ │ │ │ +
1018
│ │ │ │ +
1019 template<typename T, typename A>
│ │ │ │ +
1020 template<bool ignorePublic>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1022 const ParallelIndexSet& indexSet,
│ │ │ │ +
1023 char* p_out, MPI_Datatype type,
│ │ │ │ +
1024 int bufferSize,
│ │ │ │ +
1025 int *position,
│ │ │ │ +
1026 [[maybe_unused]] int n)
│ │ │ │ +
1027 {
│ │ │ │ +
1028 // fill with own indices
│ │ │ │ +
1029 const auto end = indexSet.end();
│ │ │ │ +
1030
│ │ │ │ +
1031 //Now pack the source indices
│ │ │ │ +
1032 int i=0;
│ │ │ │ +
1033 for(auto index = indexSet.begin(); index != end; ++index)
│ │ │ │ +
1034 if(ignorePublic || index->local().isPublic()) {
│ │ │ │ +
1035
│ │ │ │ +
1036 MPI_Pack(const_cast<PairType*>(&(*index)), 1,
│ │ │ │ +
1037 type,
│ │ │ │ +
1038 p_out, bufferSize, position, comm_);
│ │ │ │ +
1039 pairs[i++] = const_cast<PairType*>(&(*index));
│ │ │ │ +
1040
│ │ │ │ +
1041 }
│ │ │ │ +
1042 assert(i==n);
│ │ │ │ +
1043 }
│ │ │ │ +
│ │ │ │ +
1044
│ │ │ │ +
1045 template<typename T, typename A>
│ │ │ │ +
1046 inline int RemoteIndices<T,A>::noPublic(const ParallelIndexSet& indexSet)
│ │ │ │ +
1047 {
│ │ │ │ +
1048
│ │ │ │ +
1049 int noPublic=0;
│ │ │ │ +
1050
│ │ │ │ +
1051 const auto end=indexSet.end();
│ │ │ │ +
1052 for(auto index=indexSet.begin(); index!=end; ++index)
│ │ │ │ +
1053 if(index->local().isPublic())
│ │ │ │ +
1054 noPublic++;
│ │ │ │ +
1055
│ │ │ │ +
1056 return noPublic;
│ │ │ │ +
1057
│ │ │ │ +
1058 }
│ │ │ │ +
1059
│ │ │ │ +
1060
│ │ │ │ +
1061 template<typename T, typename A>
│ │ │ │ +
1062 inline void RemoteIndices<T,A>::unpackCreateRemote(char* p_in, PairType** sourcePairs,
│ │ │ │ +
1063 PairType** destPairs, int remoteProc,
│ │ │ │ +
1064 int sourcePublish, int destPublish,
│ │ │ │ +
1065 int bufferSize, bool sendTwo,
│ │ │ │ +
1066 bool fromOurSelf)
│ │ │ │ +
1067 {
│ │ │ │ +
1068
│ │ │ │ +
1069 // unpack the number of indices we received
│ │ │ │ +
1070 int noRemoteSource=-1, noRemoteDest=-1;
│ │ │ │ +
1071 char twoIndexSets=0;
│ │ │ │ +
1072 int position=0;
│ │ │ │ +
1073 // Did we receive two index sets?
│ │ │ │ +
1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, comm_);
│ │ │ │ +
1075 // The number of source indices received
│ │ │ │ +
1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, comm_);
│ │ │ │ +
1077 // The number of destination indices received
│ │ │ │ +
1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);
│ │ │ │ +
1079
│ │ │ │ +
1080
│ │ │ │ +
1081 // Indices for which we receive
│ │ │ │ +
1082 RemoteIndexList* receive= new RemoteIndexList();
│ │ │ │ +
1083 // Indices for which we send
│ │ │ │ +
1084 RemoteIndexList* send=0;
│ │ │ │ +
1085
│ │ │ │ +
1086 MPI_Datatype type= MPITraits<PairType>::getType();
│ │ │ │ +
1087
│ │ │ │ +
1088 if(!twoIndexSets) {
│ │ │ │ +
1089 if(sendTwo) {
│ │ │ │ +
1090 send = new RemoteIndexList();
│ │ │ │ +
1091 // Create both remote index sets simultaneously
│ │ │ │ +
1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,
│ │ │ │ +
1093 destPairs, destPublish, p_in, type, &position, bufferSize);
│ │ │ │ +
1094 }else{
│ │ │ │ +
1095 // we only need one list
│ │ │ │ +
1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,
│ │ │ │ +
1097 p_in, type, &position, bufferSize, fromOurSelf);
│ │ │ │ +
1098 send=receive;
│ │ │ │ +
1099 }
│ │ │ │ +
1100 }else{
│ │ │ │ +
1101
│ │ │ │ +
1102 int oldPos=position;
│ │ │ │ +
1103 // Two index sets received
│ │ │ │ +
1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,
│ │ │ │ +
1105 p_in, type, &position, bufferSize, fromOurSelf);
│ │ │ │ +
1106 if(!sendTwo)
│ │ │ │ +
1107 //unpack source entries again as destination entries
│ │ │ │ +
1108 position=oldPos;
│ │ │ │ +
1109
│ │ │ │ +
1110 send = new RemoteIndexList();
│ │ │ │ +
1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,
│ │ │ │ +
1112 p_in, type, &position, bufferSize, fromOurSelf);
│ │ │ │ +
1113 }
│ │ │ │ +
1114
│ │ │ │ +
1115 if(receive->empty() && send->empty()) {
│ │ │ │ +
1116 if(send==receive) {
│ │ │ │ +
1117 delete send;
│ │ │ │ +
1118 }else{
│ │ │ │ +
1119 delete send;
│ │ │ │ +
1120 delete receive;
│ │ │ │ +
1121 }
│ │ │ │ +
1122 }else{
│ │ │ │ +
1123 remoteIndices_.insert(std::make_pair(remoteProc,
│ │ │ │ +
1124 std::make_pair(send,receive)));
│ │ │ │ +
1125 }
│ │ │ │ +
1126 }
│ │ │ │ +
1127
│ │ │ │ +
1128
│ │ │ │ +
1129 template<typename T, typename A>
│ │ │ │ +
1130 template<bool ignorePublic>
│ │ │ │ +
1131 inline void RemoteIndices<T,A>::buildRemote(bool includeSelf_)
│ │ │ │ +
1132 {
│ │ │ │ +
1133 // Processor configuration
│ │ │ │ +
1134 int rank, procs;
│ │ │ │ +
1135 MPI_Comm_rank(comm_, &rank);
│ │ │ │ +
1136 MPI_Comm_size(comm_, &procs);
│ │ │ │ +
1137
│ │ │ │ +
1138 // number of local indices to publish
│ │ │ │ +
1139 // The indices of the destination will be send.
│ │ │ │ +
1140 int sourcePublish, destPublish;
│ │ │ │ +
1141
│ │ │ │ +
1142 // Do we need to send two index sets?
│ │ │ │ +
1143 char sendTwo = (source_ != target_);
│ │ │ │ +
1144
│ │ │ │ +
1145 if(procs==1 && !(sendTwo || includeSelf_))
│ │ │ │ +
1146 // Nothing to communicate
│ │ │ │ +
1147 return;
│ │ │ │ +
1148
│ │ │ │ +
1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);
│ │ │ │ +
1150
│ │ │ │ +
1151 if(sendTwo)
│ │ │ │ +
1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);
│ │ │ │ +
1153 else
│ │ │ │ +
1154 // we only need to send one set of indices
│ │ │ │ +
1155 destPublish = 0;
│ │ │ │ +
1156
│ │ │ │ +
1157 int maxPublish, publish=sourcePublish+destPublish;
│ │ │ │ +
1158
│ │ │ │ +
1159 // Calculate maximum number of indices send
│ │ │ │ +
1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);
│ │ │ │ +
1161
│ │ │ │ +
1162 // allocate buffers
│ │ │ │ +
1163 PairType** destPairs;
│ │ │ │ +
1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : 1];
│ │ │ │ +
1165
│ │ │ │ +
1166 if(sendTwo)
│ │ │ │ +
1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1];
│ │ │ │ +
1168 else
│ │ │ │ +
1169 destPairs=sourcePairs;
│ │ │ │ +
1170
│ │ │ │ +
1171 char** buffer = new char*[2];
│ │ │ │ +
1172 int bufferSize;
│ │ │ │ +
1173 int position=0;
│ │ │ │ +
1174 int intSize;
│ │ │ │ +
1175 int charSize;
│ │ │ │ +
1176
│ │ │ │ +
1177 // calculate buffer size
│ │ │ │ +
1178 MPI_Datatype type = MPITraits<PairType>::getType();
│ │ │ │ +
1179
│ │ │ │ +
1180 MPI_Pack_size(maxPublish, type, comm_,
│ │ │ │ +
1181 &bufferSize);
│ │ │ │ +
1182 MPI_Pack_size(1, MPI_INT, comm_,
│ │ │ │ +
1183 &intSize);
│ │ │ │ +
1184 MPI_Pack_size(1, MPI_CHAR, comm_,
│ │ │ │ +
1185 &charSize);
│ │ │ │ +
1186 // Our message will contain the following:
│ │ │ │ +
1187 // a bool whether two index sets where sent
│ │ │ │ +
1188 // the size of the source and the dest indexset,
│ │ │ │ +
1189 // then the source and destination indices
│ │ │ │ +
1190 bufferSize += 2 * intSize + charSize;
│ │ │ │ +
1191
│ │ │ │ +
1192 if(bufferSize<=0) bufferSize=1;
│ │ │ │ +
1193
│ │ │ │ +
1194 buffer[0] = new char[bufferSize];
│ │ │ │ +
1195 buffer[1] = new char[bufferSize];
│ │ │ │ +
1196
│ │ │ │ +
1197
│ │ │ │ +
1198 // pack entries into buffer[0], p_out below!
│ │ │ │ +
1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,
│ │ │ │ +
1200 comm_);
│ │ │ │ +
1201
│ │ │ │ +
1202 // The number of indices we send for each index set
│ │ │ │ +
1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,
│ │ │ │ +
1204 comm_);
│ │ │ │ +
1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,
│ │ │ │ +
1206 comm_);
│ │ │ │ +
1207
│ │ │ │ +
1208 // Now pack the source indices and setup the destination pairs
│ │ │ │ +
1209 packEntries<ignorePublic>(sourcePairs, *source_, buffer[0], type,
│ │ │ │ +
1210 bufferSize, &position, sourcePublish);
│ │ │ │ +
1211 // If necessary send the dest indices and setup the source pairs
│ │ │ │ +
1212 if(sendTwo)
│ │ │ │ +
1213 packEntries<ignorePublic>(destPairs, *target_, buffer[0], type,
│ │ │ │ +
1214 bufferSize, &position, destPublish);
│ │ │ │ +
1215
│ │ │ │ +
1216
│ │ │ │ +
1217 // Update remote indices for ourself
│ │ │ │ +
1218 if(sendTwo|| includeSelf_)
│ │ │ │ +
1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,
│ │ │ │ +
1220 destPublish, bufferSize, sendTwo, includeSelf_);
│ │ │ │ +
1221
│ │ │ │ +
1222 neighbourIds.erase(rank);
│ │ │ │ +
1223
│ │ │ │ +
1224 if(neighbourIds.size()==0)
│ │ │ │ +
1225 {
│ │ │ │ +
1226 Dune::dvverb<<rank<<": Sending messages in a ring"<<std::endl;
│ │ │ │ +
1227 // send messages in ring
│ │ │ │ +
1228 for(int proc=1; proc<procs; proc++) {
│ │ │ │ +
1229 // pointers to the current input and output buffers
│ │ │ │ +
1230 char* p_out = buffer[1-(proc%2)];
│ │ │ │ +
1231 char* p_in = buffer[proc%2];
│ │ │ │ +
1232
│ │ │ │ +
1233 MPI_Status status;
│ │ │ │ +
1234 if(rank%2==0) {
│ │ │ │ +
1235 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
│ │ │ │ +
1236 commTag_, comm_);
│ │ │ │ +
1237 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
│ │ │ │ +
1238 commTag_, comm_, &status);
│ │ │ │ +
1239 }else{
│ │ │ │ +
1240 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
│ │ │ │ +
1241 commTag_, comm_, &status);
│ │ │ │ +
1242 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
│ │ │ │ +
1243 commTag_, comm_);
│ │ │ │ +
1244 }
│ │ │ │ +
1245
│ │ │ │ +
1246
│ │ │ │ +
1247 // The process these indices are from
│ │ │ │ +
1248 int remoteProc = (rank+procs-proc)%procs;
│ │ │ │ +
1249
│ │ │ │ +
1250 unpackCreateRemote(p_in, sourcePairs, destPairs, remoteProc, sourcePublish,
│ │ │ │ +
1251 destPublish, bufferSize, sendTwo);
│ │ │ │ +
1252
│ │ │ │ +
1253 }
│ │ │ │ +
1254
│ │ │ │ +
1255 }
│ │ │ │ +
1256 else
│ │ │ │ +
1257 {
│ │ │ │ +
1258 MPI_Request* requests=new MPI_Request[neighbourIds.size()];
│ │ │ │ +
1259 MPI_Request* req=requests;
│ │ │ │ +
1260
│ │ │ │ +
1261 typedef typename std::set<int>::size_type size_type;
│ │ │ │ +
1262 size_type noNeighbours=neighbourIds.size();
│ │ │ │ +
1263
│ │ │ │ +
1264 // setup sends
│ │ │ │ +
1265 for(std::set<int>::iterator neighbour=neighbourIds.begin();
│ │ │ │ +
1266 neighbour!= neighbourIds.end(); ++neighbour) {
│ │ │ │ +
1267 // Only send the information to the neighbouring processors
│ │ │ │ +
1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, req++);
│ │ │ │ +
1269 }
│ │ │ │ +
1270
│ │ │ │ +
1271 //Test for received messages
│ │ │ │ +
1272
│ │ │ │ +
1273 for(size_type received=0; received <noNeighbours; ++received)
│ │ │ │ +
1274 {
│ │ │ │ +
1275 MPI_Status status;
│ │ │ │ +
1276 // probe for next message
│ │ │ │ +
1277 MPI_Probe(MPI_ANY_SOURCE, commTag_, comm_, &status);
│ │ │ │ +
1278 int remoteProc=status.MPI_SOURCE;
│ │ │ │ +
1279 int size;
│ │ │ │ +
1280 MPI_Get_count(&status, MPI_PACKED, &size);
│ │ │ │ +
1281 // receive message
│ │ │ │ +
1282 MPI_Recv(buffer[1], size, MPI_PACKED, remoteProc,
│ │ │ │ +
1283 commTag_, comm_, &status);
│ │ │ │ +
1284
│ │ │ │ +
1285 unpackCreateRemote(buffer[1], sourcePairs, destPairs, remoteProc, sourcePublish,
│ │ │ │ +
1286 destPublish, bufferSize, sendTwo);
│ │ │ │ +
1287 }
│ │ │ │ +
1288 // wait for completion of pending requests
│ │ │ │ +
1289 MPI_Status* statuses = new MPI_Status[neighbourIds.size()];
│ │ │ │ +
1290
│ │ │ │ +
1291 if(MPI_ERR_IN_STATUS==MPI_Waitall(neighbourIds.size(), requests, statuses)) {
│ │ │ │ +
1292 for(size_type i=0; i < neighbourIds.size(); ++i)
│ │ │ │ +
1293 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
│ │ │ │ +
1294 std::cerr<<rank<<": MPI_Error occurred while receiving message."<<std::endl;
│ │ │ │ +
1295 MPI_Abort(comm_, 999);
│ │ │ │ +
1296 }
│ │ │ │ +
1297 }
│ │ │ │ +
1298 delete[] requests;
│ │ │ │ +
1299 delete[] statuses;
│ │ │ │ +
1300 }
│ │ │ │ +
1301
│ │ │ │ +
1302
│ │ │ │ +
1303 // delete allocated memory
│ │ │ │ +
1304 if(destPairs!=sourcePairs)
│ │ │ │ +
1305 delete[] destPairs;
│ │ │ │ +
1306
│ │ │ │ +
1307 delete[] sourcePairs;
│ │ │ │ +
1308 delete[] buffer[0];
│ │ │ │ +
1309 delete[] buffer[1];
│ │ │ │ +
1310 delete[] buffer;
│ │ │ │ +
1311 }
│ │ │ │ +
1312
│ │ │ │ +
1313 template<typename T, typename A>
│ │ │ │ +
1314 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& remote,
│ │ │ │ +
1315 int remoteEntries,
│ │ │ │ +
1316 PairType** local,
│ │ │ │ +
1317 int localEntries,
│ │ │ │ +
1318 char* p_in,
│ │ │ │ +
1319 MPI_Datatype type,
│ │ │ │ +
1320 int* position,
│ │ │ │ +
1321 int bufferSize,
│ │ │ │ +
1322 bool fromOurSelf)
│ │ │ │ +
1323 {
│ │ │ │ +
1324 if(remoteEntries==0)
│ │ │ │ +
1325 return;
│ │ │ │ +
1326
│ │ │ │ +
1327 PairType index;
│ │ │ │ +
1328 MPI_Unpack(p_in, bufferSize, position, &index, 1,
│ │ │ │ +
1329 type, comm_);
│ │ │ │ +
1330 GlobalIndex oldGlobal=index.global();
│ │ │ │ +
1331 int n_in=0, localIndex=0;
│ │ │ │ +
1332
│ │ │ │ +
1333 //Check if we know the global index
│ │ │ │ +
1334 while(localIndex<localEntries) {
│ │ │ │ +
1335 if(local[localIndex]->global()==index.global()) {
│ │ │ │ +
1336 int oldLocalIndex=localIndex;
│ │ │ │ +
1337
│ │ │ │ +
1338 while(localIndex<localEntries &&
│ │ │ │ +
1339 local[localIndex]->global()==index.global()) {
│ │ │ │ +
1340 if(!fromOurSelf || index.local().attribute() !=
│ │ │ │ +
1341 local[localIndex]->local().attribute())
│ │ │ │ +
1342 // if index is from us it has to have a different attribute
│ │ │ │ +
1343 remote.push_back(RemoteIndex(index.local().attribute(),
│ │ │ │ +
1344 local[localIndex]));
│ │ │ │ +
1345 localIndex++;
│ │ │ │ +
1346 }
│ │ │ │ +
1347
│ │ │ │ +
1348 // unpack next remote index
│ │ │ │ +
1349 if((++n_in) < remoteEntries) {
│ │ │ │ +
1350 MPI_Unpack(p_in, bufferSize, position, &index, 1,
│ │ │ │ +
1351 type, comm_);
│ │ │ │ +
1352 if(index.global()==oldGlobal)
│ │ │ │ +
1353 // Restart comparison for the same global indices
│ │ │ │ +
1354 localIndex=oldLocalIndex;
│ │ │ │ +
1355 else
│ │ │ │ +
1356 oldGlobal=index.global();
│ │ │ │ +
1357 }else{
│ │ │ │ +
1358 // No more received indices
│ │ │ │ +
1359 break;
│ │ │ │ +
1360 }
│ │ │ │ +
1361 continue;
│ │ │ │ +
1362 }
│ │ │ │ +
1363
│ │ │ │ +
1364 if (local[localIndex]->global()<index.global()) {
│ │ │ │ +
1365 // compare with next entry in our list
│ │ │ │ +
1366 ++localIndex;
│ │ │ │ +
1367 }else{
│ │ │ │ +
1368 // We do not know the index, unpack next
│ │ │ │ +
1369 if((++n_in) < remoteEntries) {
│ │ │ │ +
1370 MPI_Unpack(p_in, bufferSize, position, &index, 1,
│ │ │ │ +
1371 type, comm_);
│ │ │ │ +
1372 oldGlobal=index.global();
│ │ │ │ +
1373 }else
│ │ │ │ +
1374 // No more received indices
│ │ │ │ +
1375 break;
│ │ │ │ +
1376 }
│ │ │ │ +
1377 }
│ │ │ │ +
1378
│ │ │ │ +
1379 // Unpack the other received indices without doing anything
│ │ │ │ +
1380 while(++n_in < remoteEntries)
│ │ │ │ +
1381 MPI_Unpack(p_in, bufferSize, position, &index, 1,
│ │ │ │ +
1382 type, comm_);
│ │ │ │ +
1383 }
│ │ │ │ +
1384
│ │ │ │ +
1385
│ │ │ │ +
1386 template<typename T, typename A>
│ │ │ │ +
1387 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& send,
│ │ │ │ +
1388 RemoteIndexList& receive,
│ │ │ │ +
1389 int remoteEntries,
│ │ │ │ +
1390 PairType** localSource,
│ │ │ │ +
1391 int localSourceEntries,
│ │ │ │ +
1392 PairType** localDest,
│ │ │ │ +
1393 int localDestEntries,
│ │ │ │ +
1394 char* p_in,
│ │ │ │ +
1395 MPI_Datatype type,
│ │ │ │ +
1396 int* position,
│ │ │ │ +
1397 int bufferSize)
│ │ │ │ +
1398 {
│ │ │ │ +
1399 int n_in=0, sourceIndex=0, destIndex=0;
│ │ │ │ +
1400
│ │ │ │ +
1401 //Check if we know the global index
│ │ │ │ +
1402 while(n_in<remoteEntries && (sourceIndex<localSourceEntries || destIndex<localDestEntries)) {
│ │ │ │ +
1403 // Unpack next index
│ │ │ │ +
1404 PairType index;
│ │ │ │ +
1405 MPI_Unpack(p_in, bufferSize, position, &index, 1,
│ │ │ │ +
1406 type, comm_);
│ │ │ │ +
1407 n_in++;
│ │ │ │ +
1408
│ │ │ │ +
1409 // Advance until global index in localSource and localDest are >= than the one in the unpacked index
│ │ │ │ +
1410 while(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()<index.global())
│ │ │ │ +
1411 sourceIndex++;
│ │ │ │ +
1412
│ │ │ │ +
1413 while(destIndex<localDestEntries && localDest[destIndex]->global()<index.global())
│ │ │ │ +
1414 destIndex++;
│ │ │ │ +
1415
│ │ │ │ +
1416 // Add a remote index if we found the global index.
│ │ │ │ +
1417 if(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()==index.global())
│ │ │ │ +
1418 send.push_back(RemoteIndex(index.local().attribute(),
│ │ │ │ +
1419 localSource[sourceIndex]));
│ │ │ │ +
1420
│ │ │ │ +
1421 if(destIndex < localDestEntries && localDest[destIndex]->global() == index.global())
│ │ │ │ +
1422 receive.push_back(RemoteIndex(index.local().attribute(),
│ │ │ │ +
1423 localDest[sourceIndex]));
│ │ │ │ +
1424 }
│ │ │ │ +
1425
│ │ │ │ +
1426 }
│ │ │ │ +
1427
│ │ │ │ +
1428 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1430 {
│ │ │ │ +
1431 auto lend = remoteIndices_.end();
│ │ │ │ +
1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {
│ │ │ │ +
1433 if(lists->second.first==lists->second.second) {
│ │ │ │ +
1434 // there is only one remote index list.
│ │ │ │ +
1435 delete lists->second.first;
│ │ │ │ +
1436 }else{
│ │ │ │ +
1437 delete lists->second.first;
│ │ │ │ +
1438 delete lists->second.second;
│ │ │ │ +
1439 }
│ │ │ │ +
1440 }
│ │ │ │ +
1441 remoteIndices_.clear();
│ │ │ │ +
1442 firstBuild=true;
│ │ │ │ +
1443 }
│ │ │ │ +
│ │ │ │ +
1444
│ │ │ │ +
1445 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1447 {
│ │ │ │ +
1448 return remoteIndices_.size();
│ │ │ │ +
1449 }
│ │ │ │ +
│ │ │ │ +
1450
│ │ │ │ +
1451 template<typename T, typename A>
│ │ │ │ +
1452 template<bool ignorePublic>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1454 {
│ │ │ │ +
1455 // Test whether a rebuild is Needed.
│ │ │ │ +
1456 if(firstBuild ||
│ │ │ │ +
1457 ignorePublic!=publicIgnored || !
│ │ │ │ +
1458 isSynced()) {
│ │ │ │ +
1459 free();
│ │ │ │ +
1460
│ │ │ │ +
1461 buildRemote<ignorePublic>(includeSelf);
│ │ │ │ +
1462
│ │ │ │ +
1463 sourceSeqNo_ = source_->seqNo();
│ │ │ │ +
1464 destSeqNo_ = target_->seqNo();
│ │ │ │ +
1465 firstBuild=false;
│ │ │ │ +
1466 publicIgnored=ignorePublic;
│ │ │ │ +
1467 }
│ │ │ │ +
1468
│ │ │ │ +
1469
│ │ │ │ +
1470 }
│ │ │ │ +
│ │ │ │ +
1471
│ │ │ │ +
1472 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1474 {
│ │ │ │ +
1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();
│ │ │ │ +
1476 }
│ │ │ │ +
│ │ │ │ +
1477
│ │ │ │ +
1478 template<typename T, typename A>
│ │ │ │ +
1479 template<bool mode, bool send>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1481 {
│ │ │ │ +
1482
│ │ │ │ +
1483 // The user are on their own now!
│ │ │ │ +
1484 // We assume they know what they are doing and just set the
│ │ │ │ +
1485 // remote indices to synced status.
│ │ │ │ +
1486 sourceSeqNo_ = source_->seqNo();
│ │ │ │ +
1487 destSeqNo_ = target_->seqNo();
│ │ │ │ +
1488
│ │ │ │ +
1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);
│ │ │ │ +
1490
│ │ │ │ +
1491 if(found == remoteIndices_.end())
│ │ │ │ +
1492 {
│ │ │ │ +
1493 if(source_ != target_)
│ │ │ │ +
1494 found = remoteIndices_.insert(found, std::make_pair(process,
│ │ │ │ +
1495 std::make_pair(new RemoteIndexList(),
│ │ │ │ +
1496 new RemoteIndexList())));
│ │ │ │ +
1497 else{
│ │ │ │ +
1498 RemoteIndexList* rlist = new RemoteIndexList();
│ │ │ │ +
1499 found = remoteIndices_.insert(found,
│ │ │ │ +
1500 std::make_pair(process,
│ │ │ │ +
1501 std::make_pair(rlist, rlist)));
│ │ │ │ +
1502 }
│ │ │ │ +
1503 }
│ │ │ │ +
1504
│ │ │ │ +
1505 firstBuild = false;
│ │ │ │ +
1506
│ │ │ │ +
1507 if(send)
│ │ │ │ +
1508 return RemoteIndexListModifier<T,A,mode>(*source_, *(found->second.first));
│ │ │ │ +
1509 else
│ │ │ │ +
1510 return RemoteIndexListModifier<T,A,mode>(*target_, *(found->second.second));
│ │ │ │ +
1511 }
│ │ │ │ +
│ │ │ │ +
1512
│ │ │ │ +
1513 template<typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
1516 {
│ │ │ │ +
1517 return remoteIndices_.find(proc);
│ │ │ │ +
1518 }
│ │ │ │ +
│ │ │ │ +
1519
│ │ │ │ +
1520 template<typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
1523 {
│ │ │ │ +
1524 return remoteIndices_.begin();
│ │ │ │ +
1525 }
│ │ │ │ +
│ │ │ │ +
1526
│ │ │ │ +
1527 template<typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
1530 {
│ │ │ │ +
1531 return remoteIndices_.end();
│ │ │ │ +
1532 }
│ │ │ │ +
│ │ │ │ +
1533
│ │ │ │ +
1534
│ │ │ │ +
1535 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1537 {
│ │ │ │ +
1538 if(neighbours()!=ri.neighbours())
│ │ │ │ +
1539 return false;
│ │ │ │ +
1540
│ │ │ │ +
1541 const auto rend = remoteIndices_.end();
│ │ │ │ +
1542
│ │ │ │ +
1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin(); rindex!=rend; ++rindex, ++rindex1) {
│ │ │ │ +
1544 if(rindex->first != rindex1->first)
│ │ │ │ +
1545 return false;
│ │ │ │ +
1546 if(*(rindex->second.first) != *(rindex1->second.first))
│ │ │ │ +
1547 return false;
│ │ │ │ +
1548 if(*(rindex->second.second) != *(rindex1->second.second))
│ │ │ │ +
1549 return false;
│ │ │ │ +
1550 }
│ │ │ │ +
1551 return true;
│ │ │ │ +
1552 }
│ │ │ │ +
│ │ │ │ +
1553
│ │ │ │ +
1554 template<class T, class A, bool mode>
│ │ │ │ + │ │ │ │ +
1556 RemoteIndexList& rList)
│ │ │ │ +
1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_(rList.end()), first_(true)
│ │ │ │ +
1558 {
│ │ │ │ +
1559 if(MODIFYINDEXSET) {
│ │ │ │ +
1560 assert(indexSet_);
│ │ │ │ +
1561 for(ConstIterator iter=iter_; iter != end_; ++iter)
│ │ │ │ +
1562 glist_.push_back(iter->localIndexPair().global());
│ │ │ │ +
1563 giter_ = glist_.beginModify();
│ │ │ │ +
1564 }
│ │ │ │ +
1565 }
│ │ │ │ +
1566
│ │ │ │ +
1567 template<typename T, typename A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1569 : rList_(other.rList_), indexSet_(other.indexSet_),
│ │ │ │ +
1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_(other.end_),
│ │ │ │ +
1571 first_(other.first_), last_(other.last_)
│ │ │ │ +
1572 {}
│ │ │ │ +
│ │ │ │ +
1573
│ │ │ │ +
1574 template<typename T, typename A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1576 {
│ │ │ │ +
1577 if(MODIFYINDEXSET) {
│ │ │ │ +
1578 // repair pointers to local index set.
│ │ │ │ +
1579#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1580 if(indexSet_->state()!=GROUND)
│ │ │ │ +
1581 DUNE_THROW(InvalidIndexSetState, "Index has to be in ground mode for repairing pointers to indices");
│ │ │ │ +
1582#endif
│ │ │ │ +
1583 auto giter = glist_.begin();
│ │ │ │ +
1584 auto index = indexSet_->begin();
│ │ │ │ +
1585
│ │ │ │ +
1586 for(auto iter=rList_->begin(); iter != end_; ++iter) {
│ │ │ │ +
1587 while(index->global()<*giter) {
│ │ │ │ +
1588 ++index;
│ │ │ │ +
1589#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1590 if(index == indexSet_->end())
│ │ │ │ +
1591 DUNE_THROW(InvalidPosition, "No such global index in set!");
│ │ │ │ +
1592#endif
│ │ │ │ +
1593 }
│ │ │ │ +
1594
│ │ │ │ +
1595#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1596 if(index->global() != *giter)
│ │ │ │ +
1597 DUNE_THROW(InvalidPosition, "No such global index in set!");
│ │ │ │ +
1598#endif
│ │ │ │ +
1599 iter->localIndex_ = &(*index);
│ │ │ │ +
1600 }
│ │ │ │ +
1601 }
│ │ │ │ +
1602 }
│ │ │ │ +
│ │ │ │ +
1603
│ │ │ │ +
1604 template<typename T, typename A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1606 {
│ │ │ │ +
1607 static_assert(!mode,"Not allowed if the mode indicates that new indices"
│ │ │ │ +
1608 "might be added to the underlying index set. Use "
│ │ │ │ +
1609 "insert(const RemoteIndex&, const GlobalIndex&) instead");
│ │ │ │ +
1610
│ │ │ │ +
1611#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1612 if(!first_ && index.localIndexPair().global()<last_)
│ │ │ │ +
1613 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
│ │ │ │ +
1614#endif
│ │ │ │ +
1615 // Move to the correct position
│ │ │ │ +
1616 while(iter_ != end_ && iter_->localIndexPair().global() < index.localIndexPair().global()) {
│ │ │ │ +
1617 ++iter_;
│ │ │ │ +
1618 }
│ │ │ │ +
1619
│ │ │ │ +
1620 // No duplicate entries allowed
│ │ │ │ +
1621 assert(iter_==end_ || iter_->localIndexPair().global() != index.localIndexPair().global());
│ │ │ │ +
1622 iter_.insert(index);
│ │ │ │ +
1623 last_ = index.localIndexPair().global();
│ │ │ │ +
1624 first_ = false;
│ │ │ │ +
1625 }
│ │ │ │ +
│ │ │ │ +
1626
│ │ │ │ +
1627 template<typename T, typename A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1629 {
│ │ │ │ +
1630 static_assert(mode,"Not allowed if the mode indicates that no new indices"
│ │ │ │ +
1631 "might be added to the underlying index set. Use "
│ │ │ │ +
1632 "insert(const RemoteIndex&) instead");
│ │ │ │ +
1633#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1634 if(!first_ && global<last_)
│ │ │ │ +
1635 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
│ │ │ │ +
1636#endif
│ │ │ │ +
1637 // Move to the correct position
│ │ │ │ +
1638 while(iter_ != end_ && *giter_ < global) {
│ │ │ │ +
1639 ++giter_;
│ │ │ │ +
1640 ++iter_;
│ │ │ │ +
1641 }
│ │ │ │ +
1642
│ │ │ │ +
1643 // No duplicate entries allowed
│ │ │ │ +
1644 assert(iter_->localIndexPair().global() != global);
│ │ │ │ +
1645 iter_.insert(index);
│ │ │ │ +
1646 giter_.insert(global);
│ │ │ │ +
1647
│ │ │ │ +
1648 last_ = global;
│ │ │ │ +
1649 first_ = false;
│ │ │ │ +
1650 }
│ │ │ │ +
│ │ │ │ +
1651
│ │ │ │ +
1652 template<typename T, typename A, bool mode>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1654 {
│ │ │ │ +
1655#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1656 if(!first_ && global<last_)
│ │ │ │ +
1657 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
│ │ │ │ +
1658#endif
│ │ │ │ +
1659
│ │ │ │ +
1660 bool found= false;
│ │ │ │ +
1661
│ │ │ │ +
1662 if(MODIFYINDEXSET) {
│ │ │ │ +
1663 // Move to the correct position
│ │ │ │ +
1664 while(iter_!=end_ && *giter_< global) {
│ │ │ │ +
1665 ++giter_;
│ │ │ │ +
1666 ++iter_;
│ │ │ │ +
1667 }
│ │ │ │ +
1668 if(*giter_ == global) {
│ │ │ │ +
1669 giter_.remove();
│ │ │ │ +
1670 iter_.remove();
│ │ │ │ +
1671 found=true;
│ │ │ │ +
1672 }
│ │ │ │ +
1673 }else{
│ │ │ │ +
1674 while(iter_!=end_ && iter_->localIndexPair().global() < global)
│ │ │ │ +
1675 ++iter_;
│ │ │ │ +
1676
│ │ │ │ +
1677 if(iter_->localIndexPair().global()==global) {
│ │ │ │ +
1678 iter_.remove();
│ │ │ │ +
1679 found = true;
│ │ │ │ +
1680 }
│ │ │ │ +
1681 }
│ │ │ │ +
1682
│ │ │ │ +
1683 last_ = global;
│ │ │ │ +
1684 first_ = false;
│ │ │ │ +
1685 return found;
│ │ │ │ +
1686 }
│ │ │ │ +
│ │ │ │ +
1687
│ │ │ │ +
1688 template<typename T, typename A>
│ │ │ │ +
1689 template<bool send>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1691 {
│ │ │ │ +
1692 return CollectiveIterator<T,A>(remoteIndices_, send);
│ │ │ │ +
1693 }
│ │ │ │ +
│ │ │ │ +
1694
│ │ │ │ +
1695 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1696 inline MPI_Comm RemoteIndices<T,A>::communicator() const
│ │ │ │ +
1697 {
│ │ │ │ +
1698 return comm_;
│ │ │ │ +
1699
│ │ │ │ +
1700 }
│ │ │ │ +
│ │ │ │ +
1701
│ │ │ │ +
1702 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1704 {
│ │ │ │ +
1705
│ │ │ │ +
1706 const auto end = pmap.end();
│ │ │ │ +
1707 for(auto process = pmap.begin(); process != end; ++process) {
│ │ │ │ +
1708 const RemoteIndexList* list = send ? process->second.first : process->second.second;
│ │ │ │ +
1709 using ri_iterator = typename RemoteIndexList::const_iterator;
│ │ │ │ +
1710 map_.insert(std::make_pair(process->first,
│ │ │ │ +
1711 std::pair<ri_iterator, const ri_iterator>(list->begin(), list->end())));
│ │ │ │ +
1712 }
│ │ │ │ +
1713 }
│ │ │ │ +
│ │ │ │ +
1714
│ │ │ │ +
1715 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1716 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index)
│ │ │ │ +
1717 {
│ │ │ │ +
1718 const auto end = map_.end();
│ │ │ │ +
1719
│ │ │ │ +
1720 for(auto iter = map_.begin(); iter != end;) {
│ │ │ │ +
1721 // Step the iterator until we are >= index
│ │ │ │ +
1722 typename RemoteIndexList::const_iterator current = iter->second.first;
│ │ │ │ +
1723 typename RemoteIndexList::const_iterator rend = iter->second.second;
│ │ │ │ +
1724 RemoteIndex remoteIndex;
│ │ │ │ +
1725 if(current != rend)
│ │ │ │ +
1726 remoteIndex = *current;
│ │ │ │ +
1727
│ │ │ │ +
1728 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
│ │ │ │ +
1729 ++(iter->second.first);
│ │ │ │ +
1730
│ │ │ │ +
1731 // erase from the map if there are no more entries.
│ │ │ │ +
1732 if(iter->second.first == iter->second.second)
│ │ │ │ +
1733 map_.erase(iter++);
│ │ │ │ +
1734 else{
│ │ │ │ +
1735 ++iter;
│ │ │ │ +
1736 }
│ │ │ │ +
1737 }
│ │ │ │ +
1738 index_=index;
│ │ │ │ +
1739 noattribute=true;
│ │ │ │ +
1740 }
│ │ │ │ +
│ │ │ │ +
1741
│ │ │ │ +
1742 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1743 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index,
│ │ │ │ +
1744 const Attribute& attribute)
│ │ │ │ +
1745 {
│ │ │ │ +
1746 const auto end = map_.end();
│ │ │ │ +
1747
│ │ │ │ +
1748 for(auto iter = map_.begin(); iter != end;) {
│ │ │ │ +
1749 // Step the iterator until we are >= index
│ │ │ │ +
1750 typename RemoteIndexList::const_iterator current = iter->second.first;
│ │ │ │ +
1751 typename RemoteIndexList::const_iterator rend = iter->second.second;
│ │ │ │ +
1752 RemoteIndex remoteIndex;
│ │ │ │ +
1753 if(current != rend)
│ │ │ │ +
1754 remoteIndex = *current;
│ │ │ │ +
1755
│ │ │ │ +
1756 // Move to global index or bigger
│ │ │ │ +
1757 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
│ │ │ │ +
1758 ++(iter->second.first);
│ │ │ │ +
1759
│ │ │ │ +
1760 // move to attribute or bigger
│ │ │ │ +
1761 while(iter->second.first!=iter->second.second
│ │ │ │ +
1762 && iter->second.first->localIndexPair().global()==index
│ │ │ │ +
1763 && iter->second.first->localIndexPair().local().attribute()<attribute)
│ │ │ │ +
1764 ++(iter->second.first);
│ │ │ │ +
1765
│ │ │ │ +
1766 // erase from the map if there are no more entries.
│ │ │ │ +
1767 if(iter->second.first == iter->second.second)
│ │ │ │ +
1768 map_.erase(iter++);
│ │ │ │ +
1769 else{
│ │ │ │ +
1770 ++iter;
│ │ │ │ +
1771 }
│ │ │ │ +
1772 }
│ │ │ │ +
1773 index_=index;
│ │ │ │ +
1774 attribute_=attribute;
│ │ │ │ +
1775 noattribute=false;
│ │ │ │ +
1776 }
│ │ │ │ +
│ │ │ │ +
1777
│ │ │ │ +
1778 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1780 {
│ │ │ │ +
1781 const auto end = map_.end();
│ │ │ │ +
1782
│ │ │ │ +
1783 for(auto iter = map_.begin(); iter != end;) {
│ │ │ │ +
1784 // Step the iterator until we are >= index
│ │ │ │ +
1785 auto current = iter->second.first;
│ │ │ │ +
1786 auto rend = iter->second.second;
│ │ │ │ +
1787
│ │ │ │ +
1788 // move all iterators pointing to the current global index to next value
│ │ │ │ +
1789 if(iter->second.first->localIndexPair().global()==index_ &&
│ │ │ │ +
1790 (noattribute || iter->second.first->localIndexPair().local().attribute() == attribute_))
│ │ │ │ +
1791 ++(iter->second.first);
│ │ │ │ +
1792
│ │ │ │ +
1793 // erase from the map if there are no more entries.
│ │ │ │ +
1794 if(iter->second.first == iter->second.second)
│ │ │ │ +
1795 map_.erase(iter++);
│ │ │ │ +
1796 else{
│ │ │ │ +
1797 ++iter;
│ │ │ │ +
1798 }
│ │ │ │ +
1799 }
│ │ │ │ +
1800 return *this;
│ │ │ │ +
1801 }
│ │ │ │ +
│ │ │ │ +
1802
│ │ │ │ +
1803 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1805 {
│ │ │ │ +
1806 return map_.empty();
│ │ │ │ +
1807 }
│ │ │ │ +
│ │ │ │ +
1808
│ │ │ │ +
1809 template<typename T, typename A>
│ │ │ │ +
1810 inline typename CollectiveIterator<T,A>::iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1812 {
│ │ │ │ +
1813 if(noattribute)
│ │ │ │ +
1814 return iterator(map_.begin(), map_.end(), index_);
│ │ │ │ +
1815 else
│ │ │ │ +
1816 return iterator(map_.begin(), map_.end(), index_,
│ │ │ │ +
1817 attribute_);
│ │ │ │ +
1818 }
│ │ │ │ +
│ │ │ │ +
1819
│ │ │ │ +
1820 template<typename T, typename A>
│ │ │ │ +
1821 inline typename CollectiveIterator<T,A>::iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1823 {
│ │ │ │ +
1824 return iterator(map_.end(), map_.end(), index_);
│ │ │ │ +
1825 }
│ │ │ │ +
│ │ │ │ +
1826
│ │ │ │ +
1827 template<typename TG, typename TA>
│ │ │ │ +
│ │ │ │ +
1828 inline std::ostream& operator<<(std::ostream& os, const RemoteIndex<TG,TA>& index)
│ │ │ │ +
1829 {
│ │ │ │ +
1830 os<<"[global="<<index.localIndexPair().global()<<", remote attribute="<<index.attribute()<<" local attribute="<<index.localIndexPair().local().attribute()<<"]";
│ │ │ │ +
1831 return os;
│ │ │ │ +
1832 }
│ │ │ │ +
│ │ │ │ +
1833
│ │ │ │ +
1834 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1835 inline std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices)
│ │ │ │ +
1836 {
│ │ │ │ +
1837 int rank;
│ │ │ │ +
1838 MPI_Comm_rank(indices.comm_, &rank);
│ │ │ │ +
1839 const auto rend = indices.remoteIndices_.end();
│ │ │ │ +
1840
│ │ │ │ +
1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) {
│ │ │ │ +
1842 os<<rank<<": Process "<<rindex->first<<":";
│ │ │ │ +
1843
│ │ │ │ +
1844 if(!rindex->second.first->empty()) {
│ │ │ │ +
1845 os<<" send:";
│ │ │ │ +
1846
│ │ │ │ +
1847 const auto send= rindex->second.first->end();
│ │ │ │ +
1848
│ │ │ │ +
1849 for(auto index = rindex->second.first->begin();
│ │ │ │ +
1850 index != send; ++index)
│ │ │ │ +
1851 os<<*index<<" ";
│ │ │ │ +
1852 os<<std::endl;
│ │ │ │ +
1853 }
│ │ │ │ +
1854 if(!rindex->second.second->empty()) {
│ │ │ │ +
1855 os<<rank<<": Process "<<rindex->first<<": "<<"receive: ";
│ │ │ │ +
1856
│ │ │ │ +
1857 for(const auto& index : *(rindex->second.second))
│ │ │ │ +
1858 os << index << " ";
│ │ │ │ +
1859 }
│ │ │ │ +
1860 os<<std::endl<<std::flush;
│ │ │ │ +
1861 }
│ │ │ │ +
1862 return os;
│ │ │ │ +
1863 }
│ │ │ │ +
│ │ │ │ +
1865}
│ │ │ │ +
1866
│ │ │ │ +
1867#endif // HAVE_MPI
│ │ │ │ +
1868
│ │ │ │ +
1869#endif
│ │ │ │ +
Provides a map between global and local indices.
│ │ │ │ +
Provides classes for use as the local index in ParallelIndexSet for distributed computing.
│ │ │ │ +
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ +
Standard Dune debug streams.
│ │ │ │ +
Implements a singly linked list together with the necessary iterators.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
iterator end()
Get an iterator pointing to the end of the list.
Definition sllist.hh:774
│ │ │ │ +
SLListConstIterator< RemoteIndex, Allocator > const_iterator
The constant iterator of the list.
Definition sllist.hh:74
│ │ │ │ +
SLListModifyIterator< GlobalIndex, Allocator > 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
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ +
iterator begin()
Get an iterator over the indices positioned at the first index.
│ │ │ │ +
iterator end()
Get an iterator over the indices positioned after the last index.
│ │ │ │ +
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition indexset.hh:239
│ │ │ │ +
const GlobalIndex & global() const
Get the global index.
│ │ │ │ +
LocalIndex & local()
Get the local index.
│ │ │ │ +
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition indexset.hh:226
│ │ │ │ +
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition indexset.hh:186
│ │ │ │ +
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition stdstreams.hh:95
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │ +
A traits class describing the mapping of types onto MPI_Datatypes.
Definition mpitraits.hh:41
│ │ │ │ +
static MPI_Datatype getType()
Definition mpitraits.hh:48
│ │ │ │ +
Default exception class for range errors.
Definition exceptions.hh:254
│ │ │ │ +
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
│ │ │ │ +
Manager class for the mapping between local indices and globally unique indices.
Definition indexset.hh:218
│ │ │ │ +
Class for recomputing missing indices of a distributed index set.
Definition indicessyncer.hh:41
│ │ │ │ +
Base class of all classes representing a communication interface.
Definition parallel/interface.hh:35
│ │ │ │ +
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
│ │ │ │ +
const std::set< int > & getNeighbours() const
Definition remoteindices.hh:307
│ │ │ │ +
Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
Type of the remote indices we manage.
Definition remoteindices.hh:231
│ │ │ │ +
RemoteIndices()
Definition remoteindices.hh:977
│ │ │ │ +
friend void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
│ │ │ │ +
void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet &destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::vector< int >())
Set the index sets and communicator we work with.
Definition remoteindices.hh:984
│ │ │ │ +
void free()
Free the index lists.
Definition remoteindices.hh:1429
│ │ │ │ +
friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices< T1, A1 > &, const T1 &)
│ │ │ │ +
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition remoteindices.hh:215
│ │ │ │ +
void rebuild()
Rebuilds the set of remote indices.
Definition remoteindices.hh:1453
│ │ │ │ +
T ParallelIndexSet
Type of the index set we use, e.g. ParallelLocalIndexSet.
Definition remoteindices.hh:206
│ │ │ │ +
MPI_Comm communicator() const
Get the mpi communicator used.
Definition remoteindices.hh:1696
│ │ │ │ +
LocalIndex::Attribute Attribute
The type of the attribute.
Definition remoteindices.hh:226
│ │ │ │ +
CollectiveIteratorT iterator() const
Get an iterator for colletively iterating over the remote indices of all remote processes.
Definition remoteindices.hh:1690
│ │ │ │ +
void setIncludeSelf(bool includeSelf)
Tell whether sending from indices of the processor to other indices on the same processor is enabled ...
Definition remoteindices.hh:971
│ │ │ │ +
const_iterator end() const
Get an iterator over all remote index lists.
Definition remoteindices.hh:1529
│ │ │ │ +
bool operator==(const RemoteIndices &ri) const
Definition remoteindices.hh:1536
│ │ │ │ +
std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
The type of the map from rank to remote index list.
Definition remoteindices.hh:245
│ │ │ │ +
void setNeighbours(const C &neighbours)
Definition remoteindices.hh:300
│ │ │ │ +
RemoteIndexListModifier< T, A, mode > getModifier(int process)
Get a modifier for a remote index list.
Definition remoteindices.hh:1480
│ │ │ │ +
const ParallelIndexSet & sourceIndexSet() const
Get the index set at the source.
Definition remoteindices.hh:999
│ │ │ │ +
~RemoteIndices()
Destructor.
Definition remoteindices.hh:1014
│ │ │ │ +
Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
The type of the remote index list.
Definition remoteindices.hh:241
│ │ │ │ +
int neighbours() const
Get the number of processors we share indices with.
Definition remoteindices.hh:1446
│ │ │ │ +
CollectiveIterator< T, A > CollectiveIteratorT
The type of the collective iterator over all remote indices.
Definition remoteindices.hh:210
│ │ │ │ +
const ParallelIndexSet & destinationIndexSet() const
Get the index set at destination.
Definition remoteindices.hh:1007
│ │ │ │ +
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 find(int proc) const
Find an iterator over the remote index lists of a specific process.
Definition remoteindices.hh:1515
│ │ │ │ +
bool isSynced() const
Checks whether the remote indices are synced with the indexsets.
Definition remoteindices.hh:1473
│ │ │ │ +
const_iterator begin() const
Get an iterator over all remote index lists.
Definition remoteindices.hh:1522
│ │ │ │ +
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition remoteindices.hh:221
│ │ │ │ +
RemoteIndexMap::const_iterator const_iterator
Definition remoteindices.hh:247
│ │ │ │ +
Information about an index residing on another processor.
Definition remoteindices.hh:73
│ │ │ │ +
const Attribute attribute() const
Get the attribute of the index on the remote process.
Definition remoteindices.hh:946
│ │ │ │ +
friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, A1 > &, const T &)
│ │ │ │ +
bool operator==(const RemoteIndex &ri) const
Definition remoteindices.hh:934
│ │ │ │ +
T1 GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition remoteindices.hh:90
│ │ │ │ +
T2 Attribute
The type of the attributes. Normally this will be an enumeration like.
Definition remoteindices.hh:99
│ │ │ │ +
IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType
The type of the index pair.
Definition remoteindices.hh:105
│ │ │ │ +
const PairType & localIndexPair() const
Get the corresponding local index pair.
Definition remoteindices.hh:952
│ │ │ │ +
RemoteIndex()
Parameterless Constructor.
Definition remoteindices.hh:930
│ │ │ │ +
bool operator!=(const RemoteIndex &ri) const
Definition remoteindices.hh:940
│ │ │ │ +
Modifier for adding and/or deleting remote indices from the remote index list.
Definition remoteindices.hh:551
│ │ │ │ +
void repairLocalIndexPointers()
Repair the pointers to the local index pairs.
Definition remoteindices.hh:1575
│ │ │ │ +
Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
The type of the remote index list.
Definition remoteindices.hh:602
│ │ │ │ +
A Allocator
The type of the allocator for the remote index list.
Definition remoteindices.hh:598
│ │ │ │ +
void insert(const RemoteIndex &index)
Insert an index to the list.
Definition remoteindices.hh:1605
│ │ │ │ +
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition remoteindices.hh:578
│ │ │ │ +
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition remoteindices.hh:583
│ │ │ │ +
RemoteIndexList::const_iterator ConstIterator
The type of the remote index list iterator.
Definition remoteindices.hh:612
│ │ │ │ +
SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator
The type of the modifying iterator of the remote index list.
Definition remoteindices.hh:607
│ │ │ │ +
bool remove(const GlobalIndex &global)
Remove a remote index.
Definition remoteindices.hh:1653
│ │ │ │ +
T ParallelIndexSet
Type of the index set we use.
Definition remoteindices.hh:573
│ │ │ │ +
RemoteIndexListModifier()
Default constructor.
Definition remoteindices.hh:676
│ │ │ │ +
LocalIndex::Attribute Attribute
The type of the attribute.
Definition remoteindices.hh:588
│ │ │ │ +
Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
Type of the remote indices we manage.
Definition remoteindices.hh:593
│ │ │ │ +
static constexpr bool MODIFYINDEXSET
If true the index set corresponding to the remote indices might get modified.
Definition remoteindices.hh:568
│ │ │ │ +
A collective iterator for moving over the remote indices for all processes collectively.
Definition remoteindices.hh:708
│ │ │ │ +
CollectiveIterator & operator++()
Definition remoteindices.hh:1779
│ │ │ │ +
iterator end()
Definition remoteindices.hh:1822
│ │ │ │ +
CollectiveIterator(const RemoteIndexMap &map_, bool send)
Constructor.
Definition remoteindices.hh:1703
│ │ │ │ +
bool empty() const
Checks whether there are still iterators in the map.
Definition remoteindices.hh:1804
│ │ │ │ +
void advance(const GlobalIndex &global)
Advances all underlying iterators.
Definition remoteindices.hh:1716
│ │ │ │ +
std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
The type of the map from rank to remote index list.
Definition remoteindices.hh:748
│ │ │ │ +
iterator begin()
Definition remoteindices.hh:1811
│ │ │ │ +
Definition remoteindices.hh:167
│ │ │ │ +
Definition remoteindices.hh:558
│ │ │ │ +
Iterator over the valid underlying iterators.
Definition remoteindices.hh:792
│ │ │ │ +
iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex &index)
Definition remoteindices.hh:799
│ │ │ │ +
iterator(const iterator &other)
Definition remoteindices.hh:817
│ │ │ │ +
const RemoteIndex & operator*() const
Definition remoteindices.hh:838
│ │ │ │ +
Map::iterator ConstRealIterator
Definition remoteindices.hh:795
│ │ │ │ +
iterator & operator++()
Definition remoteindices.hh:822
│ │ │ │ +
const RemoteIndex * operator->() const
Definition remoteindices.hh:850
│ │ │ │ +
bool operator==(const iterator &other) const
Definition remoteindices.hh:856
│ │ │ │ +
int process() const
Definition remoteindices.hh:844
│ │ │ │ +
iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex index, Attribute attribute)
Definition remoteindices.hh:807
│ │ │ │ +
bool operator!=(const iterator &other) const
Definition remoteindices.hh:862
│ │ │ │ +
Map::iterator RealIterator
Definition remoteindices.hh:794
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,549 +1,1925 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -simd.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +remoteindices.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright (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_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 <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_d_i_t_i_o_n_a_l_._h_h> │ │ │ │ │ -36#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_b_u_g_a_l_i_g_n_._h_h> │ │ │ │ │ -37#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -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 <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_v_c_._h_h> │ │ │ │ │ -42#endif │ │ │ │ │ -43#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -44#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_c_._h_h> │ │ │ │ │ -45 │ │ │ │ │ -46namespace _D_u_n_e │ │ │ │ │ -47{ │ │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +5#ifndef DUNE_REMOTEINDICES_HH │ │ │ │ │ +6#define DUNE_REMOTEINDICES_HH │ │ │ │ │ +7 │ │ │ │ │ +8#if HAVE_MPI │ │ │ │ │ +9 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_i_n_d_e_x_s_e_t_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_m_p_i_t_r_a_i_t_s_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_l_l_e_l_/_p_l_o_c_a_l_i_n_d_e_x_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_l_l_i_s_t_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +27 │ │ │ │ │ +28namespace _D_u_n_e { │ │ │ │ │ +40 template │ │ │ │ │ +_4_1 class _M_P_I_T_r_a_i_t_s<_I_n_d_e_x_P_a_i_r > > │ │ │ │ │ +42 { │ │ │ │ │ +43 public: │ │ │ │ │ +44 inline static MPI_Datatype _g_e_t_T_y_p_e(); │ │ │ │ │ +45 private: │ │ │ │ │ +46 static MPI_Datatype type; │ │ │ │ │ +47 }; │ │ │ │ │ 48 │ │ │ │ │ -49#if HAVE_VC │ │ │ │ │ -50 namespace VcImpl { │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +51 class _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ 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_]; } │ │ │ │ │ +53 template │ │ │ │ │ +54 class _R_e_m_o_t_e_I_n_d_e_x; │ │ │ │ │ +55 │ │ │ │ │ +56 // forward declaration needed for friend declaration. │ │ │ │ │ +57 template │ │ │ │ │ +58 class _I_n_d_i_c_e_s_S_y_n_c_e_r; │ │ │ │ │ +59 │ │ │ │ │ +60 template │ │ │ │ │ +_6_1 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>& index); │ │ │ │ │ +62 │ │ │ │ │ +63 │ │ │ │ │ +64 template │ │ │ │ │ +65 class _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r; │ │ │ │ │ +66 │ │ │ │ │ +67 │ │ │ │ │ +71 template │ │ │ │ │ +_7_2 class _R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +73 { │ │ │ │ │ +74 template │ │ │ │ │ +_7_5 friend class _I_n_d_i_c_e_s_S_y_n_c_e_r; │ │ │ │ │ +76 │ │ │ │ │ +77 template │ │ │ │ │ +_7_8 friend void _r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s(std::map,A> >&, │ │ │ │ │ +79 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_1_>&, │ │ │ │ │ +80 const T&); │ │ │ │ │ 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(>>); │ │ │ │ │ +82 template │ │ │ │ │ +_8_3 friend class _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r; │ │ │ │ │ +84 │ │ │ │ │ +85 public: │ │ │ │ │ +_9_0 typedef T1 _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +_9_9 typedef T2 _A_t_t_r_i_b_u_t_e; │ │ │ │ │ +100 │ │ │ │ │ +104 typedef _I_n_d_e_x_P_a_i_r_<_G_l_o_b_a_l_I_n_d_e_x_,_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_A_t_t_r_i_b_u_t_e_> > │ │ │ │ │ +_1_0_5 _P_a_i_r_T_y_p_e; │ │ │ │ │ +106 │ │ │ │ │ +111 const _A_t_t_r_i_b_u_t_e _a_t_t_r_i_b_u_t_e() const; │ │ │ │ │ +112 │ │ │ │ │ +118 const _P_a_i_r_T_y_p_e& _l_o_c_a_l_I_n_d_e_x_P_a_i_r() const; │ │ │ │ │ +119 │ │ │ │ │ +123 _R_e_m_o_t_e_I_n_d_e_x(); │ │ │ │ │ 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") │ │ │ │ │ +125 │ │ │ │ │ +131 _R_e_m_o_t_e_I_n_d_e_x(const T2& _a_t_t_r_i_b_u_t_e, │ │ │ │ │ +132 const _P_a_i_r_T_y_p_e* local); │ │ │ │ │ +133 │ │ │ │ │ +134 │ │ │ │ │ +140 _R_e_m_o_t_e_I_n_d_e_x(const T2& _a_t_t_r_i_b_u_t_e); │ │ │ │ │ +141 │ │ │ │ │ +142 bool _o_p_e_r_a_t_o_r_=_=(const _R_e_m_o_t_e_I_n_d_e_x& ri) const; │ │ │ │ │ +143 │ │ │ │ │ +144 bool _o_p_e_r_a_t_o_r_!_=(const _R_e_m_o_t_e_I_n_d_e_x& ri) const; │ │ │ │ │ +145 private: │ │ │ │ │ +147 const _P_a_i_r_T_y_p_e* localIndex_; │ │ │ │ │ +148 │ │ │ │ │ +150 char attribute_; │ │ │ │ │ +151 }; │ │ │ │ │ 152 │ │ │ │ │ -153 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(=); │ │ │ │ │ -154 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(*=); │ │ │ │ │ -155 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(/=); │ │ │ │ │ -156 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(%=); │ │ │ │ │ -157 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(+=); │ │ │ │ │ -158 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(-=); │ │ │ │ │ -159 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(<<=); │ │ │ │ │ -160 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(>>=); │ │ │ │ │ -161 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(&=); │ │ │ │ │ -162 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(^=); │ │ │ │ │ -163 _D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T(|=); │ │ │ │ │ -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 _s_w_a_p(Proxy, Proxy); │ │ │ │ │ -170 │ │ │ │ │ -171 template │ │ │ │ │ -172 friend void _s_w_a_p(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 _s_w_a_p(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 │ │ │ │ │ -191 void _s_w_a_p(Proxy p1, Proxy 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 │ │ │ │ │ -_2_0_1 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ -202 { │ │ │ │ │ -_2_0_3 using _t_y_p_e = T; │ │ │ │ │ -204 }; │ │ │ │ │ -205 │ │ │ │ │ -206 template │ │ │ │ │ -_2_0_7 using _S_i_m_d_S_c_a_l_a_r = typename _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_T_>_:_:_t_y_p_e; │ │ │ │ │ -208 │ │ │ │ │ -209#if HAVE_VC │ │ │ │ │ -210 /* │ │ │ │ │ -211 Add Vc specializations for the SimdScalarTypeTraits trais class │ │ │ │ │ -212 */ │ │ │ │ │ -213 template │ │ │ │ │ -214 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< Vc::Vector > │ │ │ │ │ -215 { │ │ │ │ │ -216 using _t_y_p_e = T; │ │ │ │ │ -217 }; │ │ │ │ │ -218 │ │ │ │ │ -219 template │ │ │ │ │ -220 struct SimdScalarTypeTraits< Vc::SimdArray > │ │ │ │ │ -221 { │ │ │ │ │ -222 using _t_y_p_e = T; │ │ │ │ │ -223 }; │ │ │ │ │ -224#endif // HAVE_VC │ │ │ │ │ -225 │ │ │ │ │ -227 template │ │ │ │ │ -_2_2_8 struct _S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s< _A_l_i_g_n_e_d_N_u_m_b_e_r > │ │ │ │ │ -229 { │ │ │ │ │ -_2_3_0 using _t_y_p_e = T; │ │ │ │ │ -231 }; │ │ │ │ │ +153 template │ │ │ │ │ +154 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>& │ │ │ │ │ +indices); │ │ │ │ │ +155 │ │ │ │ │ +156 class _I_n_t_e_r_f_a_c_e_B_u_i_l_d_e_r; │ │ │ │ │ +157 │ │ │ │ │ +158 template │ │ │ │ │ +159 class _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +160 │ │ │ │ │ +161 // forward declaration needed for friend declaration. │ │ │ │ │ +162 template │ │ │ │ │ +163 class _I_n_d_i_c_e_s_S_y_n_c_e_r; │ │ │ │ │ +164 │ │ │ │ │ +165 // forward declaration needed for friend declaration. │ │ │ │ │ +166 template │ │ │ │ │ +_1_6_7 class _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n; │ │ │ │ │ +168 │ │ │ │ │ +169 │ │ │ │ │ +186 template > > │ │ │ │ │ +_1_8_8 class _R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +189 { │ │ │ │ │ +_1_9_0 friend class _I_n_t_e_r_f_a_c_e_B_u_i_l_d_e_r; │ │ │ │ │ +191 friend class _I_n_d_i_c_e_s_S_y_n_c_e_r; │ │ │ │ │ +192 template │ │ │ │ │ +_1_9_3 friend void _r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s(std::map,A2> >&, │ │ │ │ │ +194 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_1_,_A_1_>&, │ │ │ │ │ +195 const T1&); │ │ │ │ │ +196 │ │ │ │ │ +197 template │ │ │ │ │ +_1_9_8 friend void _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(const G& graph, _D_u_n_e_:_: │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm); │ │ │ │ │ +_1_9_9 friend std::ostream& operator<<<>(std::ostream&, const _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_>&); │ │ │ │ │ +200 │ │ │ │ │ +201 public: │ │ │ │ │ +202 │ │ │ │ │ +_2_0_6 typedef T _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +207 │ │ │ │ │ +_2_1_0 typedef _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_> _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_T; │ │ │ │ │ +211 │ │ │ │ │ +_2_1_5 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +216 │ │ │ │ │ +217 │ │ │ │ │ +_2_2_1 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +222 │ │ │ │ │ +_2_2_6 typedef typename LocalIndex::Attribute _A_t_t_r_i_b_u_t_e; │ │ │ │ │ +227 │ │ │ │ │ +_2_3_1 typedef _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_<_G_l_o_b_a_l_I_n_d_e_x_,_A_t_t_r_i_b_u_t_e_> _R_e_m_o_t_e_I_n_d_e_x; │ │ │ │ │ 232 │ │ │ │ │ -233 template │ │ │ │ │ -_2_3_4 struct _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s { │ │ │ │ │ -_2_3_5 using _t_y_p_e = std::size_t; │ │ │ │ │ -236 }; │ │ │ │ │ -237 │ │ │ │ │ -239 │ │ │ │ │ -245 template │ │ │ │ │ -_2_4_6 using _S_i_m_d_I_n_d_e_x = typename _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_<_V_>_:_:_t_y_p_e; │ │ │ │ │ -247 │ │ │ │ │ -248#if HAVE_VC │ │ │ │ │ -249 template │ │ │ │ │ -250 struct _S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s > { │ │ │ │ │ -251 using _t_y_p_e = typename Vc::Vector::index_type; │ │ │ │ │ -252 }; │ │ │ │ │ -253 │ │ │ │ │ -254 template │ │ │ │ │ -255 struct SimdIndexTypeTraits > { │ │ │ │ │ -256 using _t_y_p_e = typename Vc::SimdArray::index_type; │ │ │ │ │ -257 }; │ │ │ │ │ -258#endif // HAVE_VC │ │ │ │ │ -259 │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 struct _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s { │ │ │ │ │ -_2_6_2 using _t_y_p_e = bool; │ │ │ │ │ -263 }; │ │ │ │ │ -264 │ │ │ │ │ -266 │ │ │ │ │ -269 template │ │ │ │ │ -_2_7_0 using _S_i_m_d_M_a_s_k = typename _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_<_V_>_:_:_t_y_p_e; │ │ │ │ │ -271 │ │ │ │ │ -272#if HAVE_VC │ │ │ │ │ -273 template │ │ │ │ │ -274 struct _S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s > { │ │ │ │ │ -275 using _t_y_p_e = typename Vc::Vector::mask_type; │ │ │ │ │ -276 }; │ │ │ │ │ -277 │ │ │ │ │ -278 template │ │ │ │ │ -279 struct SimdMaskTypeTraits > { │ │ │ │ │ -280 using _t_y_p_e = 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 _c_o_n_d(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 _c_o_n_d(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 │ │ │ │ │ +233 │ │ │ │ │ +_2_3_7 using _A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc; │ │ │ │ │ +238 │ │ │ │ │ +240 typedef _D_u_n_e_:_:_S_L_L_i_s_t_<_R_e_m_o_t_e_I_n_d_e_x_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ +_2_4_1 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t; │ │ │ │ │ +242 │ │ │ │ │ +244 typedef std::map > │ │ │ │ │ +_2_4_5 _R_e_m_o_t_e_I_n_d_e_x_M_a_p; │ │ │ │ │ +246 │ │ │ │ │ +_2_4_7 typedef typename RemoteIndexMap::const_iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +248 │ │ │ │ │ +266 inline _R_e_m_o_t_e_I_n_d_i_c_e_s(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& source, const │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& destination, │ │ │ │ │ +267 const MPI_Comm& comm, const std::vector& _n_e_i_g_h_b_o_u_r_s=std::vector │ │ │ │ │ +(), bool includeSelf=false); │ │ │ │ │ +268 │ │ │ │ │ +269 _R_e_m_o_t_e_I_n_d_i_c_e_s(); │ │ │ │ │ +270 │ │ │ │ │ +278 void _s_e_t_I_n_c_l_u_d_e_S_e_l_f(bool includeSelf); │ │ │ │ │ +279 │ │ │ │ │ +296 void _s_e_t_I_n_d_e_x_S_e_t_s(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& source, const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +destination, │ │ │ │ │ +297 const MPI_Comm& comm, const std::vector& _n_e_i_g_h_b_o_u_r_s=std::vector │ │ │ │ │ +()); │ │ │ │ │ +298 │ │ │ │ │ +299 template │ │ │ │ │ +_3_0_0 void _s_e_t_N_e_i_g_h_b_o_u_r_s(const C& _n_e_i_g_h_b_o_u_r_s) │ │ │ │ │ +301 { │ │ │ │ │ +302 neighbourIds.clear(); │ │ │ │ │ +303 neighbourIds.insert(_n_e_i_g_h_b_o_u_r_s.begin(), _n_e_i_g_h_b_o_u_r_s.end()); │ │ │ │ │ 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 _m_a_x___v_a_l_u_e(const Vc::Vector & v) │ │ │ │ │ -313 { │ │ │ │ │ -314 return v.max(); │ │ │ │ │ -315 } │ │ │ │ │ +305 } │ │ │ │ │ +306 │ │ │ │ │ +_3_0_7 const std::set& _g_e_t_N_e_i_g_h_b_o_u_r_s() const │ │ │ │ │ +308 { │ │ │ │ │ +309 return neighbourIds; │ │ │ │ │ +310 } │ │ │ │ │ +311 │ │ │ │ │ +315 _~_R_e_m_o_t_e_I_n_d_i_c_e_s(); │ │ │ │ │ 316 │ │ │ │ │ -317 template │ │ │ │ │ -318 double _m_a_x___v_a_l_u_e(const Vc::SimdArray & v) │ │ │ │ │ -319 { │ │ │ │ │ -320 return v.max(); │ │ │ │ │ -321 } │ │ │ │ │ -322 │ │ │ │ │ -323 template │ │ │ │ │ -324 T _m_i_n___v_a_l_u_e(const Vc::Vector & v) │ │ │ │ │ -325 { │ │ │ │ │ -326 return v.min(); │ │ │ │ │ -327 } │ │ │ │ │ +326 template │ │ │ │ │ +327 void _r_e_b_u_i_l_d(); │ │ │ │ │ 328 │ │ │ │ │ -329 template │ │ │ │ │ -330 double _m_i_n___v_a_l_u_e(const Vc::SimdArray & v) │ │ │ │ │ -331 { │ │ │ │ │ -332 return v.min(); │ │ │ │ │ -333 } │ │ │ │ │ -334 │ │ │ │ │ -335 template │ │ │ │ │ -336 bool _a_n_y___t_r_u_e(const Vc::Mask & v) │ │ │ │ │ -337 { │ │ │ │ │ -338 return Vc::any_of(v); │ │ │ │ │ -339 } │ │ │ │ │ -340 │ │ │ │ │ -341 template │ │ │ │ │ -342 bool _a_n_y___t_r_u_e(const Vc::SimdMaskArray & v) │ │ │ │ │ -343 { │ │ │ │ │ -344 return Vc::any_of(v); │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -347 template │ │ │ │ │ -348 bool _a_l_l___t_r_u_e(const Vc::Mask & v) │ │ │ │ │ -349 { │ │ │ │ │ -350 return Vc::all_of(v); │ │ │ │ │ -351 } │ │ │ │ │ -352 │ │ │ │ │ -353 template │ │ │ │ │ -354 bool _a_l_l___t_r_u_e(const Vc::SimdMaskArray & v) │ │ │ │ │ -355 { │ │ │ │ │ -356 return Vc::all_of(v); │ │ │ │ │ -357 } │ │ │ │ │ -358#endif // HAVE_VC │ │ │ │ │ -359 │ │ │ │ │ -361 template │ │ │ │ │ -_3_6_2 std::size_t _l_a_n_e_s(const T &) { return 1; } │ │ │ │ │ -363 │ │ │ │ │ -365 template │ │ │ │ │ -_3_6_6 T _l_a_n_e(std::size_t l, const T &v) │ │ │ │ │ -367 { │ │ │ │ │ -368 assert(l == 0); │ │ │ │ │ -369 return v; │ │ │ │ │ -370 } │ │ │ │ │ -371 │ │ │ │ │ -373 template │ │ │ │ │ -_3_7_4 T &_l_a_n_e(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 _l_a_n_e_s(const Vc::Vector &) │ │ │ │ │ -383 { │ │ │ │ │ -384 return Vc::Vector::size(); │ │ │ │ │ -385 } │ │ │ │ │ -386 │ │ │ │ │ -387 template │ │ │ │ │ -388 T _l_a_n_e(std::size_t l, const Vc::Vector &v) │ │ │ │ │ -389 { │ │ │ │ │ -390 assert(l < _l_a_n_e_s(v)); │ │ │ │ │ -391 return v[l]; │ │ │ │ │ -392 } │ │ │ │ │ -393 │ │ │ │ │ -394 template │ │ │ │ │ -395 auto _l_a_n_e(std::size_t l, Vc::Vector &v) │ │ │ │ │ -396 { │ │ │ │ │ -397 assert(l < _l_a_n_e_s(v)); │ │ │ │ │ -398 return VcImpl::Proxy >{l, v}; │ │ │ │ │ -399 } │ │ │ │ │ -400 │ │ │ │ │ -401 template │ │ │ │ │ -402 std::size_t _l_a_n_e_s(const Vc::SimdArray &) │ │ │ │ │ -403 { │ │ │ │ │ -404 return n; │ │ │ │ │ -405 } │ │ │ │ │ -406 │ │ │ │ │ -407 template │ │ │ │ │ -408 T _l_a_n_e(std::size_t l, const Vc::SimdArray &v) │ │ │ │ │ -409 { │ │ │ │ │ -410 assert(l < n); │ │ │ │ │ -411 return v[l]; │ │ │ │ │ -412 } │ │ │ │ │ -413 │ │ │ │ │ -414 template │ │ │ │ │ -415 auto _l_a_n_e(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 _l_a_n_e_s(const Vc::SimdMaskArray &) │ │ │ │ │ -423 { │ │ │ │ │ -424 return n; │ │ │ │ │ -425 } │ │ │ │ │ -426 │ │ │ │ │ -427 template │ │ │ │ │ -428 bool _l_a_n_e(std::size_t l, const Vc::SimdMaskArray &v) │ │ │ │ │ -429 { │ │ │ │ │ -430 assert(l < n); │ │ │ │ │ -431 return v[l]; │ │ │ │ │ -432 } │ │ │ │ │ -433 │ │ │ │ │ -434 template │ │ │ │ │ -435 auto _l_a_n_e(std::size_t l, Vc::SimdMaskArray &v) │ │ │ │ │ -436 { │ │ │ │ │ -437 assert(l < n); │ │ │ │ │ -438 return VcImpl::Proxy >{l, v}; │ │ │ │ │ -439 } │ │ │ │ │ -440#endif // HAVE_VC │ │ │ │ │ +329 bool _o_p_e_r_a_t_o_r_=_=(const _R_e_m_o_t_e_I_n_d_i_c_e_s& ri) const; │ │ │ │ │ +330 │ │ │ │ │ +338 inline bool _i_s_S_y_n_c_e_d() const; │ │ │ │ │ +339 │ │ │ │ │ +343 inline MPI_Comm _c_o_m_m_u_n_i_c_a_t_o_r() const; │ │ │ │ │ +344 │ │ │ │ │ +359 template │ │ │ │ │ +360 inline _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_> _g_e_t_M_o_d_i_f_i_e_r(int process); │ │ │ │ │ +361 │ │ │ │ │ +368 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _f_i_n_d(int proc) const; │ │ │ │ │ +369 │ │ │ │ │ +374 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +375 │ │ │ │ │ +380 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +381 │ │ │ │ │ +385 template │ │ │ │ │ +386 inline _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_T _i_t_e_r_a_t_o_r() const; │ │ │ │ │ +387 │ │ │ │ │ +391 inline void _f_r_e_e(); │ │ │ │ │ +392 │ │ │ │ │ +397 inline int _n_e_i_g_h_b_o_u_r_s() const; │ │ │ │ │ +398 │ │ │ │ │ +400 inline const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _s_o_u_r_c_e_I_n_d_e_x_S_e_t() const; │ │ │ │ │ +401 │ │ │ │ │ +403 inline const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _d_e_s_t_i_n_a_t_i_o_n_I_n_d_e_x_S_e_t() const; │ │ │ │ │ +404 │ │ │ │ │ +405 private: │ │ │ │ │ +407 _R_e_m_o_t_e_I_n_d_i_c_e_s(const _R_e_m_o_t_e_I_n_d_i_c_e_s&) = delete; │ │ │ │ │ +408 │ │ │ │ │ +410 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t* source_; │ │ │ │ │ +411 │ │ │ │ │ +413 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t* target_; │ │ │ │ │ +414 │ │ │ │ │ +416 MPI_Comm comm_; │ │ │ │ │ +417 │ │ │ │ │ +420 std::set neighbourIds; │ │ │ │ │ +421 │ │ │ │ │ +423 const static int commTag_=333; │ │ │ │ │ +424 │ │ │ │ │ +429 int sourceSeqNo_; │ │ │ │ │ +430 │ │ │ │ │ +435 int destSeqNo_; │ │ │ │ │ +436 │ │ │ │ │ +440 bool publicIgnored; │ │ │ │ │ 441 │ │ │ │ │ -443 │ │ │ │ │ -446 template │ │ │ │ │ -_4_4_7 void _a_s_s_i_g_n(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 _a_s_s_i_g_n(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 _a_s_s_i_g_n(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 │ │ │ │ │ -_4_7_2 void _s_w_a_p(T &v1, T &v2, bool mask) │ │ │ │ │ -473 { │ │ │ │ │ -474 using std::swap; │ │ │ │ │ -475 if(mask) _s_w_a_p(v1, v2); │ │ │ │ │ -476 } │ │ │ │ │ -477 │ │ │ │ │ -478#if HAVE_VC │ │ │ │ │ -479 /* │ │ │ │ │ -480 Add Vc specializations for masked swap │ │ │ │ │ -481 */ │ │ │ │ │ -482 template │ │ │ │ │ -483 void _s_w_a_p(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 │ │ │ │ │ -491 template │ │ │ │ │ -492 void _s_w_a_p(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 │ │ │ │ │ +445 bool firstBuild; │ │ │ │ │ +446 │ │ │ │ │ +447 /* │ │ │ │ │ +448 * @brief If true, sending from indices of the processor to other │ │ │ │ │ +449 * indices on the same processor is enabled even if the same indexset is │ │ │ │ │ +used │ │ │ │ │ +450 * on both the │ │ │ │ │ +451 * sending and receiving side. │ │ │ │ │ +452 */ │ │ │ │ │ +453 bool includeSelf; │ │ │ │ │ +454 │ │ │ │ │ +456 typedef _I_n_d_e_x_P_a_i_r_<_G_l_o_b_a_l_I_n_d_e_x_,_ _L_o_c_a_l_I_n_d_e_x_> │ │ │ │ │ +457 PairType; │ │ │ │ │ +458 │ │ │ │ │ +465 _R_e_m_o_t_e_I_n_d_e_x_M_a_p remoteIndices_; │ │ │ │ │ +466 │ │ │ │ │ +477 template │ │ │ │ │ +478 inline void buildRemote(bool includeSelf); │ │ │ │ │ +479 │ │ │ │ │ +485 inline int noPublic(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet); │ │ │ │ │ +486 │ │ │ │ │ +498 template │ │ │ │ │ +499 inline void packEntries(PairType** myPairs, const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +indexSet, │ │ │ │ │ +500 char* p_out, MPI_Datatype type, int bufferSize, │ │ │ │ │ +501 int* position, int n); │ │ │ │ │ 502 │ │ │ │ │ -503#endif // DUNE_COMMON_SIMD_HH │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_d_e_b_u_g_a_l_i_g_n_._h_h │ │ │ │ │ -_v_c_._h_h │ │ │ │ │ -Compatibility header for including │ │ │ │ │ -_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ -Utilities for reduction like operations on ranges. │ │ │ │ │ -_c_o_n_d_i_t_i_o_n_a_l_._h_h │ │ │ │ │ +516 inline void unpackIndices(_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& remote, int remoteEntries, │ │ │ │ │ +517 PairType** local, int localEntries, char* p_in, │ │ │ │ │ +518 MPI_Datatype type, int* position, int bufferSize, │ │ │ │ │ +519 bool fromOurself); │ │ │ │ │ +520 │ │ │ │ │ +521 inline void unpackIndices(_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& send, _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& receive, │ │ │ │ │ +522 int remoteEntries, PairType** localSource, │ │ │ │ │ +523 int localSourceEntries, PairType** localDest, │ │ │ │ │ +524 int localDestEntries, char* p_in, │ │ │ │ │ +525 MPI_Datatype type, int* position, int bufferSize); │ │ │ │ │ +526 │ │ │ │ │ +527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** │ │ │ │ │ +DestPairs, │ │ │ │ │ +528 int remoteProc, int sourcePublish, int destPublish, │ │ │ │ │ +529 int bufferSize, bool sendTwo, bool fromOurSelf=false); │ │ │ │ │ +530 }; │ │ │ │ │ +531 │ │ │ │ │ +549 template │ │ │ │ │ +_5_5_0 class _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r │ │ │ │ │ +551 { │ │ │ │ │ +552 │ │ │ │ │ +553 template │ │ │ │ │ +_5_5_4 friend class _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ +555 │ │ │ │ │ +556 public: │ │ │ │ │ +_5_5_7 class _I_n_v_a_l_i_d_P_o_s_i_t_i_o_n : public _R_a_n_g_e_E_r_r_o_r │ │ │ │ │ +558 {}; │ │ │ │ │ +559 │ │ │ │ │ +_5_6_8 constexpr static bool _M_O_D_I_F_Y_I_N_D_E_X_S_E_T = mode; │ │ │ │ │ +569 │ │ │ │ │ +_5_7_3 typedef T _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +574 │ │ │ │ │ +_5_7_8 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +579 │ │ │ │ │ +_5_8_3 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +584 │ │ │ │ │ +_5_8_8 typedef typename LocalIndex::Attribute _A_t_t_r_i_b_u_t_e; │ │ │ │ │ +589 │ │ │ │ │ +_5_9_3 typedef _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_<_G_l_o_b_a_l_I_n_d_e_x_,_A_t_t_r_i_b_u_t_e_> _R_e_m_o_t_e_I_n_d_e_x; │ │ │ │ │ +594 │ │ │ │ │ +_5_9_8 typedef A _A_l_l_o_c_a_t_o_r; │ │ │ │ │ +599 │ │ │ │ │ +601 typedef _D_u_n_e_:_:_S_L_L_i_s_t_<_R_e_m_o_t_e_I_n_d_e_x_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ +_6_0_2 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t; │ │ │ │ │ +603 │ │ │ │ │ +_6_0_7 typedef _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_R_e_m_o_t_e_I_n_d_e_x_,_A_l_l_o_c_a_t_o_r_> _M_o_d_i_f_y_I_t_e_r_a_t_o_r; │ │ │ │ │ +608 │ │ │ │ │ +_6_1_2 typedef typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +613 │ │ │ │ │ +627 void _i_n_s_e_r_t(const _R_e_m_o_t_e_I_n_d_e_x& index); │ │ │ │ │ +628 │ │ │ │ │ +629 │ │ │ │ │ +644 void _i_n_s_e_r_t(const _R_e_m_o_t_e_I_n_d_e_x& index, const _G_l_o_b_a_l_I_n_d_e_x& global); │ │ │ │ │ +645 │ │ │ │ │ +653 bool _r_e_m_o_v_e(const _G_l_o_b_a_l_I_n_d_e_x& global); │ │ │ │ │ +654 │ │ │ │ │ +667 void _r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s(); │ │ │ │ │ +668 │ │ │ │ │ +669 │ │ │ │ │ +670 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r(const _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r&); │ │ │ │ │ +671 │ │ │ │ │ +_6_7_6 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r() │ │ │ │ │ +677 : glist_() │ │ │ │ │ +678 {} │ │ │ │ │ +679 │ │ │ │ │ +680 private: │ │ │ │ │ +681 │ │ │ │ │ +687 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet, │ │ │ │ │ +688 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& rList); │ │ │ │ │ +689 │ │ │ │ │ +690 typedef _S_L_L_i_s_t_<_G_l_o_b_a_l_I_n_d_e_x_,_A_l_l_o_c_a_t_o_r_> GlobalList; │ │ │ │ │ +691 typedef typename _G_l_o_b_a_l_L_i_s_t_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r GlobalModifyIterator; │ │ │ │ │ +692 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t* rList_; │ │ │ │ │ +693 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t* indexSet_; │ │ │ │ │ +694 GlobalList glist_; │ │ │ │ │ +695 _M_o_d_i_f_y_I_t_e_r_a_t_o_r iter_; │ │ │ │ │ +696 GlobalModifyIterator giter_; │ │ │ │ │ +697 _C_o_n_s_t_I_t_e_r_a_t_o_r end_; │ │ │ │ │ +698 bool first_; │ │ │ │ │ +699 _G_l_o_b_a_l_I_n_d_e_x last_; │ │ │ │ │ +700 }; │ │ │ │ │ +701 │ │ │ │ │ +706 template │ │ │ │ │ +_7_0_7 class _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r │ │ │ │ │ +708 { │ │ │ │ │ +709 │ │ │ │ │ +713 typedef T ParallelIndexSet; │ │ │ │ │ +714 │ │ │ │ │ +718 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x GlobalIndex; │ │ │ │ │ +719 │ │ │ │ │ +723 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x LocalIndex; │ │ │ │ │ +724 │ │ │ │ │ +728 typedef typename LocalIndex::Attribute Attribute; │ │ │ │ │ +729 │ │ │ │ │ +731 typedef _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_<_G_l_o_b_a_l_I_n_d_e_x_,_A_t_t_r_i_b_u_t_e_> _R_e_m_o_t_e_I_n_d_e_x; │ │ │ │ │ +732 │ │ │ │ │ +734 using Allocator = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc; │ │ │ │ │ +735 │ │ │ │ │ +737 typedef _D_u_n_e_:_:_S_L_L_i_s_t_<_R_e_m_o_t_e_I_n_d_e_x_,_A_l_l_o_c_a_t_o_r_> _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t; │ │ │ │ │ +738 │ │ │ │ │ +740 typedef std::map > │ │ │ │ │ +742 Map; │ │ │ │ │ +743 │ │ │ │ │ +744 public: │ │ │ │ │ +745 │ │ │ │ │ +747 typedef std::map > │ │ │ │ │ +_7_4_8 _R_e_m_o_t_e_I_n_d_e_x_M_a_p; │ │ │ │ │ +749 │ │ │ │ │ +755 inline _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r(const _R_e_m_o_t_e_I_n_d_e_x_M_a_p& map_, bool send); │ │ │ │ │ +756 │ │ │ │ │ +765 inline void _a_d_v_a_n_c_e(const GlobalIndex& global); │ │ │ │ │ +766 │ │ │ │ │ +776 inline void _a_d_v_a_n_c_e(const GlobalIndex& global, const Attribute& attribute); │ │ │ │ │ +777 │ │ │ │ │ +778 _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +779 │ │ │ │ │ +783 inline bool _e_m_p_t_y() const; │ │ │ │ │ +784 │ │ │ │ │ +_7_9_1 class _i_t_e_r_a_t_o_r │ │ │ │ │ +792 { │ │ │ │ │ +793 public: │ │ │ │ │ +_7_9_4 typedef typename Map::iterator _R_e_a_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_9_5 typedef typename Map::iterator _C_o_n_s_t_R_e_a_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +796 │ │ │ │ │ +797 │ │ │ │ │ +_7_9_9 _i_t_e_r_a_t_o_r(const _R_e_a_l_I_t_e_r_a_t_o_r& iter, const _C_o_n_s_t_R_e_a_l_I_t_e_r_a_t_o_r& _e_n_d, │ │ │ │ │ +GlobalIndex& index) │ │ │ │ │ +800 : iter_(iter), end_(_e_n_d), index_(index), hasAttribute(false) │ │ │ │ │ +801 { │ │ │ │ │ +802 // Move to the first valid entry │ │ │ │ │ +803 while(iter_!=end_ && iter_->second.first->localIndexPair().global │ │ │ │ │ +()!=index_) │ │ │ │ │ +804 ++iter_; │ │ │ │ │ +805 } │ │ │ │ │ +806 │ │ │ │ │ +_8_0_7 _i_t_e_r_a_t_o_r(const _R_e_a_l_I_t_e_r_a_t_o_r& iter, const _C_o_n_s_t_R_e_a_l_I_t_e_r_a_t_o_r& _e_n_d, │ │ │ │ │ +GlobalIndex index, │ │ │ │ │ +808 Attribute attribute) │ │ │ │ │ +809 : iter_(iter), end_(_e_n_d), index_(index), attribute_(attribute), │ │ │ │ │ +hasAttribute(true) │ │ │ │ │ +810 { │ │ │ │ │ +811 // Move to the first valid entry or the end │ │ │ │ │ +812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global │ │ │ │ │ +()!=index_ │ │ │ │ │ +813 || iter_->second.first->localIndexPair().local().attribute()!=attribute)) │ │ │ │ │ +814 ++iter_; │ │ │ │ │ +815 } │ │ │ │ │ +_8_1_7 _i_t_e_r_a_t_o_r(const _i_t_e_r_a_t_o_r& other) │ │ │ │ │ +818 : iter_(other.iter_), end_(other.end_), index_(other.index_) │ │ │ │ │ +819 { } │ │ │ │ │ +820 │ │ │ │ │ +_8_2_2 _i_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +823 { │ │ │ │ │ +824 ++iter_; │ │ │ │ │ +825 // If entry is not valid move on │ │ │ │ │ +826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global │ │ │ │ │ +()!=index_ || │ │ │ │ │ +827 (hasAttribute && │ │ │ │ │ +828 iter_->second.first->localIndexPair().local().attribute()!=attribute_))) │ │ │ │ │ +829 ++iter_; │ │ │ │ │ +830 assert(iter_==end_ || │ │ │ │ │ +831 (iter_->second.first->localIndexPair().global()==index_)); │ │ │ │ │ +832 assert(iter_==end_ || !hasAttribute || │ │ │ │ │ +833 (iter_->second.first->localIndexPair().local().attribute()==attribute_)); │ │ │ │ │ +834 return *this; │ │ │ │ │ +835 } │ │ │ │ │ +836 │ │ │ │ │ +_8_3_8 const _R_e_m_o_t_e_I_n_d_e_x& _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ +839 { │ │ │ │ │ +840 return *(iter_->second.first); │ │ │ │ │ +841 } │ │ │ │ │ +842 │ │ │ │ │ +_8_4_4 int _p_r_o_c_e_s_s() const │ │ │ │ │ +845 { │ │ │ │ │ +846 return iter_->first; │ │ │ │ │ +847 } │ │ │ │ │ +848 │ │ │ │ │ +_8_5_0 const _R_e_m_o_t_e_I_n_d_e_x* _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ +851 { │ │ │ │ │ +852 return iter_->second.first.operator->(); │ │ │ │ │ +853 } │ │ │ │ │ +854 │ │ │ │ │ +_8_5_6 bool _o_p_e_r_a_t_o_r_=_=(const _i_t_e_r_a_t_o_r& other) const │ │ │ │ │ +857 { │ │ │ │ │ +858 return other.iter_==iter_; │ │ │ │ │ +859 } │ │ │ │ │ +860 │ │ │ │ │ +_8_6_2 bool _o_p_e_r_a_t_o_r_!_=(const _i_t_e_r_a_t_o_r& other) const │ │ │ │ │ +863 { │ │ │ │ │ +864 return other.iter_!=iter_; │ │ │ │ │ +865 } │ │ │ │ │ +866 │ │ │ │ │ +867 private: │ │ │ │ │ +868 _i_t_e_r_a_t_o_r(); │ │ │ │ │ +869 │ │ │ │ │ +870 _R_e_a_l_I_t_e_r_a_t_o_r iter_; │ │ │ │ │ +871 _R_e_a_l_I_t_e_r_a_t_o_r end_; │ │ │ │ │ +872 GlobalIndex index_; │ │ │ │ │ +873 Attribute attribute_; │ │ │ │ │ +874 bool hasAttribute; │ │ │ │ │ +875 }; │ │ │ │ │ +876 │ │ │ │ │ +877 iterator _b_e_g_i_n(); │ │ │ │ │ +878 │ │ │ │ │ +879 iterator _e_n_d(); │ │ │ │ │ +880 │ │ │ │ │ +881 private: │ │ │ │ │ +882 │ │ │ │ │ +883 Map map_; │ │ │ │ │ +884 GlobalIndex index_; │ │ │ │ │ +885 Attribute attribute_; │ │ │ │ │ +886 bool noattribute; │ │ │ │ │ +887 }; │ │ │ │ │ +888 │ │ │ │ │ +889 template │ │ │ │ │ +_8_9_0 MPI_Datatype _M_P_I_T_r_a_i_t_s_<_I_n_d_e_x_P_a_i_r_<_T_G_,_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_A_> > >::getType() │ │ │ │ │ +891 { │ │ │ │ │ +892 if(type==MPI_DATATYPE_NULL) { │ │ │ │ │ +893 int length[2] = {1, 1}; │ │ │ │ │ +894 MPI_Aint base; │ │ │ │ │ +895 MPI_Aint disp[2]; │ │ │ │ │ +896 MPI_Datatype types[2] = {_M_P_I_T_r_a_i_t_s_<_T_G_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +897 _M_P_I_T_r_a_i_t_s_<_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_A_> >::getType()}; │ │ │ │ │ +898 _I_n_d_e_x_P_a_i_r_<_T_G_,_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_A_> > rep; │ │ │ │ │ +899 MPI_Get_address(&rep, &base); // lower bound of the datatype │ │ │ │ │ +900 MPI_Get_address(&(rep.global_), &disp[0]); │ │ │ │ │ +901 MPI_Get_address(&(rep.local_), &disp[1]); │ │ │ │ │ +902 for (MPI_Aint& d : disp) │ │ │ │ │ +903 d -= base; │ │ │ │ │ +904 │ │ │ │ │ +905 MPI_Datatype tmp; │ │ │ │ │ +906 MPI_Type_create_struct(2, length, disp, types, &tmp); │ │ │ │ │ +907 │ │ │ │ │ +908 MPI_Type_create_resized(tmp, 0, sizeof(_I_n_d_e_x_P_a_i_r │ │ │ │ │ +>), &type); │ │ │ │ │ +909 MPI_Type_commit(&type); │ │ │ │ │ +910 │ │ │ │ │ +911 MPI_Type_free(&tmp); │ │ │ │ │ +912 } │ │ │ │ │ +913 return type; │ │ │ │ │ +914 } │ │ │ │ │ +915 │ │ │ │ │ +916 template │ │ │ │ │ +917 MPI_Datatype _M_P_I_T_r_a_i_t_s_<_I_n_d_e_x_P_a_i_r_<_T_G_,_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_A_> > >:: │ │ │ │ │ +type=MPI_DATATYPE_NULL; │ │ │ │ │ +918 │ │ │ │ │ +919 template │ │ │ │ │ +_9_2_0 _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_R_e_m_o_t_e_I_n_d_e_x(const T2& attribute, const _P_a_i_r_T_y_p_e* local) │ │ │ │ │ +921 : localIndex_(local), attribute_(static_cast<_s_t_d::underlying_type_t> │ │ │ │ │ +(attribute)) │ │ │ │ │ +922 {} │ │ │ │ │ +923 │ │ │ │ │ +924 template │ │ │ │ │ +_9_2_5 _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_R_e_m_o_t_e_I_n_d_e_x(const T2& attribute) │ │ │ │ │ +926 : localIndex_(0), attribute_(static_cast<_s_t_d::underlying_type_t> │ │ │ │ │ +(attribute)) │ │ │ │ │ +927 {} │ │ │ │ │ +928 │ │ │ │ │ +929 template │ │ │ │ │ +_9_3_0 _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_R_e_m_o_t_e_I_n_d_e_x() │ │ │ │ │ +931 : localIndex_(0), attribute_() │ │ │ │ │ +932 {} │ │ │ │ │ +933 template │ │ │ │ │ +_9_3_4 inline bool _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_o_p_e_r_a_t_o_r_=_=(const _R_e_m_o_t_e_I_n_d_e_x& ri) const │ │ │ │ │ +935 { │ │ │ │ │ +936 return localIndex_==ri.localIndex_ && attribute_==ri._a_t_t_r_i_b_u_t_e; │ │ │ │ │ +937 } │ │ │ │ │ +938 │ │ │ │ │ +939 template │ │ │ │ │ +_9_4_0 inline bool _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_o_p_e_r_a_t_o_r_!_=(const _R_e_m_o_t_e_I_n_d_e_x& ri) const │ │ │ │ │ +941 { │ │ │ │ │ +942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_; │ │ │ │ │ +943 } │ │ │ │ │ +944 │ │ │ │ │ +945 template │ │ │ │ │ +_9_4_6 inline const T2 _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_:_a_t_t_r_i_b_u_t_e() const │ │ │ │ │ +947 { │ │ │ │ │ +948 return T2(attribute_); │ │ │ │ │ +949 } │ │ │ │ │ +950 │ │ │ │ │ +951 template │ │ │ │ │ +_9_5_2 inline const _I_n_d_e_x_P_a_i_r_<_T_1_,_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x_<_T_2_> >& _R_e_m_o_t_e_I_n_d_e_x_<_T_1_,_T_2_>_:_: │ │ │ │ │ +_l_o_c_a_l_I_n_d_e_x_P_a_i_r() const │ │ │ │ │ +953 { │ │ │ │ │ +954 return *localIndex_; │ │ │ │ │ +955 } │ │ │ │ │ +956 │ │ │ │ │ +957 template │ │ │ │ │ +_9_5_8 inline _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& source, │ │ │ │ │ +959 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& destination, │ │ │ │ │ +960 const MPI_Comm& comm, │ │ │ │ │ +961 const std::vector& neighbours, │ │ │ │ │ +962 bool includeSelf_) │ │ │ │ │ +963 : source_(&source), target_(&destination), comm_(comm), │ │ │ │ │ +964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true), │ │ │ │ │ +965 includeSelf(includeSelf_) │ │ │ │ │ +966 { │ │ │ │ │ +967 _s_e_t_N_e_i_g_h_b_o_u_r_s(_n_e_i_g_h_b_o_u_r_s); │ │ │ │ │ +968 } │ │ │ │ │ +969 │ │ │ │ │ +970 template │ │ │ │ │ +_9_7_1 void _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_s_e_t_I_n_c_l_u_d_e_S_e_l_f(bool b) │ │ │ │ │ +972 { │ │ │ │ │ +973 includeSelf=b; │ │ │ │ │ +974 } │ │ │ │ │ +975 │ │ │ │ │ +976 template │ │ │ │ │ +_9_7_7 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s() │ │ │ │ │ +978 : source_(0), target_(0), sourceSeqNo_(-1), │ │ │ │ │ +979 destSeqNo_(-1), publicIgnored(false), firstBuild(true), │ │ │ │ │ +980 includeSelf(false) │ │ │ │ │ +981 {} │ │ │ │ │ +982 │ │ │ │ │ +983 template │ │ │ │ │ +_9_8_4 void _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_s_e_t_I_n_d_e_x_S_e_t_s(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& source, │ │ │ │ │ +985 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& destination, │ │ │ │ │ +986 const MPI_Comm& comm, │ │ │ │ │ +987 const std::vector& neighbours) │ │ │ │ │ +988 { │ │ │ │ │ +989 free(); │ │ │ │ │ +990 source_ = &source; │ │ │ │ │ +991 target_ = &destination; │ │ │ │ │ +992 comm_ = comm; │ │ │ │ │ +993 firstBuild = true; │ │ │ │ │ +994 setNeighbours(neighbours); │ │ │ │ │ +995 } │ │ │ │ │ +996 │ │ │ │ │ +997 template │ │ │ │ │ +998 const typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +_9_9_9 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_s_o_u_r_c_e_I_n_d_e_x_S_e_t() const │ │ │ │ │ +1000 { │ │ │ │ │ +1001 return *source_; │ │ │ │ │ +1002 } │ │ │ │ │ +1003 │ │ │ │ │ +1004 │ │ │ │ │ +1005 template │ │ │ │ │ +1006 const typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& │ │ │ │ │ +_1_0_0_7 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_d_e_s_t_i_n_a_t_i_o_n_I_n_d_e_x_S_e_t() const │ │ │ │ │ +1008 { │ │ │ │ │ +1009 return *target_; │ │ │ │ │ +1010 } │ │ │ │ │ +1011 │ │ │ │ │ +1012 │ │ │ │ │ +1013 template │ │ │ │ │ +_1_0_1_4 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_~_R_e_m_o_t_e_I_n_d_i_c_e_s() │ │ │ │ │ +1015 { │ │ │ │ │ +1016 free(); │ │ │ │ │ +1017 } │ │ │ │ │ +1018 │ │ │ │ │ +1019 template │ │ │ │ │ +1020 template │ │ │ │ │ +_1_0_2_1 inline void _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_p_a_c_k_E_n_t_r_i_e_s │ │ │ │ │ +(_I_n_d_e_x_P_a_i_r_<_G_l_o_b_a_l_I_n_d_e_x_,_L_o_c_a_l_I_n_d_e_x_>** pairs, │ │ │ │ │ +1022 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet, │ │ │ │ │ +1023 char* p_out, MPI_Datatype type, │ │ │ │ │ +1024 int bufferSize, │ │ │ │ │ +1025 int *position, │ │ │ │ │ +1026 [[maybe_unused]] int n) │ │ │ │ │ +1027 { │ │ │ │ │ +1028 // fill with own indices │ │ │ │ │ +1029 const auto end = indexSet._e_n_d(); │ │ │ │ │ +1030 │ │ │ │ │ +1031 //Now pack the source indices │ │ │ │ │ +1032 int i=0; │ │ │ │ │ +1033 for(auto index = indexSet.begin(); index != end; ++index) │ │ │ │ │ +1034 if(ignorePublic || index->local().isPublic()) { │ │ │ │ │ +1035 │ │ │ │ │ +1036 MPI_Pack(const_cast<_P_a_i_r_T_y_p_e*>(&(*index)), 1, │ │ │ │ │ +1037 type, │ │ │ │ │ +1038 p_out, bufferSize, position, comm_); │ │ │ │ │ +1039 pairs[i++] = const_cast<_P_a_i_r_T_y_p_e*>(&(*index)); │ │ │ │ │ +1040 │ │ │ │ │ +1041 } │ │ │ │ │ +1042 assert(i==n); │ │ │ │ │ +1043 } │ │ │ │ │ +1044 │ │ │ │ │ +1045 template │ │ │ │ │ +1046 inline int _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_n_o_P_u_b_l_i_c(const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet) │ │ │ │ │ +1047 { │ │ │ │ │ +1048 │ │ │ │ │ +1049 int noPublic=0; │ │ │ │ │ +1050 │ │ │ │ │ +1051 const auto end=indexSet._e_n_d(); │ │ │ │ │ +1052 for(auto index=indexSet._b_e_g_i_n(); index!=end; ++index) │ │ │ │ │ +1053 if(index->local().isPublic()) │ │ │ │ │ +1054 noPublic++; │ │ │ │ │ +1055 │ │ │ │ │ +1056 return noPublic; │ │ │ │ │ +1057 │ │ │ │ │ +1058 } │ │ │ │ │ +1059 │ │ │ │ │ +1060 │ │ │ │ │ +1061 template │ │ │ │ │ +1062 inline void RemoteIndices::unpackCreateRemote(char* p_in, PairType** │ │ │ │ │ +sourcePairs, │ │ │ │ │ +1063 PairType** destPairs, int remoteProc, │ │ │ │ │ +1064 int sourcePublish, int destPublish, │ │ │ │ │ +1065 int bufferSize, bool sendTwo, │ │ │ │ │ +1066 bool fromOurSelf) │ │ │ │ │ +1067 { │ │ │ │ │ +1068 │ │ │ │ │ +1069 // unpack the number of indices we received │ │ │ │ │ +1070 int noRemoteSource=-1, noRemoteDest=-1; │ │ │ │ │ +1071 char twoIndexSets=0; │ │ │ │ │ +1072 int position=0; │ │ │ │ │ +1073 // Did we receive two index sets? │ │ │ │ │ +1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, │ │ │ │ │ +comm_); │ │ │ │ │ +1075 // The number of source indices received │ │ │ │ │ +1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, │ │ │ │ │ +comm_); │ │ │ │ │ +1077 // The number of destination indices received │ │ │ │ │ +1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_); │ │ │ │ │ +1079 │ │ │ │ │ +1080 │ │ │ │ │ +1081 // Indices for which we receive │ │ │ │ │ +1082 RemoteIndexList* receive= new RemoteIndexList(); │ │ │ │ │ +1083 // Indices for which we send │ │ │ │ │ +1084 RemoteIndexList* send=0; │ │ │ │ │ +1085 │ │ │ │ │ +1086 MPI_Datatype type= _M_P_I_T_r_a_i_t_s_<_P_a_i_r_T_y_p_e_>_:_:_g_e_t_T_y_p_e(); │ │ │ │ │ +1087 │ │ │ │ │ +1088 if(!twoIndexSets) { │ │ │ │ │ +1089 if(sendTwo) { │ │ │ │ │ +1090 send = new RemoteIndexList(); │ │ │ │ │ +1091 // Create both remote index sets simultaneously │ │ │ │ │ +1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish, │ │ │ │ │ +1093 destPairs, destPublish, p_in, type, &position, bufferSize); │ │ │ │ │ +1094 }else{ │ │ │ │ │ +1095 // we only need one list │ │ │ │ │ +1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish, │ │ │ │ │ +1097 p_in, type, &position, bufferSize, fromOurSelf); │ │ │ │ │ +1098 send=receive; │ │ │ │ │ +1099 } │ │ │ │ │ +1100 }else{ │ │ │ │ │ +1101 │ │ │ │ │ +1102 int oldPos=position; │ │ │ │ │ +1103 // Two index sets received │ │ │ │ │ +1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish, │ │ │ │ │ +1105 p_in, type, &position, bufferSize, fromOurSelf); │ │ │ │ │ +1106 if(!sendTwo) │ │ │ │ │ +1107 //unpack source entries again as destination entries │ │ │ │ │ +1108 position=oldPos; │ │ │ │ │ +1109 │ │ │ │ │ +1110 send = new RemoteIndexList(); │ │ │ │ │ +1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish, │ │ │ │ │ +1112 p_in, type, &position, bufferSize, fromOurSelf); │ │ │ │ │ +1113 } │ │ │ │ │ +1114 │ │ │ │ │ +1115 if(receive->empty() && send->empty()) { │ │ │ │ │ +1116 if(send==receive) { │ │ │ │ │ +1117 delete send; │ │ │ │ │ +1118 }else{ │ │ │ │ │ +1119 delete send; │ │ │ │ │ +1120 delete receive; │ │ │ │ │ +1121 } │ │ │ │ │ +1122 }else{ │ │ │ │ │ +1123 remoteIndices_.insert(std::make_pair(remoteProc, │ │ │ │ │ +1124 std::make_pair(send,receive))); │ │ │ │ │ +1125 } │ │ │ │ │ +1126 } │ │ │ │ │ +1127 │ │ │ │ │ +1128 │ │ │ │ │ +1129 template │ │ │ │ │ +1130 template │ │ │ │ │ +1131 inline void RemoteIndices::buildRemote(bool includeSelf_) │ │ │ │ │ +1132 { │ │ │ │ │ +1133 // Processor configuration │ │ │ │ │ +1134 int rank, procs; │ │ │ │ │ +1135 MPI_Comm_rank(comm_, &rank); │ │ │ │ │ +1136 MPI_Comm_size(comm_, &procs); │ │ │ │ │ +1137 │ │ │ │ │ +1138 // number of local indices to publish │ │ │ │ │ +1139 // The indices of the destination will be send. │ │ │ │ │ +1140 int sourcePublish, destPublish; │ │ │ │ │ +1141 │ │ │ │ │ +1142 // Do we need to send two index sets? │ │ │ │ │ +1143 char sendTwo = (source_ != target_); │ │ │ │ │ +1144 │ │ │ │ │ +1145 if(procs==1 && !(sendTwo || includeSelf_)) │ │ │ │ │ +1146 // Nothing to communicate │ │ │ │ │ +1147 return; │ │ │ │ │ +1148 │ │ │ │ │ +1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_); │ │ │ │ │ +1150 │ │ │ │ │ +1151 if(sendTwo) │ │ │ │ │ +1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_); │ │ │ │ │ +1153 else │ │ │ │ │ +1154 // we only need to send one set of indices │ │ │ │ │ +1155 destPublish = 0; │ │ │ │ │ +1156 │ │ │ │ │ +1157 int maxPublish, publish=sourcePublish+destPublish; │ │ │ │ │ +1158 │ │ │ │ │ +1159 // Calculate maximum number of indices send │ │ │ │ │ +1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_); │ │ │ │ │ +1161 │ │ │ │ │ +1162 // allocate buffers │ │ │ │ │ +1163 PairType** destPairs; │ │ │ │ │ +1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : │ │ │ │ │ +1]; │ │ │ │ │ +1165 │ │ │ │ │ +1166 if(sendTwo) │ │ │ │ │ +1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1]; │ │ │ │ │ +1168 else │ │ │ │ │ +1169 destPairs=sourcePairs; │ │ │ │ │ +1170 │ │ │ │ │ +1171 char** buffer = new char*[2]; │ │ │ │ │ +1172 int bufferSize; │ │ │ │ │ +1173 int position=0; │ │ │ │ │ +1174 int intSize; │ │ │ │ │ +1175 int charSize; │ │ │ │ │ +1176 │ │ │ │ │ +1177 // calculate buffer size │ │ │ │ │ +1178 MPI_Datatype type = _M_P_I_T_r_a_i_t_s_<_P_a_i_r_T_y_p_e_>_:_:_g_e_t_T_y_p_e(); │ │ │ │ │ +1179 │ │ │ │ │ +1180 MPI_Pack_size(maxPublish, type, comm_, │ │ │ │ │ +1181 &bufferSize); │ │ │ │ │ +1182 MPI_Pack_size(1, MPI_INT, comm_, │ │ │ │ │ +1183 &intSize); │ │ │ │ │ +1184 MPI_Pack_size(1, MPI_CHAR, comm_, │ │ │ │ │ +1185 &charSize); │ │ │ │ │ +1186 // Our message will contain the following: │ │ │ │ │ +1187 // a bool whether two index sets where sent │ │ │ │ │ +1188 // the size of the source and the dest indexset, │ │ │ │ │ +1189 // then the source and destination indices │ │ │ │ │ +1190 bufferSize += 2 * intSize + charSize; │ │ │ │ │ +1191 │ │ │ │ │ +1192 if(bufferSize<=0) bufferSize=1; │ │ │ │ │ +1193 │ │ │ │ │ +1194 buffer[0] = new char[bufferSize]; │ │ │ │ │ +1195 buffer[1] = new char[bufferSize]; │ │ │ │ │ +1196 │ │ │ │ │ +1197 │ │ │ │ │ +1198 // pack entries into buffer[0], p_out below! │ │ │ │ │ +1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position, │ │ │ │ │ +1200 comm_); │ │ │ │ │ +1201 │ │ │ │ │ +1202 // The number of indices we send for each index set │ │ │ │ │ +1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position, │ │ │ │ │ +1204 comm_); │ │ │ │ │ +1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position, │ │ │ │ │ +1206 comm_); │ │ │ │ │ +1207 │ │ │ │ │ +1208 // Now pack the source indices and setup the destination pairs │ │ │ │ │ +1209 packEntries(sourcePairs, *source_, buffer[0], type, │ │ │ │ │ +1210 bufferSize, &position, sourcePublish); │ │ │ │ │ +1211 // If necessary send the dest indices and setup the source pairs │ │ │ │ │ +1212 if(sendTwo) │ │ │ │ │ +1213 packEntries(destPairs, *target_, buffer[0], type, │ │ │ │ │ +1214 bufferSize, &position, destPublish); │ │ │ │ │ +1215 │ │ │ │ │ +1216 │ │ │ │ │ +1217 // Update remote indices for ourself │ │ │ │ │ +1218 if(sendTwo|| includeSelf_) │ │ │ │ │ +1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish, │ │ │ │ │ +1220 destPublish, bufferSize, sendTwo, includeSelf_); │ │ │ │ │ +1221 │ │ │ │ │ +1222 neighbourIds.erase(rank); │ │ │ │ │ +1223 │ │ │ │ │ +1224 if(neighbourIds.size()==0) │ │ │ │ │ +1225 { │ │ │ │ │ +1226 _D_u_n_e_:_:_d_v_v_e_r_b<::size_type size_type; │ │ │ │ │ +1262 size_type noNeighbours=neighbourIds.size(); │ │ │ │ │ +1263 │ │ │ │ │ +1264 // setup sends │ │ │ │ │ +1265 for(std::set::iterator neighbour=neighbourIds.begin(); │ │ │ │ │ +1266 neighbour!= neighbourIds.end(); ++neighbour) { │ │ │ │ │ +1267 // Only send the information to the neighbouring processors │ │ │ │ │ +1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, │ │ │ │ │ +req++); │ │ │ │ │ +1269 } │ │ │ │ │ +1270 │ │ │ │ │ +1271 //Test for received messages │ │ │ │ │ +1272 │ │ │ │ │ +1273 for(size_type received=0; received │ │ │ │ │ +1314 inline void RemoteIndices::unpackIndices(RemoteIndexList& remote, │ │ │ │ │ +1315 int remoteEntries, │ │ │ │ │ +1316 PairType** local, │ │ │ │ │ +1317 int localEntries, │ │ │ │ │ +1318 char* p_in, │ │ │ │ │ +1319 MPI_Datatype type, │ │ │ │ │ +1320 int* position, │ │ │ │ │ +1321 int bufferSize, │ │ │ │ │ +1322 bool fromOurSelf) │ │ │ │ │ +1323 { │ │ │ │ │ +1324 if(remoteEntries==0) │ │ │ │ │ +1325 return; │ │ │ │ │ +1326 │ │ │ │ │ +1327 PairType index; │ │ │ │ │ +1328 MPI_Unpack(p_in, bufferSize, position, &index, 1, │ │ │ │ │ +1329 type, comm_); │ │ │ │ │ +1330 GlobalIndex oldGlobal=index.global(); │ │ │ │ │ +1331 int n_in=0, localIndex=0; │ │ │ │ │ +1332 │ │ │ │ │ +1333 //Check if we know the global index │ │ │ │ │ +1334 while(localIndexglobal()==index.global()) { │ │ │ │ │ +1336 int oldLocalIndex=localIndex; │ │ │ │ │ +1337 │ │ │ │ │ +1338 while(localIndexglobal()==index.global()) { │ │ │ │ │ +1340 if(!fromOurSelf || index.local().attribute() != │ │ │ │ │ +1341 local[localIndex]->local().attribute()) │ │ │ │ │ +1342 // if index is from us it has to have a different attribute │ │ │ │ │ +1343 remote.push_back(RemoteIndex(index.local().attribute(), │ │ │ │ │ +1344 local[localIndex])); │ │ │ │ │ +1345 localIndex++; │ │ │ │ │ +1346 } │ │ │ │ │ +1347 │ │ │ │ │ +1348 // unpack next remote index │ │ │ │ │ +1349 if((++n_in) < remoteEntries) { │ │ │ │ │ +1350 MPI_Unpack(p_in, bufferSize, position, &index, 1, │ │ │ │ │ +1351 type, comm_); │ │ │ │ │ +1352 if(index.global()==oldGlobal) │ │ │ │ │ +1353 // Restart comparison for the same global indices │ │ │ │ │ +1354 localIndex=oldLocalIndex; │ │ │ │ │ +1355 else │ │ │ │ │ +1356 oldGlobal=index.global(); │ │ │ │ │ +1357 }else{ │ │ │ │ │ +1358 // No more received indices │ │ │ │ │ +1359 break; │ │ │ │ │ +1360 } │ │ │ │ │ +1361 continue; │ │ │ │ │ +1362 } │ │ │ │ │ +1363 │ │ │ │ │ +1364 if (local[localIndex]->global() │ │ │ │ │ +1387 inline void RemoteIndices::unpackIndices(RemoteIndexList& send, │ │ │ │ │ +1388 RemoteIndexList& receive, │ │ │ │ │ +1389 int remoteEntries, │ │ │ │ │ +1390 PairType** localSource, │ │ │ │ │ +1391 int localSourceEntries, │ │ │ │ │ +1392 PairType** localDest, │ │ │ │ │ +1393 int localDestEntries, │ │ │ │ │ +1394 char* p_in, │ │ │ │ │ +1395 MPI_Datatype type, │ │ │ │ │ +1396 int* position, │ │ │ │ │ +1397 int bufferSize) │ │ │ │ │ +1398 { │ │ │ │ │ +1399 int n_in=0, sourceIndex=0, destIndex=0; │ │ │ │ │ +1400 │ │ │ │ │ +1401 //Check if we know the global index │ │ │ │ │ +1402 while(n_in= than the │ │ │ │ │ +one in the unpacked index │ │ │ │ │ +1410 while(sourceIndexglobal │ │ │ │ │ +()global │ │ │ │ │ +()global │ │ │ │ │ +()==index.global()) │ │ │ │ │ +1418 send.push_back(RemoteIndex(index.local().attribute(), │ │ │ │ │ +1419 localSource[sourceIndex])); │ │ │ │ │ +1420 │ │ │ │ │ +1421 if(destIndex < localDestEntries && localDest[destIndex]->global() == │ │ │ │ │ +index.global()) │ │ │ │ │ +1422 receive.push_back(RemoteIndex(index.local().attribute(), │ │ │ │ │ +1423 localDest[sourceIndex])); │ │ │ │ │ +1424 } │ │ │ │ │ +1425 │ │ │ │ │ +1426 } │ │ │ │ │ +1427 │ │ │ │ │ +1428 template │ │ │ │ │ +_1_4_2_9 inline void _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_f_r_e_e() │ │ │ │ │ +1430 { │ │ │ │ │ +1431 auto lend = remoteIndices_.end(); │ │ │ │ │ +1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) { │ │ │ │ │ +1433 if(lists->second.first==lists->second.second) { │ │ │ │ │ +1434 // there is only one remote index list. │ │ │ │ │ +1435 delete lists->second.first; │ │ │ │ │ +1436 }else{ │ │ │ │ │ +1437 delete lists->second.first; │ │ │ │ │ +1438 delete lists->second.second; │ │ │ │ │ +1439 } │ │ │ │ │ +1440 } │ │ │ │ │ +1441 remoteIndices_.clear(); │ │ │ │ │ +1442 firstBuild=true; │ │ │ │ │ +1443 } │ │ │ │ │ +1444 │ │ │ │ │ +1445 template │ │ │ │ │ +_1_4_4_6 inline int _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_n_e_i_g_h_b_o_u_r_s() const │ │ │ │ │ +1447 { │ │ │ │ │ +1448 return remoteIndices_.size(); │ │ │ │ │ +1449 } │ │ │ │ │ +1450 │ │ │ │ │ +1451 template │ │ │ │ │ +1452 template │ │ │ │ │ +_1_4_5_3 inline void _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_r_e_b_u_i_l_d() │ │ │ │ │ +1454 { │ │ │ │ │ +1455 // Test whether a rebuild is Needed. │ │ │ │ │ +1456 if(firstBuild || │ │ │ │ │ +1457 ignorePublic!=publicIgnored || ! │ │ │ │ │ +1458 isSynced()) { │ │ │ │ │ +1459 free(); │ │ │ │ │ +1460 │ │ │ │ │ +1461 buildRemote(includeSelf); │ │ │ │ │ +1462 │ │ │ │ │ +1463 sourceSeqNo_ = source_->seqNo(); │ │ │ │ │ +1464 destSeqNo_ = target_->seqNo(); │ │ │ │ │ +1465 firstBuild=false; │ │ │ │ │ +1466 publicIgnored=ignorePublic; │ │ │ │ │ +1467 } │ │ │ │ │ +1468 │ │ │ │ │ +1469 │ │ │ │ │ +1470 } │ │ │ │ │ +1471 │ │ │ │ │ +1472 template │ │ │ │ │ +_1_4_7_3 inline bool _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_i_s_S_y_n_c_e_d() const │ │ │ │ │ +1474 { │ │ │ │ │ +1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo(); │ │ │ │ │ +1476 } │ │ │ │ │ +1477 │ │ │ │ │ +1478 template │ │ │ │ │ +1479 template │ │ │ │ │ +_1_4_8_0 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_> _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_g_e_t_M_o_d_i_f_i_e_r(int │ │ │ │ │ +process) │ │ │ │ │ +1481 { │ │ │ │ │ +1482 │ │ │ │ │ +1483 // The user are on their own now! │ │ │ │ │ +1484 // We assume they know what they are doing and just set the │ │ │ │ │ +1485 // remote indices to synced status. │ │ │ │ │ +1486 sourceSeqNo_ = source_->seqNo(); │ │ │ │ │ +1487 destSeqNo_ = target_->seqNo(); │ │ │ │ │ +1488 │ │ │ │ │ +1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process); │ │ │ │ │ +1490 │ │ │ │ │ +1491 if(found == remoteIndices_.end()) │ │ │ │ │ +1492 { │ │ │ │ │ +1493 if(source_ != target_) │ │ │ │ │ +1494 found = remoteIndices_._i_n_s_e_r_t(found, std::make_pair(process, │ │ │ │ │ +1495 std::make_pair(new _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t(), │ │ │ │ │ +1496 new _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t()))); │ │ │ │ │ +1497 else{ │ │ │ │ │ +1498 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t* rlist = new _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t(); │ │ │ │ │ +1499 found = remoteIndices_.insert(found, │ │ │ │ │ +1500 std::make_pair(process, │ │ │ │ │ +1501 std::make_pair(rlist, rlist))); │ │ │ │ │ +1502 } │ │ │ │ │ +1503 } │ │ │ │ │ +1504 │ │ │ │ │ +1505 firstBuild = false; │ │ │ │ │ +1506 │ │ │ │ │ +1507 if(send) │ │ │ │ │ +1508 return _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>(*source_, *(found- │ │ │ │ │ +>second.first)); │ │ │ │ │ +1509 else │ │ │ │ │ +1510 return _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>(*target_, *(found- │ │ │ │ │ +>second.second)); │ │ │ │ │ +1511 } │ │ │ │ │ +1512 │ │ │ │ │ +1513 template │ │ │ │ │ +1514 inline typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +_1_5_1_5 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_f_i_n_d(int proc) const │ │ │ │ │ +1516 { │ │ │ │ │ +1517 return remoteIndices_.find(proc); │ │ │ │ │ +1518 } │ │ │ │ │ +1519 │ │ │ │ │ +1520 template │ │ │ │ │ +1521 inline typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +_1_5_2_2 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_b_e_g_i_n() const │ │ │ │ │ +1523 { │ │ │ │ │ +1524 return remoteIndices_.begin(); │ │ │ │ │ +1525 } │ │ │ │ │ +1526 │ │ │ │ │ +1527 template │ │ │ │ │ +1528 inline typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +_1_5_2_9 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_e_n_d() const │ │ │ │ │ +1530 { │ │ │ │ │ +1531 return remoteIndices_.end(); │ │ │ │ │ +1532 } │ │ │ │ │ +1533 │ │ │ │ │ +1534 │ │ │ │ │ +1535 template │ │ │ │ │ +_1_5_3_6 bool _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_o_p_e_r_a_t_o_r_=_=(const _R_e_m_o_t_e_I_n_d_i_c_e_s& ri) const │ │ │ │ │ +1537 { │ │ │ │ │ +1538 if(neighbours()!=ri._n_e_i_g_h_b_o_u_r_s()) │ │ │ │ │ +1539 return false; │ │ │ │ │ +1540 │ │ │ │ │ +1541 const auto rend = remoteIndices_.end(); │ │ │ │ │ +1542 │ │ │ │ │ +1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin │ │ │ │ │ +(); rindex!=rend; ++rindex, ++rindex1) { │ │ │ │ │ +1544 if(rindex->first != rindex1->first) │ │ │ │ │ +1545 return false; │ │ │ │ │ +1546 if(*(rindex->second.first) != *(rindex1->second.first)) │ │ │ │ │ +1547 return false; │ │ │ │ │ +1548 if(*(rindex->second.second) != *(rindex1->second.second)) │ │ │ │ │ +1549 return false; │ │ │ │ │ +1550 } │ │ │ │ │ +1551 return true; │ │ │ │ │ +1552 } │ │ │ │ │ +1553 │ │ │ │ │ +1554 template │ │ │ │ │ +1555 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r(const │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet, │ │ │ │ │ +1556 RemoteIndexList& rList) │ │ │ │ │ +1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_ │ │ │ │ │ +(rList.end()), first_(true) │ │ │ │ │ +1558 { │ │ │ │ │ +1559 if(MODIFYINDEXSET) { │ │ │ │ │ +1560 assert(indexSet_); │ │ │ │ │ +1561 for(ConstIterator iter=iter_; iter != end_; ++iter) │ │ │ │ │ +1562 glist_.push_back(iter->localIndexPair().global()); │ │ │ │ │ +1563 giter_ = glist_.beginModify(); │ │ │ │ │ +1564 } │ │ │ │ │ +1565 } │ │ │ │ │ +1566 │ │ │ │ │ +1567 template │ │ │ │ │ +_1_5_6_8 _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r(const │ │ │ │ │ +_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>& other) │ │ │ │ │ +1569 : rList_(other.rList_), indexSet_(other.indexSet_), │ │ │ │ │ +1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_ │ │ │ │ │ +(other.end_), │ │ │ │ │ +1571 first_(other.first_), last_(other.last_) │ │ │ │ │ +1572 {} │ │ │ │ │ +1573 │ │ │ │ │ +1574 template │ │ │ │ │ +_1_5_7_5 inline void _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s() │ │ │ │ │ +1576 { │ │ │ │ │ +1577 if(MODIFYINDEXSET) { │ │ │ │ │ +1578 // repair pointers to local index set. │ │ │ │ │ +1579#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1580 if(indexSet_->state()!=_G_R_O_U_N_D) │ │ │ │ │ +1581 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e, "Index has to be in ground mode for │ │ │ │ │ +repairing pointers to indices"); │ │ │ │ │ +1582#endif │ │ │ │ │ +1583 auto giter = glist_.begin(); │ │ │ │ │ +1584 auto index = indexSet_->begin(); │ │ │ │ │ +1585 │ │ │ │ │ +1586 for(auto iter=rList_->begin(); iter != end_; ++iter) { │ │ │ │ │ +1587 while(index->global()<*giter) { │ │ │ │ │ +1588 ++index; │ │ │ │ │ +1589#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1590 if(index == indexSet_->end()) │ │ │ │ │ +1591 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_P_o_s_i_t_i_o_n, "No such global index in set!"); │ │ │ │ │ +1592#endif │ │ │ │ │ +1593 } │ │ │ │ │ +1594 │ │ │ │ │ +1595#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1596 if(index->global() != *giter) │ │ │ │ │ +1597 _D_U_N_E___T_H_R_O_W(_I_n_v_a_l_i_d_P_o_s_i_t_i_o_n, "No such global index in set!"); │ │ │ │ │ +1598#endif │ │ │ │ │ +1599 iter->localIndex_ = &(*index); │ │ │ │ │ +1600 } │ │ │ │ │ +1601 } │ │ │ │ │ +1602 } │ │ │ │ │ +1603 │ │ │ │ │ +1604 template │ │ │ │ │ +_1_6_0_5 inline void _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_i_n_s_e_r_t(const _R_e_m_o_t_e_I_n_d_e_x& │ │ │ │ │ +index) │ │ │ │ │ +1606 { │ │ │ │ │ +1607 static_assert(!mode,"Not allowed if the mode indicates that new indices" │ │ │ │ │ +1608 "might be added to the underlying index set. Use " │ │ │ │ │ +1609 "insert(const RemoteIndex&, const GlobalIndex&) instead"); │ │ │ │ │ +1610 │ │ │ │ │ +1611#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1612 if(!first_ && index._l_o_c_a_l_I_n_d_e_x_P_a_i_r()._g_l_o_b_a_l()localIndexPair().global() < │ │ │ │ │ +index._l_o_c_a_l_I_n_d_e_x_P_a_i_r()._g_l_o_b_a_l()) { │ │ │ │ │ +1617 ++iter_; │ │ │ │ │ +1618 } │ │ │ │ │ +1619 │ │ │ │ │ +1620 // No duplicate entries allowed │ │ │ │ │ +1621 assert(iter_==end_ || iter_->localIndexPair().global() != │ │ │ │ │ +index._l_o_c_a_l_I_n_d_e_x_P_a_i_r()._g_l_o_b_a_l()); │ │ │ │ │ +1622 iter_.insert(index); │ │ │ │ │ +1623 last_ = index._l_o_c_a_l_I_n_d_e_x_P_a_i_r()._g_l_o_b_a_l(); │ │ │ │ │ +1624 first_ = false; │ │ │ │ │ +1625 } │ │ │ │ │ +1626 │ │ │ │ │ +1627 template │ │ │ │ │ +_1_6_2_8 inline void _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_i_n_s_e_r_t(const _R_e_m_o_t_e_I_n_d_e_x& │ │ │ │ │ +index, const _G_l_o_b_a_l_I_n_d_e_x& global) │ │ │ │ │ +1629 { │ │ │ │ │ +1630 static_assert(mode,"Not allowed if the mode indicates that no new indices" │ │ │ │ │ +1631 "might be added to the underlying index set. Use " │ │ │ │ │ +1632 "insert(const RemoteIndex&) instead"); │ │ │ │ │ +1633#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1634 if(!first_ && globallocalIndexPair().global() != global); │ │ │ │ │ +1645 iter_.insert(index); │ │ │ │ │ +1646 giter_.insert(global); │ │ │ │ │ +1647 │ │ │ │ │ +1648 last_ = global; │ │ │ │ │ +1649 first_ = false; │ │ │ │ │ +1650 } │ │ │ │ │ +1651 │ │ │ │ │ +1652 template │ │ │ │ │ +_1_6_5_3 bool _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_<_T_,_A_,_m_o_d_e_>_:_:_r_e_m_o_v_e(const _G_l_o_b_a_l_I_n_d_e_x& global) │ │ │ │ │ +1654 { │ │ │ │ │ +1655#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1656 if(!first_ && globallocalIndexPair().global() < global) │ │ │ │ │ +1675 ++iter_; │ │ │ │ │ +1676 │ │ │ │ │ +1677 if(iter_->localIndexPair().global()==global) { │ │ │ │ │ +1678 iter_.remove(); │ │ │ │ │ +1679 found = true; │ │ │ │ │ +1680 } │ │ │ │ │ +1681 } │ │ │ │ │ +1682 │ │ │ │ │ +1683 last_ = global; │ │ │ │ │ +1684 first_ = false; │ │ │ │ │ +1685 return found; │ │ │ │ │ +1686 } │ │ │ │ │ +1687 │ │ │ │ │ +1688 template │ │ │ │ │ +1689 template │ │ │ │ │ +_1_6_9_0 inline typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +_R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_i_t_e_r_a_t_o_r() const │ │ │ │ │ +1691 { │ │ │ │ │ +1692 return _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>(remoteIndices_, send); │ │ │ │ │ +1693 } │ │ │ │ │ +1694 │ │ │ │ │ +1695 template │ │ │ │ │ +_1_6_9_6 inline MPI_Comm _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>_:_:_c_o_m_m_u_n_i_c_a_t_o_r() const │ │ │ │ │ +1697 { │ │ │ │ │ +1698 return comm_; │ │ │ │ │ +1699 │ │ │ │ │ +1700 } │ │ │ │ │ +1701 │ │ │ │ │ +1702 template │ │ │ │ │ +_1_7_0_3 _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r(const _R_e_m_o_t_e_I_n_d_e_x_M_a_p& pmap, │ │ │ │ │ +bool send) │ │ │ │ │ +1704 { │ │ │ │ │ +1705 │ │ │ │ │ +1706 const auto end = pmap.end(); │ │ │ │ │ +1707 for(auto process = pmap.begin(); process != end; ++process) { │ │ │ │ │ +1708 const _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t* list = send ? process->second.first : process- │ │ │ │ │ +>second.second; │ │ │ │ │ +1709 using ri_iterator = typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +1710 map_.insert(std::make_pair(process->first, │ │ │ │ │ +1711 std::pair(list->_b_e_g_i_n(), list->_e_n_d()))); │ │ │ │ │ +1712 } │ │ │ │ │ +1713 } │ │ │ │ │ +1714 │ │ │ │ │ +1715 template │ │ │ │ │ +_1_7_1_6 inline void _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_a_d_v_a_n_c_e(const GlobalIndex& index) │ │ │ │ │ +1717 { │ │ │ │ │ +1718 const auto end = map_.end(); │ │ │ │ │ +1719 │ │ │ │ │ +1720 for(auto iter = map_.begin(); iter != end;) { │ │ │ │ │ +1721 // Step the iterator until we are >= index │ │ │ │ │ +1722 typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r current = iter->second.first; │ │ │ │ │ +1723 typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r rend = iter->second.second; │ │ │ │ │ +1724 _R_e_m_o_t_e_I_n_d_e_x remoteIndex; │ │ │ │ │ +1725 if(current != rend) │ │ │ │ │ +1726 remoteIndex = *current; │ │ │ │ │ +1727 │ │ │ │ │ +1728 while(iter->second.first!=iter->second.second && iter->second.first- │ │ │ │ │ +>localIndexPair().global()second.first); │ │ │ │ │ +1730 │ │ │ │ │ +1731 // erase from the map if there are no more entries. │ │ │ │ │ +1732 if(iter->second.first == iter->second.second) │ │ │ │ │ +1733 map_.erase(iter++); │ │ │ │ │ +1734 else{ │ │ │ │ │ +1735 ++iter; │ │ │ │ │ +1736 } │ │ │ │ │ +1737 } │ │ │ │ │ +1738 index_=index; │ │ │ │ │ +1739 noattribute=true; │ │ │ │ │ +1740 } │ │ │ │ │ +1741 │ │ │ │ │ +1742 template │ │ │ │ │ +_1_7_4_3 inline void _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_a_d_v_a_n_c_e(const GlobalIndex& index, │ │ │ │ │ +1744 const Attribute& attribute) │ │ │ │ │ +1745 { │ │ │ │ │ +1746 const auto end = map_.end(); │ │ │ │ │ +1747 │ │ │ │ │ +1748 for(auto iter = map_.begin(); iter != end;) { │ │ │ │ │ +1749 // Step the iterator until we are >= index │ │ │ │ │ +1750 typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r current = iter->second.first; │ │ │ │ │ +1751 typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r rend = iter->second.second; │ │ │ │ │ +1752 _R_e_m_o_t_e_I_n_d_e_x remoteIndex; │ │ │ │ │ +1753 if(current != rend) │ │ │ │ │ +1754 remoteIndex = *current; │ │ │ │ │ +1755 │ │ │ │ │ +1756 // Move to global index or bigger │ │ │ │ │ +1757 while(iter->second.first!=iter->second.second && iter->second.first- │ │ │ │ │ +>localIndexPair().global()second.first); │ │ │ │ │ +1759 │ │ │ │ │ +1760 // move to attribute or bigger │ │ │ │ │ +1761 while(iter->second.first!=iter->second.second │ │ │ │ │ +1762 && iter->second.first->localIndexPair().global()==index │ │ │ │ │ +1763 && iter->second.first->localIndexPair().local().attribute()second.first); │ │ │ │ │ +1765 │ │ │ │ │ +1766 // erase from the map if there are no more entries. │ │ │ │ │ +1767 if(iter->second.first == iter->second.second) │ │ │ │ │ +1768 map_.erase(iter++); │ │ │ │ │ +1769 else{ │ │ │ │ │ +1770 ++iter; │ │ │ │ │ +1771 } │ │ │ │ │ +1772 } │ │ │ │ │ +1773 index_=index; │ │ │ │ │ +1774 attribute_=attribute; │ │ │ │ │ +1775 noattribute=false; │ │ │ │ │ +1776 } │ │ │ │ │ +1777 │ │ │ │ │ +1778 template │ │ │ │ │ +_1_7_7_9 inline _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>& _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +1780 { │ │ │ │ │ +1781 const auto end = map_._e_n_d(); │ │ │ │ │ +1782 │ │ │ │ │ +1783 for(auto iter = map_.begin(); iter != end;) { │ │ │ │ │ +1784 // Step the iterator until we are >= index │ │ │ │ │ +1785 auto current = iter->second.first; │ │ │ │ │ +1786 auto rend = iter->second.second; │ │ │ │ │ +1787 │ │ │ │ │ +1788 // move all iterators pointing to the current global index to next value │ │ │ │ │ +1789 if(iter->second.first->localIndexPair().global()==index_ && │ │ │ │ │ +1790 (noattribute || iter->second.first->localIndexPair().local().attribute() │ │ │ │ │ +== attribute_)) │ │ │ │ │ +1791 ++(iter->second.first); │ │ │ │ │ +1792 │ │ │ │ │ +1793 // erase from the map if there are no more entries. │ │ │ │ │ +1794 if(iter->second.first == iter->second.second) │ │ │ │ │ +1795 map_.erase(iter++); │ │ │ │ │ +1796 else{ │ │ │ │ │ +1797 ++iter; │ │ │ │ │ +1798 } │ │ │ │ │ +1799 } │ │ │ │ │ +1800 return *this; │ │ │ │ │ +1801 } │ │ │ │ │ +1802 │ │ │ │ │ +1803 template │ │ │ │ │ +_1_8_0_4 inline bool _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_e_m_p_t_y() const │ │ │ │ │ +1805 { │ │ │ │ │ +1806 return map_.empty(); │ │ │ │ │ +1807 } │ │ │ │ │ +1808 │ │ │ │ │ +1809 template │ │ │ │ │ +1810 inline typename _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +_1_8_1_1 _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_b_e_g_i_n() │ │ │ │ │ +1812 { │ │ │ │ │ +1813 if(noattribute) │ │ │ │ │ +1814 return _i_t_e_r_a_t_o_r(map_.begin(), map_.end(), index_); │ │ │ │ │ +1815 else │ │ │ │ │ +1816 return _i_t_e_r_a_t_o_r(map_.begin(), map_.end(), index_, │ │ │ │ │ +1817 attribute_); │ │ │ │ │ +1818 } │ │ │ │ │ +1819 │ │ │ │ │ +1820 template │ │ │ │ │ +1821 inline typename _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +_1_8_2_2 _C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_<_T_,_A_>_:_:_e_n_d() │ │ │ │ │ +1823 { │ │ │ │ │ +1824 return _i_t_e_r_a_t_o_r(map_.end(), map_.end(), index_); │ │ │ │ │ +1825 } │ │ │ │ │ +1826 │ │ │ │ │ +1827 template │ │ │ │ │ +_1_8_2_8 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const │ │ │ │ │ +_R_e_m_o_t_e_I_n_d_e_x_<_T_G_,_T_A_>& index) │ │ │ │ │ +1829 { │ │ │ │ │ +1830 os<<"[global="< │ │ │ │ │ +_1_8_3_5 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const │ │ │ │ │ +_R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_>& indices) │ │ │ │ │ +1836 { │ │ │ │ │ +1837 int rank; │ │ │ │ │ +1838 MPI_Comm_rank(indices.comm_, &rank); │ │ │ │ │ +1839 const auto rend = indices.remoteIndices_.end(); │ │ │ │ │ +1840 │ │ │ │ │ +1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) │ │ │ │ │ +{ │ │ │ │ │ +1842 os<first<<":"; │ │ │ │ │ +1843 │ │ │ │ │ +1844 if(!rindex->second.first->empty()) { │ │ │ │ │ +1845 os<<" send:"; │ │ │ │ │ +1846 │ │ │ │ │ +1847 const auto send= rindex->second.first->end(); │ │ │ │ │ +1848 │ │ │ │ │ +1849 for(auto index = rindex->second.first->begin(); │ │ │ │ │ +1850 index != send; ++index) │ │ │ │ │ +1851 os<<*index<<" "; │ │ │ │ │ +1852 os<second.second->empty()) { │ │ │ │ │ +1855 os<first<<": "<<"receive: "; │ │ │ │ │ +1856 │ │ │ │ │ +1857 for(const auto& index : *(rindex->second.second)) │ │ │ │ │ +1858 os << index << " "; │ │ │ │ │ +1859 } │ │ │ │ │ +1860 os<_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +SLListConstIterator< RemoteIndex, Allocator > const_iterator │ │ │ │ │ +The constant iterator of the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_<_ _G_l_o_b_a_l_I_n_d_e_x_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SLListModifyIterator< GlobalIndex, Allocator > ModifyIterator │ │ │ │ │ +The type of the iterator capable of deletion and insertion. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Get an iterator pointing to the first element in the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:762 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Get an iterator over the indices positioned at the first index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +Get an iterator over the indices positioned after the last index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +TL LocalIndex │ │ │ │ │ +The type of the local index, e.g. ParallelLocalIndex. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_g_l_o_b_a_l │ │ │ │ │ +const GlobalIndex & global() const │ │ │ │ │ +Get the global index. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r_:_:_l_o_c_a_l │ │ │ │ │ +LocalIndex & local() │ │ │ │ │ +Get the local index. │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ +sorting. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_G_R_O_U_N_D │ │ │ │ │ +@ GROUND │ │ │ │ │ +The default mode. Indicates that the index set is ready to be used. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_d_v_v_e_r_b │ │ │ │ │ +DVVerbType dvverb(std::cout) │ │ │ │ │ +stream for very verbose output. │ │ │ │ │ +DDeeffiinniittiioonn stdstreams.hh:95 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_a_n_y___t_r_u_e │ │ │ │ │ -bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_a_l_l___t_r_u_e │ │ │ │ │ -bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x │ │ │ │ │ -typename SimdIndexTypeTraits< V >::type SimdIndex │ │ │ │ │ -An simd vector of indices corresponding to a simd vector V. │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r │ │ │ │ │ -typename SimdScalarTypeTraits< T >::type SimdScalar │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_M_a_s_k │ │ │ │ │ -typename SimdMaskTypeTraits< V >::type SimdMask │ │ │ │ │ -A simd vector of truth values corresponding to a simd vector V. │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_l_a_n_e │ │ │ │ │ -T lane(std::size_t l, const T &v) │ │ │ │ │ -access a lane of a simd vector (scalar version) │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_s_w_a_p │ │ │ │ │ -void swap(T &v1, T &v2, bool mask) │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:472 │ │ │ │ │ -_D_u_n_e_:_:_a_s_s_i_g_n │ │ │ │ │ -void assign(T &dst, const T &src, bool mask) │ │ │ │ │ -masked Simd assignment (scalar version) │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:447 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_d │ │ │ │ │ -const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ -conditional evaluate │ │ │ │ │ -DDeeffiinniittiioonn conditional.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_m_a_x___v_a_l_u_e │ │ │ │ │ -T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_m_i_n___v_a_l_u_e │ │ │ │ │ -T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_l_a_n_e_s │ │ │ │ │ -std::size_t lanes(const T &) │ │ │ │ │ -get the number of lanes of a simd vector (scalar version) │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:362 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -aligned wrappers for arithmetic types │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ -T type │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_S_c_a_l_a_r_T_y_p_e_T_r_a_i_t_s_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -T type │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:234 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_I_n_d_e_x_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ -std::size_t type │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:235 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_M_a_s_k_T_y_p_e_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ -bool type │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:262 │ │ │ │ │ -_v_c_._h_h │ │ │ │ │ -SIMD abstractions for Vc. │ │ │ │ │ -_D_U_N_E___S_I_M_D___V_C___A_S_S_I_G_N_M_E_N_T │ │ │ │ │ -#define DUNE_SIMD_VC_ASSIGNMENT(OP) │ │ │ │ │ -DDeeffiinniittiioonn simd/vc.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s │ │ │ │ │ +A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_g_e_t_T_y_p_e │ │ │ │ │ +static MPI_Datatype getType() │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ +Default exception class for range errors. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +A pair consisting of a global and local index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_I_n_d_e_x_S_e_t_S_t_a_t_e │ │ │ │ │ +Exception indicating that the index set is not in the expected state. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Manager class for the mapping between local indices and globally unique │ │ │ │ │ +indices. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r │ │ │ │ │ +Class for recomputing missing indices of a distributed index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_I_n_t_e_r_f_a_c_e_B_u_i_l_d_e_r │ │ │ │ │ +Base class of all classes representing a communication interface. │ │ │ │ │ +DDeeffiinniittiioonn parallel/interface.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +An index present on the local process with an additional attribute flag. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +The indices present on remote processes. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_g_e_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ +const std::set< int > & getNeighbours() const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex │ │ │ │ │ +Type of the remote indices we manage. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:231 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +RemoteIndices() │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:977 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s │ │ │ │ │ +friend void fillIndexSetHoles(const G &graph, Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > &oocomm) │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_s_e_t_I_n_d_e_x_S_e_t_s │ │ │ │ │ +void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet │ │ │ │ │ +&destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std:: │ │ │ │ │ +vector< int >()) │ │ │ │ │ +Set the index sets and communicator we work with. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:984 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +Free the index lists. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1429 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s │ │ │ │ │ +friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename │ │ │ │ │ +T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices< │ │ │ │ │ +T1, A1 > &, const T1 &) │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_r_e_b_u_i_l_d │ │ │ │ │ +void rebuild() │ │ │ │ │ +Rebuilds the set of remote indices. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1453 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +T ParallelIndexSet │ │ │ │ │ +Type of the index set we use, e.g. ParallelLocalIndexSet. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +MPI_Comm communicator() const │ │ │ │ │ +Get the mpi communicator used. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1696 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +LocalIndex::Attribute Attribute │ │ │ │ │ +The type of the attribute. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +CollectiveIteratorT iterator() const │ │ │ │ │ +Get an iterator for colletively iterating over the remote indices of all remote │ │ │ │ │ +processes. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1690 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_s_e_t_I_n_c_l_u_d_e_S_e_l_f │ │ │ │ │ +void setIncludeSelf(bool includeSelf) │ │ │ │ │ +Tell whether sending from indices of the processor to other indices on the same │ │ │ │ │ +processor is enabled ... │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:971 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Get an iterator over all remote index lists. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1529 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const RemoteIndices &ri) const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1536 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_R_e_m_o_t_e_I_n_d_e_x_M_a_p │ │ │ │ │ +std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > │ │ │ │ │ +RemoteIndexMap │ │ │ │ │ +The type of the map from rank to remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_s_e_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ +void setNeighbours(const C &neighbours) │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_g_e_t_M_o_d_i_f_i_e_r │ │ │ │ │ +RemoteIndexListModifier< T, A, mode > getModifier(int process) │ │ │ │ │ +Get a modifier for a remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1480 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_s_o_u_r_c_e_I_n_d_e_x_S_e_t │ │ │ │ │ +const ParallelIndexSet & sourceIndexSet() const │ │ │ │ │ +Get the index set at the source. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:999 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_~_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +~RemoteIndices() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1014 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t │ │ │ │ │ +Dune::SLList< RemoteIndex, Allocator > RemoteIndexList │ │ │ │ │ +The type of the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_n_e_i_g_h_b_o_u_r_s │ │ │ │ │ +int neighbours() const │ │ │ │ │ +Get the number of processors we share indices with. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1446 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +CollectiveIterator< T, A > CollectiveIteratorT │ │ │ │ │ +The type of the collective iterator over all remote indices. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_d_e_s_t_i_n_a_t_i_o_n_I_n_d_e_x_S_e_t │ │ │ │ │ +const ParallelIndexSet & destinationIndexSet() const │ │ │ │ │ +Get the index set at destination. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1007 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > │ │ │ │ │ +Allocator │ │ │ │ │ +The type of the allocator for the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_f_i_n_d │ │ │ │ │ +const_iterator find(int proc) const │ │ │ │ │ +Find an iterator over the remote index lists of a specific process. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1515 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_i_s_S_y_n_c_e_d │ │ │ │ │ +bool isSynced() const │ │ │ │ │ +Checks whether the remote indices are synced with the indexsets. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1473 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Get an iterator over all remote index lists. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1522 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +RemoteIndexMap::const_iterator const_iterator │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:247 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +Information about an index residing on another processor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ +const Attribute attribute() const │ │ │ │ │ +Get the attribute of the index on the remote process. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:946 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s │ │ │ │ │ +friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename │ │ │ │ │ +T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, │ │ │ │ │ +A1 > &, const T &) │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const RemoteIndex &ri) const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:934 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +T1 GlobalIndex │ │ │ │ │ +the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ +sorting. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +T2 Attribute │ │ │ │ │ +The type of the attributes. Normally this will be an enumeration like. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_P_a_i_r_T_y_p_e │ │ │ │ │ +IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType │ │ │ │ │ +The type of the index pair. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_l_o_c_a_l_I_n_d_e_x_P_a_i_r │ │ │ │ │ +const PairType & localIndexPair() const │ │ │ │ │ +Get the corresponding local index pair. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:952 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +RemoteIndex() │ │ │ │ │ +Parameterless Constructor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:930 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const RemoteIndex &ri) const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:940 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r │ │ │ │ │ +Modifier for adding and/or deleting remote indices from the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:551 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s │ │ │ │ │ +void repairLocalIndexPointers() │ │ │ │ │ +Repair the pointers to the local index pairs. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1575 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t │ │ │ │ │ +Dune::SLList< RemoteIndex, Allocator > RemoteIndexList │ │ │ │ │ +The type of the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:602 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +A Allocator │ │ │ │ │ +The type of the allocator for the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(const RemoteIndex &index) │ │ │ │ │ +Insert an index to the list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1605 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:578 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +RemoteIndexList::const_iterator ConstIterator │ │ │ │ │ +The type of the remote index list iterator. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:612 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator │ │ │ │ │ +The type of the modifying iterator of the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:607 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_r_e_m_o_v_e │ │ │ │ │ +bool remove(const GlobalIndex &global) │ │ │ │ │ +Remove a remote index. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1653 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +T ParallelIndexSet │ │ │ │ │ +Type of the index set we use. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:573 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r │ │ │ │ │ +RemoteIndexListModifier() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:676 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +LocalIndex::Attribute Attribute │ │ │ │ │ +The type of the attribute. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:588 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex │ │ │ │ │ +Type of the remote indices we manage. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:593 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_M_O_D_I_F_Y_I_N_D_E_X_S_E_T │ │ │ │ │ +static constexpr bool MODIFYINDEXSET │ │ │ │ │ +If true the index set corresponding to the remote indices might get modified. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r │ │ │ │ │ +A collective iterator for moving over the remote indices for all processes │ │ │ │ │ +collectively. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:708 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +CollectiveIterator & operator++() │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1779 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1822 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r │ │ │ │ │ +CollectiveIterator(const RemoteIndexMap &map_, bool send) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1703 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_e_m_p_t_y │ │ │ │ │ +bool empty() const │ │ │ │ │ +Checks whether there are still iterators in the map. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1804 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +void advance(const GlobalIndex &global) │ │ │ │ │ +Advances all underlying iterators. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1716 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_R_e_m_o_t_e_I_n_d_e_x_M_a_p │ │ │ │ │ +std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > │ │ │ │ │ +RemoteIndexMap │ │ │ │ │ +The type of the map from rank to remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:748 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1811 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_M_o_d_i_f_i_e_r_:_:_I_n_v_a_l_i_d_P_o_s_i_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:558 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator over the valid underlying iterators. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:792 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex │ │ │ │ │ +&index) │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:799 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +iterator(const iterator &other) │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:817 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +const RemoteIndex & operator*() const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:838 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_C_o_n_s_t_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Map::iterator ConstRealIterator │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:795 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +iterator & operator++() │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:822 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ +const RemoteIndex * operator->() const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:850 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const iterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:856 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_p_r_o_c_e_s_s │ │ │ │ │ +int process() const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:844 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex │ │ │ │ │ +index, Attribute attribute) │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:807 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const iterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:862 │ │ │ │ │ +_D_u_n_e_:_:_C_o_l_l_e_c_t_i_v_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Map::iterator RealIterator │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:794 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +A constant iterator for the SLList. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ +A mutable iterator for the SLList. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:429 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t │ │ │ │ │ +A single linked list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:44 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: bitsetvector.hh File Reference │ │ │ │ +dune-common: indicessyncer.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,65 +65,86 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
bitsetvector.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <vector>
│ │ │ │ -#include <bitset>
│ │ │ │ -#include <iostream>
│ │ │ │ +
#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 <dune/common/boundschecking.hh>
│ │ │ │ -#include <dune/common/genericiterator.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <map>
│ │ │ │ +#include <tuple>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::BitSetVectorConstReference< block_size, Alloc >
 A proxy class that acts as a const reference to a single bitset in a BitSetVector. More...
 
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::const_reference< BitSetVectorReference< block_size, Alloc > >
 
struct  Dune::const_reference< BitSetVectorConstReference< block_size, Alloc > >
 
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...
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.
 
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.
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,48 +1,77 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bitsetvector.hh File Reference │ │ │ │ │ -Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +indicessyncer.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n » _P_a_r_a_l_l_e_l_ _C_o_m_p_u_t_i_n_g_ _b_a_s_e_d_ _o_n_ _I_n_d_e_x_s_e_t_s │ │ │ │ │ +Class for adding missing indices of a distributed index set in a local │ │ │ │ │ +communication. _M_o_r_e_._._. │ │ │ │ │ +#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +#include "_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_l_l_i_s_t_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _> │ │ │ │ │ -  A proxy class that acts as a const reference to a single bitset in a │ │ │ │ │ - _B_i_t_S_e_t_V_e_c_t_o_r. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _> │ │ │ │ │ -  A proxy class that acts as a mutable reference to a single bitset in a │ │ │ │ │ - _B_i_t_S_e_t_V_e_c_t_o_r. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _> │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c │ │ │ │ │ - _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ -  A dynamic array of blocks of booleans. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_<_ _T_ _> │ │ │ │ │ +  Class for recomputing missing indices of a distributed index set. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const _I_n_d_e_x_P_a_i_r< TG, _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i1, │ │ │ │ │ + const std::pair< TG, TA > &i2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const std::pair< TG, TA > &i1, const _I_n_d_e_x_P_a_i_r< TG, │ │ │ │ │ + _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _I_n_d_e_x_P_a_i_r< TG, _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i1, │ │ │ │ │ + const std::pair< TG, TA > &i2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _I_n_d_e_x_P_a_i_r< TG, _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i1, │ │ │ │ │ + const std::pair< TG, TA > &i2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const std::pair< TG, TA > &i2, const _I_n_d_e_x_P_a_i_r< TG, │ │ │ │ │ + _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i1) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const std::pair< TG, TA > &i2, const _I_n_d_e_x_P_a_i_r< TG, │ │ │ │ │ + _P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x< TA > > &i1) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_s_t_o_r_e_G_l_o_b_a_l_I_n_d_i_c_e_s_O_f_R_e_m_o_t_e_I_n_d_i_c_e_s (std::map< int, _S_L_L_i_s_t< std:: │ │ │ │ │ + pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > │ │ │ │ │ + &globalMap, const _R_e_m_o_t_e_I_n_d_i_c_e_s< T, A1 > &remoteIndices) │ │ │ │ │ +  Stores the corresponding global indices of the remote index information. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s (std::map< int, _S_L_L_i_s_t< std::pair< │ │ │ │ │ + typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > │ │ │ │ │ + &globalMap, _R_e_m_o_t_e_I_n_d_i_c_e_s< T, A1 > &remoteIndices, const T &indexSet) │ │ │ │ │ +  Repair the pointers to the local indices in the remote indices. │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ +Class for adding missing indices of a distributed index set in a local │ │ │ │ │ +communication. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: bitsetvector.hh Source File │ │ │ │ +dune-common: indicessyncer.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,791 +70,1051 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
bitsetvector.hh
│ │ │ │ +
indicessyncer.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_BLOCK_BITFIELD_HH
│ │ │ │ -
6#define DUNE_BLOCK_BITFIELD_HH
│ │ │ │ +
5#ifndef DUNE_INDICESSYNCER_HH
│ │ │ │ +
6#define DUNE_INDICESSYNCER_HH
│ │ │ │
7
│ │ │ │ -
12#include <vector>
│ │ │ │ -
13#include <bitset>
│ │ │ │ -
14#include <iostream>
│ │ │ │ +
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
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
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>;
│ │ │ │ +
16#include <functional>
│ │ │ │ +
17#include <map>
│ │ │ │ +
18#include <tuple>
│ │ │ │ +
19
│ │ │ │ +
20#if HAVE_MPI
│ │ │ │ +
21namespace Dune
│ │ │ │ +
22{
│ │ │ │ +
39 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
41 {
│ │ │ │ +
42 public:
│ │ │ │
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 public:
│ │ │ │ + │ │ │ │ +
46
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ + │ │ │ │ +
52
│ │ │ │ +
54 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
│ │ │ │
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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 }
│ │ │ │ -
│ │ │ │ + │ │ │ │ +
60
│ │ │ │ + │ │ │ │ +
71 RemoteIndices& remoteIndices);
│ │ │ │ +
72
│ │ │ │ +
82 void sync();
│ │ │ │ +
83
│ │ │ │ +
94 template<typename T1>
│ │ │ │ +
95 void sync(T1& numberer);
│ │ │ │ +
96
│ │ │ │ +
97 private:
│ │ │ │ +
98
│ │ │ │ +
100 ParallelIndexSet& indexSet_;
│ │ │ │
101
│ │ │ │ -
│ │ │ │ -
103 bool any() const
│ │ │ │ -
104 {
│ │ │ │ -
105 return count();
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ +
103 RemoteIndices& remoteIndices_;
│ │ │ │ +
104
│ │ │ │ +
106 char** sendBuffers_;
│ │ │ │
107
│ │ │ │ -
│ │ │ │ -
109 bool none() const
│ │ │ │ -
110 {
│ │ │ │ -
111 return ! any();
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ +
109 char* receiveBuffer_;
│ │ │ │ +
110
│ │ │ │ +
112 std::size_t* sendBufferSizes_;
│ │ │ │
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 }
│ │ │ │ -
│ │ │ │ +
115 int receiveBufferSize_; // int because of MPI
│ │ │ │ +
116
│ │ │ │ +
120 struct MessageInformation
│ │ │ │ +
121 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
123 : publish(), pairs()
│ │ │ │ +
124 {}
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
131 int pairs;
│ │ │ │ +
132 };
│ │ │ │ +
133
│ │ │ │ +
137 class DefaultNumberer
│ │ │ │ +
138 {
│ │ │ │ +
139 public:
│ │ │ │ +
145 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
│ │ │ │ +
146 {
│ │ │ │ +
147 return std::numeric_limits<size_t>::max();
│ │ │ │ +
148 }
│ │ │ │ +
149 };
│ │ │ │ +
150
│ │ │ │ +
152 MPI_Datatype datatype_;
│ │ │ │ +
153
│ │ │ │ +
155 int rank_;
│ │ │ │ +
156
│ │ │ │ +
161 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
│ │ │ │ +
162
│ │ │ │ +
164 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
│ │ │ │ +
165
│ │ │ │ + │ │ │ │ +
170 GlobalIndexIterator;
│ │ │ │ +
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
│ │ │ │ -
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:
│ │ │ │ +
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;
│ │ │ │ +
215
│ │ │ │ + │ │ │ │ +
218
│ │ │ │ +
220 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
│ │ │ │ +
221
│ │ │ │ +
223 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
│ │ │ │
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 }
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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.
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ -
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 }
│ │ │ │ -
│ │ │ │ +
331 typedef std::map<int,Iterators> IteratorsMap;
│ │ │ │ +
332
│ │ │ │ +
344 IteratorsMap iteratorsMap_;
│ │ │ │ +
345
│ │ │ │ +
347 void calculateMessageSizes();
│ │ │ │
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 }
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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 }
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ - │ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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)
│ │ │ │ +
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 a ^ b;
│ │ │ │ +
434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
│ │ │ │
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 }
│ │ │ │
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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 }
│ │ │ │ +
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>
│ │ │ │
│ │ │ │ -
569 void setAll() {
│ │ │ │ -
570 this->assign(BlocklessBaseClass::size(), true);
│ │ │ │ -
571 }
│ │ │ │ -
│ │ │ │ -
572
│ │ │ │ -
│ │ │ │ -
574 void unsetAll() {
│ │ │ │ -
575 this->assign(BlocklessBaseClass::size(), false);
│ │ │ │ -
576 }
│ │ │ │ -
│ │ │ │ -
577
│ │ │ │ + │ │ │ │ +
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 reference(*this, i);
│ │ │ │ -
582 }
│ │ │ │ + │ │ │ │ +
580 {
│ │ │ │ +
581 return *(std::get<0>(iterators_));
│ │ │ │ +
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
│ │ │ │ +
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#endif
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ +
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
│ │ │ │ +
Provides a map between global and local indices.
│ │ │ │ +
Classes describing a distributed indexset.
│ │ │ │ +
Standard Dune debug streams.
│ │ │ │ +
Implements a singly linked list together with the necessary iterators.
│ │ │ │ +
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
│ │ │ │ +
Iterators()
Default constructor.
Definition indicessyncer.hh:555
│ │ │ │ +
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
Type of the remote indices.
Definition indicessyncer.hh:59
│ │ │ │ +
bool isOld() const
Was this entry already in the remote index list before the sync process?
Definition indicessyncer.hh:592
│ │ │ │ +
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
│ │ │ │ +
bool isAtEnd() const
Are we at the end of the list?
Definition indicessyncer.hh:614
│ │ │ │ +
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
│ │ │ │ +
Iterators & operator++()
Increment all iteraors.
Definition indicessyncer.hh:560
│ │ │ │ +
ParallelIndexSet::LocalIndex::Attribute Attribute
Type of the attribute used in the index set.
Definition indicessyncer.hh:54
│ │ │ │ +
std::pair< GlobalIndex, Attribute > & globalIndexPair() const
Get the global index of the remote index at current position.
Definition indicessyncer.hh:586
│ │ │ │ +
IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
Constructor.
Definition indicessyncer.hh:536
│ │ │ │ +
void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, BoolList &booleans)
Reset all the underlying iterators.
Definition indicessyncer.hh:598
│ │ │ │ +
std::size_t operator()(const GlobalIndex &global)
Provide the local index, always std::numeric_limits<size_t>::max()
Definition indicessyncer.hh:145
│ │ │ │ +
T ParallelIndexSet
The type of the index set.
Definition indicessyncer.hh:45
│ │ │ │ +
bool isNotAtEnd() const
Are we not at the end of the list?
Definition indicessyncer.hh:608
│ │ │ │ +
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
│ │ │ │ +
RemoteIndex & remoteIndex() const
Get the remote index at current position.
Definition indicessyncer.hh:579
│ │ │ │ +
MessageInformation()
Definition indicessyncer.hh:122
│ │ │ │ +
void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute > &global)
Insert a new remote index to the underlying remote index list.
Definition indicessyncer.hh:569
│ │ │ │ +
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
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const BitSetVectorConstReference &v)
Definition bitsetvector.hh:171
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,936 +1,1204 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -bitsetvector.hh │ │ │ │ │ + * _p_a_r_a_l_l_e_l │ │ │ │ │ +indicessyncer.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_BLOCK_BITFIELD_HH │ │ │ │ │ -6#define DUNE_BLOCK_BITFIELD_HH │ │ │ │ │ +5#ifndef DUNE_INDICESSYNCER_HH │ │ │ │ │ +6#define DUNE_INDICESSYNCER_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ +8#include "_i_n_d_e_x_s_e_t_._h_h" │ │ │ │ │ +9#include "_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h" │ │ │ │ │ +10#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_s_t_r_e_a_m_s_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_l_l_i_s_t_._h_h> │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ 15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_c_o_m_m_o_n_/_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22 │ │ │ │ │ -23 template class BitSetVector; │ │ │ │ │ -24 template class BitSetVectorReference; │ │ │ │ │ -25 │ │ │ │ │ -36 template │ │ │ │ │ -_3_7 class _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e │ │ │ │ │ -38 { │ │ │ │ │ -39 protected: │ │ │ │ │ -40 │ │ │ │ │ -_4_1 typedef _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_<_b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_> _B_i_t_S_e_t_V_e_c_t_o_r; │ │ │ │ │ -42 friend class _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r; │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20#if HAVE_MPI │ │ │ │ │ +21namespace _D_u_n_e │ │ │ │ │ +22{ │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 class _I_n_d_i_c_e_s_S_y_n_c_e_r │ │ │ │ │ +41 { │ │ │ │ │ +42 public: │ │ │ │ │ 43 │ │ │ │ │ -_4_4 _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e(const _B_i_t_S_e_t_V_e_c_t_o_r& blockBitField_, int │ │ │ │ │ -block_number_) : │ │ │ │ │ -45 _b_l_o_c_k_B_i_t_F_i_e_l_d(blockBitField_), │ │ │ │ │ -46 _b_l_o_c_k___n_u_m_b_e_r(block_number_) │ │ │ │ │ -47 { │ │ │ │ │ -48 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(blockBitField_._s_i_z_e() > static_cast │ │ │ │ │ -(block_number_)); │ │ │ │ │ -49 } │ │ │ │ │ -50 │ │ │ │ │ -_5_2 _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e& _o_p_e_r_a_t_o_r_=(const _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e & b); │ │ │ │ │ -53 │ │ │ │ │ -54 public: │ │ │ │ │ +_4_5 typedef T _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +46 │ │ │ │ │ +_4_8 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_I_n_d_e_x_P_a_i_r _I_n_d_e_x_P_a_i_r; │ │ │ │ │ +49 │ │ │ │ │ +_5_1 typedef typename _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +52 │ │ │ │ │ +_5_4 typedef typename ParallelIndexSet::LocalIndex::Attribute _A_t_t_r_i_b_u_t_e; │ │ │ │ │ 55 │ │ │ │ │ -_5_6 typedef std::bitset _b_i_t_s_e_t; │ │ │ │ │ -57 │ │ │ │ │ -58 // bitset interface typedefs │ │ │ │ │ -_5_9 typedef typename std::vector::const_reference _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_0 typedef typename std::vector::const_reference _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_1 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -62 │ │ │ │ │ -_6_4 _b_i_t_s_e_t _o_p_e_r_a_t_o_r_<_<(_s_i_z_e___t_y_p_e n) const │ │ │ │ │ -65 { │ │ │ │ │ -66 _b_i_t_s_e_t b = *this; │ │ │ │ │ -67 b <<= n; │ │ │ │ │ -68 return b; │ │ │ │ │ -69 } │ │ │ │ │ -70 │ │ │ │ │ -_7_2 _b_i_t_s_e_t _o_p_e_r_a_t_o_r_>_>(_s_i_z_e___t_y_p_e n) const │ │ │ │ │ -73 { │ │ │ │ │ -74 _b_i_t_s_e_t b = *this; │ │ │ │ │ -75 b >>= n; │ │ │ │ │ -76 return b; │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -_8_0 _b_i_t_s_e_t _o_p_e_r_a_t_o_r_~() const │ │ │ │ │ -81 { │ │ │ │ │ -82 _b_i_t_s_e_t b = *this; │ │ │ │ │ -83 b.flip(); │ │ │ │ │ -84 return b; │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -_8_8 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -89 { │ │ │ │ │ -90 return block_size; │ │ │ │ │ -91 } │ │ │ │ │ -92 │ │ │ │ │ -_9_4 _s_i_z_e___t_y_p_e _c_o_u_n_t() const │ │ │ │ │ -95 { │ │ │ │ │ -96 _s_i_z_e___t_y_p_e n = 0; │ │ │ │ │ -97 for(_s_i_z_e___t_y_p_e i=0; i _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ +60 │ │ │ │ │ +70 _I_n_d_i_c_e_s_S_y_n_c_e_r(_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet, │ │ │ │ │ +71 _R_e_m_o_t_e_I_n_d_i_c_e_s& remoteIndices); │ │ │ │ │ +72 │ │ │ │ │ +82 void _s_y_n_c(); │ │ │ │ │ +83 │ │ │ │ │ +94 template │ │ │ │ │ +95 void _s_y_n_c(T1& numberer); │ │ │ │ │ +96 │ │ │ │ │ +97 private: │ │ │ │ │ +98 │ │ │ │ │ +100 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet_; │ │ │ │ │ 101 │ │ │ │ │ -_1_0_3 bool _a_n_y() const │ │ │ │ │ -104 { │ │ │ │ │ -105 return _c_o_u_n_t(); │ │ │ │ │ -106 } │ │ │ │ │ +103 _R_e_m_o_t_e_I_n_d_i_c_e_s& remoteIndices_; │ │ │ │ │ +104 │ │ │ │ │ +106 char** sendBuffers_; │ │ │ │ │ 107 │ │ │ │ │ -_1_0_9 bool _n_o_n_e() const │ │ │ │ │ -110 { │ │ │ │ │ -111 return ! _a_n_y(); │ │ │ │ │ -112 } │ │ │ │ │ +109 char* receiveBuffer_; │ │ │ │ │ +110 │ │ │ │ │ +112 std::size_t* sendBufferSizes_; │ │ │ │ │ 113 │ │ │ │ │ -_1_1_5 bool _a_l_l() const │ │ │ │ │ -116 { │ │ │ │ │ -117 for(_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_1_9_0 bool _e_q_u_a_l_s(const BS & bs) const │ │ │ │ │ -191 { │ │ │ │ │ -192 bool eq = true; │ │ │ │ │ -193 for(int i=0; i::max(); │ │ │ │ │ +148 } │ │ │ │ │ +149 }; │ │ │ │ │ +150 │ │ │ │ │ +152 MPI_Datatype datatype_; │ │ │ │ │ +153 │ │ │ │ │ +155 int rank_; │ │ │ │ │ +156 │ │ │ │ │ +161 typedef _S_L_L_i_s_t_<_s_t_d_:_:_p_a_i_r_<_G_l_o_b_a_l_I_n_d_e_x_,_A_t_t_r_i_b_u_t_e_>, typename _R_e_m_o_t_e_I_n_d_i_c_e_s_:_: │ │ │ │ │ +_A_l_l_o_c_a_t_o_r> GlobalIndexList; │ │ │ │ │ +162 │ │ │ │ │ +164 typedef typename _G_l_o_b_a_l_I_n_d_e_x_L_i_s_t_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r GlobalIndexModifier; │ │ │ │ │ +165 │ │ │ │ │ +169 typedef typename _S_L_L_i_s_t_<_G_l_o_b_a_l_I_n_d_e_x_,_ _t_y_p_e_n_a_m_e_ _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_l_l_o_c_a_t_o_r_>_:_: │ │ │ │ │ +_i_t_e_r_a_t_o_r │ │ │ │ │ +170 GlobalIndexIterator; │ │ │ │ │ +171 │ │ │ │ │ +173 typedef std::map GlobalIndicesMap; │ │ │ │ │ +174 │ │ │ │ │ +183 GlobalIndicesMap globalMap_; │ │ │ │ │ +184 │ │ │ │ │ +188 typedef _S_L_L_i_s_t_<_b_o_o_l_,_ _t_y_p_e_n_a_m_e_ _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_l_l_o_c_a_t_o_r_> BoolList; │ │ │ │ │ +189 │ │ │ │ │ +193 typedef typename _B_o_o_l_L_i_s_t_:_:_i_t_e_r_a_t_o_r BoolIterator; │ │ │ │ │ +194 │ │ │ │ │ +196 typedef typename _B_o_o_l_L_i_s_t_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r BoolListModifier; │ │ │ │ │ 197 │ │ │ │ │ -198 private: │ │ │ │ │ -_2_0_3 void operator & () = delete; │ │ │ │ │ -204 │ │ │ │ │ -205 friend class _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e; │ │ │ │ │ -206 }; │ │ │ │ │ -207 │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 class _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e : public │ │ │ │ │ -_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e │ │ │ │ │ -222 { │ │ │ │ │ -223 protected: │ │ │ │ │ +199 typedef std::map BoolMap; │ │ │ │ │ +200 │ │ │ │ │ +205 BoolMap oldMap_; │ │ │ │ │ +206 │ │ │ │ │ +208 std::map infoSend_; │ │ │ │ │ +209 │ │ │ │ │ +211 typedef typename _R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t RemoteIndexList; │ │ │ │ │ +212 │ │ │ │ │ +214 typedef typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r RemoteIndexModifier; │ │ │ │ │ +215 │ │ │ │ │ +217 typedef _D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x_<_G_l_o_b_a_l_I_n_d_e_x_,_A_t_t_r_i_b_u_t_e_> _R_e_m_o_t_e_I_n_d_e_x; │ │ │ │ │ +218 │ │ │ │ │ +220 typedef typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_i_t_e_r_a_t_o_r RemoteIndexIterator; │ │ │ │ │ +221 │ │ │ │ │ +223 typedef typename _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r ConstRemoteIndexIterator; │ │ │ │ │ 224 │ │ │ │ │ -_2_2_5 typedef _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_<_b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_> _B_i_t_S_e_t_V_e_c_t_o_r; │ │ │ │ │ -226 friend class _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r; │ │ │ │ │ -227 │ │ │ │ │ -_2_2_8 typedef _D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_> │ │ │ │ │ -_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e; │ │ │ │ │ -229 │ │ │ │ │ -_2_3_0 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e(_B_i_t_S_e_t_V_e_c_t_o_r& blockBitField_, int block_number_) : │ │ │ │ │ -231 _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e(blockBitField_, block_number_), │ │ │ │ │ -232 _b_l_o_c_k_B_i_t_F_i_e_l_d(blockBitField_) │ │ │ │ │ -233 {} │ │ │ │ │ -234 │ │ │ │ │ -235 public: │ │ │ │ │ -_2_3_6 typedef std::bitset _b_i_t_s_e_t; │ │ │ │ │ -237 │ │ │ │ │ -_2_4_1 typedef typename std::vector::reference _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_2_4_3 typedef typename std::vector::const_reference _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -245 │ │ │ │ │ -_2_4_7 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -248 │ │ │ │ │ -_2_5_0 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _o_p_e_r_a_t_o_r_=(bool b) │ │ │ │ │ -251 { │ │ │ │ │ -252 for(int i=0; i IteratorTuple; │ │ │ │ │ +228 │ │ │ │ │ +236 class Iterators │ │ │ │ │ +237 { │ │ │ │ │ +238 friend class _I_n_d_i_c_e_s_S_y_n_c_e_r; │ │ │ │ │ +239 public: │ │ │ │ │ +249 _I_t_e_r_a_t_o_r_s(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices, │ │ │ │ │ +250 BoolList& booleans); │ │ │ │ │ +251 │ │ │ │ │ +255 _I_t_e_r_a_t_o_r_s(); │ │ │ │ │ 256 │ │ │ │ │ -_2_5_8 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _o_p_e_r_a_t_o_r_=(const _b_i_t_s_e_t & b) │ │ │ │ │ -259 { │ │ │ │ │ -260 for(int i=0; i& global); │ │ │ │ │ +269 │ │ │ │ │ +274 _R_e_m_o_t_e_I_n_d_e_x& _r_e_m_o_t_e_I_n_d_e_x() const; │ │ │ │ │ +275 │ │ │ │ │ +280 std::pair& _g_l_o_b_a_l_I_n_d_e_x_P_a_i_r() const; │ │ │ │ │ +281 │ │ │ │ │ +_2_8_2 _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e() const; │ │ │ │ │ +283 │ │ │ │ │ +289 bool _i_s_O_l_d() const; │ │ │ │ │ +290 │ │ │ │ │ +300 void _r_e_s_e_t(_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& remoteIndices, _G_l_o_b_a_l_I_n_d_e_x_L_i_s_t& globalIndices, │ │ │ │ │ +301 _B_o_o_l_L_i_s_t& booleans); │ │ │ │ │ +302 │ │ │ │ │ +308 bool _i_s_N_o_t_A_t_E_n_d() const; │ │ │ │ │ +309 │ │ │ │ │ +315 bool _i_s_A_t_E_n_d() const; │ │ │ │ │ +316 │ │ │ │ │ +317 private: │ │ │ │ │ +327 IteratorTuple iterators_; │ │ │ │ │ +328 }; │ │ │ │ │ 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 │ │ │ │ │ -_3_4_0 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _o_p_e_r_a_t_o_r_^_=(const _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e& x) │ │ │ │ │ -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 (_s_i_z_e___t_y_p_e i=0; i IteratorsMap; │ │ │ │ │ +332 │ │ │ │ │ +344 IteratorsMap iteratorsMap_; │ │ │ │ │ +345 │ │ │ │ │ +347 void calculateMessageSizes(); │ │ │ │ │ 348 │ │ │ │ │ -_3_5_0 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _o_p_e_r_a_t_o_r_<_<_=(_s_i_z_e___t_y_p_e n) │ │ │ │ │ -351 { │ │ │ │ │ -352 for (_s_i_z_e___t_y_p_e i=0; i_>_=(_s_i_z_e___t_y_p_e n) │ │ │ │ │ -359 { │ │ │ │ │ -360 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +363 void recvAndUnpack(T1& numberer); │ │ │ │ │ 364 │ │ │ │ │ -_3_6_6 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _s_e_t() │ │ │ │ │ -367 { │ │ │ │ │ -368 for (_s_i_z_e___t_y_p_e i=0; i& global, │ │ │ │ │ +375 char attribute); │ │ │ │ │ +376 │ │ │ │ │ +380 void resetIteratorsMap(); │ │ │ │ │ +381 │ │ │ │ │ +386 bool checkReset(); │ │ │ │ │ 387 │ │ │ │ │ -_3_8_9 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _s_e_t(_s_i_z_e___t_y_p_e n, int val = 1) │ │ │ │ │ -390 { │ │ │ │ │ -391 _g_e_t_B_i_t(n) = val; │ │ │ │ │ -392 return *this; │ │ │ │ │ -393 } │ │ │ │ │ -394 │ │ │ │ │ -_3_9_6 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _r_e_s_e_t(_s_i_z_e___t_y_p_e n) │ │ │ │ │ -397 { │ │ │ │ │ -398 _s_e_t(n, false); │ │ │ │ │ -399 return *this; │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -_4_0_3 _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e& _f_l_i_p(_s_i_z_e___t_y_p_e n) │ │ │ │ │ -404 { │ │ │ │ │ -405 _g_e_t_B_i_t(n)._f_l_i_p(); │ │ │ │ │ -406 return *this; │ │ │ │ │ -407 } │ │ │ │ │ -408 │ │ │ │ │ -409 using _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_t_e_s_t; │ │ │ │ │ -410 using BitSetVectorConstReference::operator[]; │ │ │ │ │ -411 │ │ │ │ │ -_4_1_3 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e i) │ │ │ │ │ -414 { │ │ │ │ │ -415 return _g_e_t_B_i_t(i); │ │ │ │ │ -416 } │ │ │ │ │ -417 │ │ │ │ │ -418 protected: │ │ │ │ │ -_4_1_9 _B_i_t_S_e_t_V_e_c_t_o_r& _b_l_o_c_k_B_i_t_F_i_e_l_d; │ │ │ │ │ -420 │ │ │ │ │ -421 using _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_g_e_t_B_i_t; │ │ │ │ │ +396 bool checkReset(const Iterators& iterators, _R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& rlist, │ │ │ │ │ +_G_l_o_b_a_l_I_n_d_e_x_L_i_s_t& gList, │ │ │ │ │ +397 _B_o_o_l_L_i_s_t& bList); │ │ │ │ │ +398 }; │ │ │ │ │ +399 │ │ │ │ │ +400 template │ │ │ │ │ +_4_0_1 bool _o_p_e_r_a_t_o_r_<(const _I_n_d_e_x_P_a_i_r >& i1, │ │ │ │ │ +402 const std::pair& i2) │ │ │ │ │ +403 { │ │ │ │ │ +404 return i1.global() < i2.first || │ │ │ │ │ +405 (i1.global() == i2.first && i1.local().attribute() │ │ │ │ │ +_4_0_9 bool _o_p_e_r_a_t_o_r_<(const std::pair& i1, │ │ │ │ │ +410 const _I_n_d_e_x_P_a_i_r >& i2) │ │ │ │ │ +411 { │ │ │ │ │ +412 return i1.first < i2.global() || │ │ │ │ │ +413 (i1.first == i2.global() && i1.second │ │ │ │ │ +_4_1_7 bool _o_p_e_r_a_t_o_r_=_=(const _I_n_d_e_x_P_a_i_r >& i1, │ │ │ │ │ +418 const std::pair& i2) │ │ │ │ │ +419 { │ │ │ │ │ +420 return (i1.global() == i2.first && i1.local().attribute()==i2.second); │ │ │ │ │ +421 } │ │ │ │ │ 422 │ │ │ │ │ -_4_2_3 _r_e_f_e_r_e_n_c_e _g_e_t_B_i_t(_s_i_z_e___t_y_p_e i) │ │ │ │ │ -424 { │ │ │ │ │ -425 return _b_l_o_c_k_B_i_t_F_i_e_l_d.getBit(this->_b_l_o_c_k___n_u_m_b_e_r,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) │ │ │ │ │ +423 template │ │ │ │ │ +_4_2_4 bool _o_p_e_r_a_t_o_r_!_=(const _I_n_d_e_x_P_a_i_r >& i1, │ │ │ │ │ +425 const std::pair& i2) │ │ │ │ │ +426 { │ │ │ │ │ +427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second); │ │ │ │ │ +428 } │ │ │ │ │ +429 │ │ │ │ │ +430 template │ │ │ │ │ +_4_3_1 bool _o_p_e_r_a_t_o_r_=_=(const std::pair& i2, │ │ │ │ │ +432 const _I_n_d_e_x_P_a_i_r >& i1) │ │ │ │ │ 433 { │ │ │ │ │ -434 return a ^ b; │ │ │ │ │ +434 return (i1.global() == i2.first && i1.local().attribute()==i2.second); │ │ │ │ │ 435 } │ │ │ │ │ 436 │ │ │ │ │ -440 template │ │ │ │ │ -_4_4_1 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e< _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e > │ │ │ │ │ -442 { │ │ │ │ │ -_4_4_3 typedef _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_> _t_y_p_e; │ │ │ │ │ -444 }; │ │ │ │ │ -445 │ │ │ │ │ -446 template │ │ │ │ │ -_4_4_7 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e< _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e > │ │ │ │ │ -448 { │ │ │ │ │ -_4_4_9 typedef _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_> _t_y_p_e; │ │ │ │ │ -450 }; │ │ │ │ │ -451 │ │ │ │ │ -452 template │ │ │ │ │ -_4_5_3 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e< _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e > │ │ │ │ │ -454 { │ │ │ │ │ -_4_5_5 typedef _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_> _t_y_p_e; │ │ │ │ │ -456 }; │ │ │ │ │ -457 │ │ │ │ │ -458 template │ │ │ │ │ -_4_5_9 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e< _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e > │ │ │ │ │ -460 { │ │ │ │ │ -_4_6_1 typedef _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_> _t_y_p_e; │ │ │ │ │ -462 }; │ │ │ │ │ -463 │ │ │ │ │ -467 template > │ │ │ │ │ -_4_6_8 class _B_i_t_S_e_t_V_e_c_t_o_r : private std::vector │ │ │ │ │ -469 { │ │ │ │ │ -471 typedef std::vector BlocklessBaseClass; │ │ │ │ │ -472 │ │ │ │ │ -473 public: │ │ │ │ │ -476 │ │ │ │ │ -_4_7_8 typedef std::bitset _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -479 │ │ │ │ │ -_4_8_1 typedef _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_> _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -482 │ │ │ │ │ -_4_8_4 typedef _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_> _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -485 │ │ │ │ │ -_4_8_7 typedef _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_>* _p_o_i_n_t_e_r; │ │ │ │ │ -488 │ │ │ │ │ -_4_9_0 typedef _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_>* _c_o_n_s_t___p_o_i_n_t_e_r; │ │ │ │ │ -491 │ │ │ │ │ -_4_9_3 typedef typename std::vector::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -494 │ │ │ │ │ -_4_9_6 typedef Allocator _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -498 │ │ │ │ │ -_5_0_1 typedef _D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_<_B_i_t_S_e_t_V_e_c_t_o_r_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_>, │ │ │ │ │ -_v_a_l_u_e___t_y_p_e, _r_e_f_e_r_e_n_c_e, std::ptrdiff_t, _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e> _i_t_e_r_a_t_o_r; │ │ │ │ │ -_5_0_2 typedef _D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _B_i_t_S_e_t_V_e_c_t_o_r_<_b_l_o_c_k___s_i_z_e_,_A_l_l_o_c_a_t_o_r_>, │ │ │ │ │ -const _v_a_l_u_e___t_y_p_e, _c_o_n_s_t___r_e_f_e_r_e_n_c_e, std::ptrdiff_t, _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e> │ │ │ │ │ -_c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -504 │ │ │ │ │ -_5_0_6 _i_t_e_r_a_t_o_r _b_e_g_i_n(){ │ │ │ │ │ -507 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -_5_1_1 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ -512 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -513 } │ │ │ │ │ -514 │ │ │ │ │ -_5_1_6 _i_t_e_r_a_t_o_r _e_n_d(){ │ │ │ │ │ -517 return _i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -518 } │ │ │ │ │ -519 │ │ │ │ │ -_5_2_1 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ -522 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -523 } │ │ │ │ │ +437 template │ │ │ │ │ +_4_3_8 bool _o_p_e_r_a_t_o_r_!_=(const std::pair& i2, │ │ │ │ │ +439 const _I_n_d_e_x_P_a_i_r >& i1) │ │ │ │ │ +440 { │ │ │ │ │ +441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second); │ │ │ │ │ +442 } │ │ │ │ │ +443 │ │ │ │ │ +460 template │ │ │ │ │ +_4_6_1 void _s_t_o_r_e_G_l_o_b_a_l_I_n_d_i_c_e_s_O_f_R_e_m_o_t_e_I_n_d_i_c_e_s(std::map,A> >& │ │ │ │ │ +globalMap, │ │ │ │ │ +462 const _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_1_>& remoteIndices) │ │ │ │ │ +463 { │ │ │ │ │ +464 for(auto remote = remoteIndices._b_e_g_i_n(), end =remoteIndices._e_n_d(); remote │ │ │ │ │ +!= end; ++remote) { │ │ │ │ │ +465 typedef typename _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_1_>_:_:_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t RemoteIndexList; │ │ │ │ │ +466 typedef _S_L_L_i_s_t_<_s_t_d_:_:_p_a_i_r_<_t_y_p_e_n_a_m_e_ _T_:_:_G_l_o_b_a_l_I_n_d_e_x_,_ _t_y_p_e_n_a_m_e_ _T_:_:_L_o_c_a_l_I_n_d_e_x_:_: │ │ │ │ │ +_A_t_t_r_i_b_u_t_e_>,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._p_u_s_h___b_a_c_k(std::make_pair(index->localIndexPair().global(), │ │ │ │ │ +473 index->localIndexPair().local().attribute())); │ │ │ │ │ +474 } │ │ │ │ │ +475 } │ │ │ │ │ +476 } │ │ │ │ │ +477 │ │ │ │ │ +486 template │ │ │ │ │ +_4_8_7 inline void _r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s(std::map,A> >& globalMap, │ │ │ │ │ +490 _R_e_m_o_t_e_I_n_d_i_c_e_s_<_T_,_A_1_>& remoteIndices, │ │ │ │ │ +491 const T& indexSet) │ │ │ │ │ +492 { │ │ │ │ │ +493 assert(globalMap.size()==static_cast(remoteIndices._n_e_i_g_h_b_o_u_r_s │ │ │ │ │ +())); │ │ │ │ │ +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 │ │ │ │ │ -_5_2_6 _B_i_t_S_e_t_V_e_c_t_o_r() : │ │ │ │ │ -527 BlocklessBaseClass() │ │ │ │ │ -528 {} │ │ │ │ │ -529 │ │ │ │ │ -_5_3_1 _B_i_t_S_e_t_V_e_c_t_o_r(const BlocklessBaseClass& blocklessBitField) : │ │ │ │ │ -532 BlocklessBaseClass(blocklessBitField) │ │ │ │ │ -533 { │ │ │ │ │ -534 if (blocklessBitField.size()%block_size != 0) │ │ │ │ │ -535 _D_U_N_E___T_H_R_O_W(_R_a_n_g_e_E_r_r_o_r, "Vector size is not a multiple of the block size!"); │ │ │ │ │ -536 } │ │ │ │ │ -537 │ │ │ │ │ -_5_4_1 explicit _B_i_t_S_e_t_V_e_c_t_o_r(int n) : │ │ │ │ │ -542 BlocklessBaseClass(n*block_size) │ │ │ │ │ -543 {} │ │ │ │ │ -544 │ │ │ │ │ -_5_4_6 _B_i_t_S_e_t_V_e_c_t_o_r(int n, bool v) : │ │ │ │ │ -547 BlocklessBaseClass(n*block_size,v) │ │ │ │ │ -548 {} │ │ │ │ │ -549 │ │ │ │ │ -_5_5_1 void _c_l_e_a_r() │ │ │ │ │ -552 { │ │ │ │ │ -553 BlocklessBaseClass::clear(); │ │ │ │ │ -554 } │ │ │ │ │ -555 │ │ │ │ │ -_5_5_7 void _r_e_s_i_z_e(int n, bool v = bool()) │ │ │ │ │ -558 { │ │ │ │ │ -559 BlocklessBaseClass::resize(n*block_size, v); │ │ │ │ │ -560 } │ │ │ │ │ -561 │ │ │ │ │ -_5_6_3 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -564 { │ │ │ │ │ -565 return BlocklessBaseClass::size()/block_size; │ │ │ │ │ +525 rIndex->localIndex_ = &(*index); │ │ │ │ │ +526 ++index; │ │ │ │ │ +527 ++rIndex; │ │ │ │ │ +528 ++gIndex; │ │ │ │ │ +529 } │ │ │ │ │ +530 } │ │ │ │ │ +531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->_s_e_q_N_o(); │ │ │ │ │ +532 remoteIndices.destSeqNo_ = remoteIndices.target_->_s_e_q_N_o(); │ │ │ │ │ +533 } │ │ │ │ │ +534 │ │ │ │ │ +535 template │ │ │ │ │ +_5_3_6 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r(_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& indexSet, │ │ │ │ │ +537 _R_e_m_o_t_e_I_n_d_i_c_e_s& 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_._c_o_m_m_u_n_i_c_a_t_o_r(), &rank_); │ │ │ │ │ +544 } │ │ │ │ │ +545 │ │ │ │ │ +546 template │ │ │ │ │ +_5_4_7 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_I_t_e_r_a_t_o_r_s(_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& remoteIndices, │ │ │ │ │ +548 _G_l_o_b_a_l_I_n_d_e_x_L_i_s_t& globalIndices, │ │ │ │ │ +549 _B_o_o_l_L_i_s_t& booleans) │ │ │ │ │ +550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(), │ │ │ │ │ +551 booleans.beginModify(), remoteIndices.end()) │ │ │ │ │ +552 { } │ │ │ │ │ +553 │ │ │ │ │ +554 template │ │ │ │ │ +_5_5_5 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_I_t_e_r_a_t_o_r_s() │ │ │ │ │ +556 : iterators_() │ │ │ │ │ +557 {} │ │ │ │ │ +558 │ │ │ │ │ +559 template │ │ │ │ │ +_5_6_0 inline typename _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s& _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_: │ │ │ │ │ +_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +561 { │ │ │ │ │ +562 ++(std::get<0>(iterators_)); │ │ │ │ │ +563 ++(std::get<1>(iterators_)); │ │ │ │ │ +564 ++(std::get<2>(iterators_)); │ │ │ │ │ +565 return *this; │ │ │ │ │ 566 } │ │ │ │ │ 567 │ │ │ │ │ -_5_6_9 void _s_e_t_A_l_l() { │ │ │ │ │ -570 this->_a_s_s_i_g_n(BlocklessBaseClass::size(), true); │ │ │ │ │ -571 } │ │ │ │ │ -572 │ │ │ │ │ -_5_7_4 void _u_n_s_e_t_A_l_l() { │ │ │ │ │ -575 this->_a_s_s_i_g_n(BlocklessBaseClass::size(), false); │ │ │ │ │ -576 } │ │ │ │ │ -577 │ │ │ │ │ -_5_7_9 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](int i) │ │ │ │ │ +568 template │ │ │ │ │ +_5_6_9 inline void _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_i_n_s_e_r_t(const _R_e_m_o_t_e_I_n_d_e_x & 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 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_R_e_m_o_t_e_I_n_d_e_x& │ │ │ │ │ +_5_7_9 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_r_e_m_o_t_e_I_n_d_e_x() const │ │ │ │ │ 580 { │ │ │ │ │ -581 return _r_e_f_e_r_e_n_c_e(*this, i); │ │ │ │ │ +581 return *(std::get<0>(iterators_)); │ │ │ │ │ 582 } │ │ │ │ │ 583 │ │ │ │ │ -_5_8_5 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](int i) const │ │ │ │ │ -586 { │ │ │ │ │ -587 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(*this, i); │ │ │ │ │ -588 } │ │ │ │ │ -589 │ │ │ │ │ -_5_9_1 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ -592 { │ │ │ │ │ -593 return _r_e_f_e_r_e_n_c_e(*this, _s_i_z_e()-1); │ │ │ │ │ -594 } │ │ │ │ │ -595 │ │ │ │ │ -_5_9_7 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const │ │ │ │ │ -598 { │ │ │ │ │ -599 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(*this, _s_i_z_e()-1); │ │ │ │ │ -600 } │ │ │ │ │ -601 │ │ │ │ │ -_6_0_3 _s_i_z_e___t_y_p_e _c_o_u_n_t() const │ │ │ │ │ -604 { │ │ │ │ │ -605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), │ │ │ │ │ -true); │ │ │ │ │ -606 } │ │ │ │ │ -607 │ │ │ │ │ -_6_0_9 _s_i_z_e___t_y_p_e _c_o_u_n_t_m_a_s_k_e_d(int j) const │ │ │ │ │ -610 { │ │ │ │ │ -611 _s_i_z_e___t_y_p_e n = 0; │ │ │ │ │ -612 _s_i_z_e___t_y_p_e blocks = _s_i_z_e(); │ │ │ │ │ -613 for(_s_i_z_e___t_y_p_e i=0; i::reference getBit(_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) { │ │ │ │ │ -638 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j < block_size); │ │ │ │ │ -639 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _s_i_z_e()); │ │ │ │ │ -640 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ -641 } │ │ │ │ │ -642 │ │ │ │ │ -_6_4_3 typename std::vector::const_reference getBit(_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e │ │ │ │ │ -j) const { │ │ │ │ │ -644 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j < block_size); │ │ │ │ │ -645 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _s_i_z_e()); │ │ │ │ │ -646 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ -647 } │ │ │ │ │ -648 │ │ │ │ │ -649 friend class _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e; │ │ │ │ │ -650 friend class _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e; │ │ │ │ │ -651 }; │ │ │ │ │ -652 │ │ │ │ │ -653} // namespace Dune │ │ │ │ │ +584 template │ │ │ │ │ +585 inline std::pair::GlobalIndex,typename │ │ │ │ │ +_I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_A_t_t_r_i_b_u_t_e>& │ │ │ │ │ +_5_8_6 _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_g_l_o_b_a_l_I_n_d_e_x_P_a_i_r() const │ │ │ │ │ +587 { │ │ │ │ │ +588 return *(std::get<1>(iterators_)); │ │ │ │ │ +589 } │ │ │ │ │ +590 │ │ │ │ │ +591 template │ │ │ │ │ +_5_9_2 inline bool _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_O_l_d() const │ │ │ │ │ +593 { │ │ │ │ │ +594 return *(std::get<2>(iterators_)); │ │ │ │ │ +595 } │ │ │ │ │ +596 │ │ │ │ │ +597 template │ │ │ │ │ +_5_9_8 inline void _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_r_e_s_e_t(_R_e_m_o_t_e_I_n_d_e_x_L_i_s_t& │ │ │ │ │ +remoteIndices, │ │ │ │ │ +599 _G_l_o_b_a_l_I_n_d_e_x_L_i_s_t& globalIndices, │ │ │ │ │ +600 _B_o_o_l_L_i_s_t& booleans) │ │ │ │ │ +601 { │ │ │ │ │ +602 std::get<0>(iterators_) = remoteIndices._b_e_g_i_n_M_o_d_i_f_y(); │ │ │ │ │ +603 std::get<1>(iterators_) = globalIndices._b_e_g_i_n_M_o_d_i_f_y(); │ │ │ │ │ +604 std::get<2>(iterators_) = booleans._b_e_g_i_n_M_o_d_i_f_y(); │ │ │ │ │ +605 } │ │ │ │ │ +606 │ │ │ │ │ +607 template │ │ │ │ │ +_6_0_8 inline bool _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_N_o_t_A_t_E_n_d() const │ │ │ │ │ +609 { │ │ │ │ │ +610 return std::get<0>(iterators_) != std::get<3>(iterators_); │ │ │ │ │ +611 } │ │ │ │ │ +612 │ │ │ │ │ +613 template │ │ │ │ │ +_6_1_4 inline bool _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_A_t_E_n_d() const │ │ │ │ │ +615 { │ │ │ │ │ +616 return std::get<0>(iterators_) == std::get<3>(iterators_); │ │ │ │ │ +617 } │ │ │ │ │ +618 │ │ │ │ │ +619 template │ │ │ │ │ +620 void _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_r_e_g_i_s_t_e_r_M_e_s_s_a_g_e_D_a_t_a_t_y_p_e() │ │ │ │ │ +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#endif │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h │ │ │ │ │ -Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ -_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -_D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S │ │ │ │ │ -#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ -nothing. │ │ │ │ │ -DDeeffiinniittiioonn boundschecking.hh:30 │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +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 _D_u_n_e_:_:_d_v_e_r_b<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 _D_u_n_e_:_:_d_v_e_r_b<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_._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +700 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ +701 │ │ │ │ │ +702 for(int i=0; i < message->publish; ++i) { │ │ │ │ │ +703 // The global index │ │ │ │ │ +704 MPI_Pack_size(1, _M_P_I_T_r_a_i_t_s_<_G_l_o_b_a_l_I_n_d_e_x_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +705 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ +706 // The attribute in the local index │ │ │ │ │ +707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +708 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ +709 // The number of corresponding remote indices │ │ │ │ │ +710 MPI_Pack_size(1, MPI_INT, remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r(), &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_._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +716 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ +717 // The attribute of the remote index │ │ │ │ │ +718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +719 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ +720 } │ │ │ │ │ +721 │ │ │ │ │ +722 _D_u_n_e_:_:_d_v_e_r_b< │ │ │ │ │ +852 void _I_n_d_i_c_e_s_S_y_n_c_e_r_<_T_>_:_:_p_a_c_k_A_n_d_S_e_n_d(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_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +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 _D_u_n_e_:_:_d_v_e_r_b<global │ │ │ │ │ +()<<" to "<(&(index->global())), 1, │ │ │ │ │ +_M_P_I_T_r_a_i_t_s_<_G_l_o_b_a_l_I_n_d_e_x_>_:_:_g_e_t_T_y_p_e(), buffer, bufferSize, &bpos, │ │ │ │ │ +908 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +909 │ │ │ │ │ +910 char attr = index->local().attribute(); │ │ │ │ │ +911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos, │ │ │ │ │ +912 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +913 │ │ │ │ │ +914 // Pack the number of remote indices we send. │ │ │ │ │ +915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos, │ │ │ │ │ +916 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +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_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +928 char attr2 = iterators->second.remoteIndex().attribute(); │ │ │ │ │ +929 │ │ │ │ │ +930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos, │ │ │ │ │ +931 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +932 --indices; │ │ │ │ │ +933 } │ │ │ │ │ +934 assert(indices==0); │ │ │ │ │ +935 ++published; │ │ │ │ │ +936 _D_u_n_e_:_:_d_v_v_e_r_b<<" (publish="< │ │ │ │ │ +951 inline void IndicesSyncer::insertIntoRemoteIndexList(int process, │ │ │ │ │ +952 const std::pair& globalPair, │ │ │ │ │ +953 char attribute) │ │ │ │ │ +954 { │ │ │ │ │ +955 _D_u_n_e_:_:_d_v_e_r_b<<"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(_A_t_t_r_i_b_u_t_e(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(_A_t_t_r_i_b_u_t_e(attribute)),globalPair); │ │ │ │ │ +1002 } │ │ │ │ │ +1003 │ │ │ │ │ +1004 template │ │ │ │ │ +1005 template │ │ │ │ │ +1006 void IndicesSyncer::recvAndUnpack(T1& numberer) │ │ │ │ │ +1007 { │ │ │ │ │ +1008 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& 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_._c_o_m_m_u_n_i_c_a_t_o_r(), &status); │ │ │ │ │ +1020 │ │ │ │ │ +1021 int source=status.MPI_SOURCE; │ │ │ │ │ +1022 int count; │ │ │ │ │ +1023 MPI_Get_count(&status, MPI_PACKED, &count); │ │ │ │ │ +1024 │ │ │ │ │ +1025 _D_u_n_e_:_:_d_v_v_e_r_b<receiveBufferSize_) { │ │ │ │ │ +1028 receiveBufferSize_=count; │ │ │ │ │ +1029 delete[] receiveBuffer_; │ │ │ │ │ +1030 receiveBuffer_ = new char[receiveBufferSize_]; │ │ │ │ │ +1031 } │ │ │ │ │ +1032 │ │ │ │ │ +1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, │ │ │ │ │ +remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r(), &status); │ │ │ │ │ +1034 │ │ │ │ │ +1035 // How many global entries were published? │ │ │ │ │ +1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, │ │ │ │ │ +remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +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 _G_l_o_b_a_l_I_n_d_e_x 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, │ │ │ │ │ +_M_P_I_T_r_a_i_t_s_<_G_l_o_b_a_l_I_n_d_e_x_>_:_:_g_e_t_T_y_p_e(), │ │ │ │ │ +1047 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR, │ │ │ │ │ +1049 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT, │ │ │ │ │ +1051 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +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,_A_t_t_r_i_b_u_t_e │ │ │ │ │ +(sourceAttribute))); │ │ │ │ │ +1057#ifndef NDEBUG │ │ │ │ │ +1058 bool foundSelf = false; │ │ │ │ │ +1059#endif │ │ │ │ │ +1060 _A_t_t_r_i_b_u_t_e myAttribute=_A_t_t_r_i_b_u_t_e(); │ │ │ │ │ +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_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1069 // Unpack the attribute │ │ │ │ │ +1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR, │ │ │ │ │ +1071 remoteIndices_._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1072 │ │ │ │ │ +1073 if(process==rank_) { │ │ │ │ │ +1074#ifndef NDEBUG │ │ │ │ │ +1075 foundSelf=true; │ │ │ │ │ +1076#endif │ │ │ │ │ +1077 myAttribute=_A_t_t_r_i_b_u_t_e(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, _I_n_d_e_x_P_a_i_r(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 _D_u_n_e_:_:_d_v_v_e_r_b << "Adding "<global()==global; ++pos) │ │ │ │ │ +1097 if(pos->local().attribute() == myAttribute) { │ │ │ │ │ +1098 _D_u_n_e_:_:_d_v_v_e_r_b<<"found "<(numberer(global), │ │ │ │ │ +1106 myAttribute, true)); │ │ │ │ │ +1107 _D_u_n_e_:_:_d_v_v_e_r_b << "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 │ │ │ │ │ +_i_n_d_e_x_s_e_t_._h_h │ │ │ │ │ +Provides a map between global and local indices. │ │ │ │ │ +_r_e_m_o_t_e_i_n_d_i_c_e_s_._h_h │ │ │ │ │ +Classes describing a distributed indexset. │ │ │ │ │ +_s_t_d_s_t_r_e_a_m_s_._h_h │ │ │ │ │ +Standard Dune debug streams. │ │ │ │ │ +_s_l_l_i_s_t_._h_h │ │ │ │ │ +Implements a singly linked list together with the necessary iterators. │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ +void push_back(const MemberType &item) │ │ │ │ │ +Add a new entry to the end of the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:643 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +SLListIterator< T, A > iterator │ │ │ │ │ +The mutable iterator of the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +Get an iterator pointing to the end of the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:774 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_b_e_g_i_n_M_o_d_i_f_y │ │ │ │ │ +ModifyIterator beginModify() │ │ │ │ │ +Get an iterator capable of deleting and inserting elements. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:787 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_<_ _R_e_m_o_t_e_I_n_d_e_x_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +SLListConstIterator< RemoteIndex, Allocator > const_iterator │ │ │ │ │ +The constant iterator of the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SLListModifyIterator< T, A > ModifyIterator │ │ │ │ │ +The type of the iterator capable of deletion and insertion. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Get an iterator pointing to the first element in the list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:762 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:637 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for equality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for inequality. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_I_t_e_r_a_t_o_r_s │ │ │ │ │ +Iterators() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:555 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +Dune::RemoteIndices< ParallelIndexSet > RemoteIndices │ │ │ │ │ +Type of the remote indices. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_O_l_d │ │ │ │ │ +bool isOld() const │ │ │ │ │ +Was this entry already in the remote index list before the sync process? │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:592 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_M_e_s_s_a_g_e_I_n_f_o_r_m_a_t_i_o_n_:_:_p_u_b_l_i_s_h │ │ │ │ │ +int publish │ │ │ │ │ +The number of indices we publish for the other process. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_r_e_p_a_i_r_L_o_c_a_l_I_n_d_e_x_P_o_i_n_t_e_r_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:487 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_A_t_E_n_d │ │ │ │ │ +bool isAtEnd() const │ │ │ │ │ +Are we at the end of the list? │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +Type of the global index used in the index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_M_e_s_s_a_g_e_I_n_f_o_r_m_a_t_i_o_n_:_:_p_a_i_r_s │ │ │ │ │ +int pairs │ │ │ │ │ +The number of pairs (attribute and process number) we publish to the neighbour │ │ │ │ │ +process. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ +Attribute & attribute() const │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +Iterators & operator++() │ │ │ │ │ +Increment all iteraors. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +ParallelIndexSet::LocalIndex::Attribute Attribute │ │ │ │ │ +Type of the attribute used in the index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_g_l_o_b_a_l_I_n_d_e_x_P_a_i_r │ │ │ │ │ +std::pair< GlobalIndex, Attribute > & globalIndexPair() const │ │ │ │ │ +Get the global index of the remote index at current position. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:586 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r │ │ │ │ │ +IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:536 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_r_e_s_e_t │ │ │ │ │ +void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, │ │ │ │ │ +BoolList &booleans) │ │ │ │ │ +Reset all the underlying iterators. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_D_e_f_a_u_l_t_N_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::size_t operator()(const GlobalIndex &global) │ │ │ │ │ +Provide the local index, always std::numeric_limits::max() │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +T ParallelIndexSet │ │ │ │ │ +The type of the index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_i_s_N_o_t_A_t_E_n_d │ │ │ │ │ +bool isNotAtEnd() const │ │ │ │ │ +Are we not at the end of the list? │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +TG GlobalIndex │ │ │ │ │ +the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ +sorting. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_s_t_o_r_e_G_l_o_b_a_l_I_n_d_i_c_e_s_O_f_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_s_y_n_c │ │ │ │ │ +void sync() │ │ │ │ │ +Sync the index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:728 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_s_e_q_N_o │ │ │ │ │ +int seqNo() const │ │ │ │ │ +Get the internal sequence number. │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +ParallelIndexSet::IndexPair IndexPair │ │ │ │ │ +The type of the index pair. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_r_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +RemoteIndex & remoteIndex() const │ │ │ │ │ +Get the remote index at current position. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_M_e_s_s_a_g_e_I_n_f_o_r_m_a_t_i_o_n_:_:_M_e_s_s_a_g_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +MessageInformation() │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r_:_:_I_t_e_r_a_t_o_r_s_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute > │ │ │ │ │ +&global) │ │ │ │ │ +Insert a new remote index to the underlying remote index list. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:569 │ │ │ │ │ +_D_u_n_e_:_:_d_v_v_e_r_b │ │ │ │ │ +DVVerbType dvverb(std::cout) │ │ │ │ │ +stream for very verbose output. │ │ │ │ │ +DDeeffiinniittiioonn stdstreams.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_d_v_e_r_b │ │ │ │ │ +DVerbType dverb(std::cout) │ │ │ │ │ +Singleton of verbose debug stream. │ │ │ │ │ +DDeeffiinniittiioonn stdstreams.hh:116 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_a_s_s_i_g_n │ │ │ │ │ -void assign(T &dst, const T &src, bool mask) │ │ │ │ │ -masked Simd assignment (scalar version) │ │ │ │ │ -DDeeffiinniittiioonn simd.hh:447 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -A dynamic array of blocks of booleans. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:469 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const_reference operator[](int i) const │ │ │ │ │ -Return const reference to i-th block. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:585 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:506 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ -BitSetVectorConstReference< block_size, Allocator > * const_pointer │ │ │ │ │ -Const pointer to a small block of bits. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:490 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +_D_u_n_e_:_:_M_P_I_T_r_a_i_t_s_:_:_g_e_t_T_y_p_e │ │ │ │ │ +static MPI_Datatype getType() │ │ │ │ │ +DDeeffiinniittiioonn mpitraits.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_P_a_i_r │ │ │ │ │ +A pair consisting of a global and local index. │ │ │ │ │ +DDeeffiinniittiioonn indexset.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_i_c_e_s_S_y_n_c_e_r │ │ │ │ │ +Class for recomputing missing indices of a distributed index set. │ │ │ │ │ +DDeeffiinniittiioonn indicessyncer.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +An index present on the local process with an additional attribute flag. │ │ │ │ │ +DDeeffiinniittiioonn plocalindex.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +The indices present on remote processes. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +MPI_Comm communicator() const │ │ │ │ │ +Get the mpi communicator used. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1696 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_e_n_d │ │ │ │ │ const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -BitSetVectorReference< block_size, Allocator > reference │ │ │ │ │ -Reference to a small block of bits. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_c_o_u_n_t_m_a_s_k_e_d │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:484 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -iterator end() │ │ │ │ │ -Returns an iterator pointing to the end of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:516 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_c_o_u_n_t │ │ │ │ │ -size_type count() const │ │ │ │ │ -Returns the number of bits that are set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:603 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -BitSetVector() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_s_e_t_A_l_l │ │ │ │ │ -void setAll() │ │ │ │ │ -Sets all entries to true │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:569 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const │ │ │ │ │ -value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > │ │ │ │ │ -const_iterator │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:502 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -std::bitset< block_size > value_type │ │ │ │ │ -Type of the values stored by the container. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:478 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_b_a_c_k │ │ │ │ │ -reference back() │ │ │ │ │ -Return reference to last block. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:591 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -BitSetVector(const BlocklessBaseClass &blocklessBitField) │ │ │ │ │ -Construction from an unblocked bitfield. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:531 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v) │ │ │ │ │ -Send bitfield to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:619 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_b_a_c_k │ │ │ │ │ -const_reference back() const │ │ │ │ │ -Return const reference to last block. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:597 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Erases all of the elements. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:551 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_p_o_i_n_t_e_r │ │ │ │ │ -BitSetVectorReference< block_size, Allocator > * pointer │ │ │ │ │ -Pointer to a small block of bits. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](int i) │ │ │ │ │ -Return reference to i-th block. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Return the number of blocks. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:563 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::vector< bool, Allocator >::size_type size_type │ │ │ │ │ -size type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -BitSetVector(int n, bool v) │ │ │ │ │ -Constructor which initializes the field with true or false. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:546 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +Get an iterator over all remote index lists. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1529 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_n_e_i_g_h_b_o_u_r_s │ │ │ │ │ +int neighbours() const │ │ │ │ │ +Get the number of processors we share indices with. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1446 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > │ │ │ │ │ +Allocator │ │ │ │ │ +The type of the allocator for the remote index list. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s_:_:_b_e_g_i_n │ │ │ │ │ const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:511 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, │ │ │ │ │ -reference, std::ptrdiff_t, ForwardIteratorFacade > iterator │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:501 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(int n, bool v=bool()) │ │ │ │ │ -Resize field. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:557 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -Allocator allocator_type │ │ │ │ │ -The type of the allocator. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:496 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -BitSetVector(int n) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_u_n_s_e_t_A_l_l │ │ │ │ │ -void unsetAll() │ │ │ │ │ -Sets all entries to false │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:574 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e │ │ │ │ │ -A proxy class that acts as a mutable reference to a single bitset in a │ │ │ │ │ -BitSetVector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_t_e_s_t │ │ │ │ │ -bool test(size_type n) const │ │ │ │ │ -Returns true if bit n is set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BitSetVectorReference & operator=(const BitSetVectorConstReference &b) │ │ │ │ │ -Assignment from BitSetVectorConstReference. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Return reference to the i-th bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:413 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_r_e_s_e_t │ │ │ │ │ -BitSetVectorReference & reset(size_type n) │ │ │ │ │ -Clears bit n. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:396 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_<_<_= │ │ │ │ │ -BitSetVectorReference & operator<<=(size_type n) │ │ │ │ │ -Left shift. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -Dune::BitSetVector< block_size, Alloc > BitSetVector │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -std::vector< bool, Alloc >::const_reference const_reference │ │ │ │ │ -A proxy class that acts as a const reference to a single bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BitSetVectorReference & operator=(const BitSetVectorReference &b) │ │ │ │ │ -Assignment from BitSetVectorReference. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:274 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_g_e_t_B_i_t │ │ │ │ │ -reference getBit(size_type i) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:423 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_&_= │ │ │ │ │ -BitSetVectorReference & operator&=(const BitSetVectorConstReference &x) │ │ │ │ │ -Bitwise and (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e │ │ │ │ │ -BitSetVectorReference(BitSetVector &blockBitField_, int block_number_) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -size_t size_type │ │ │ │ │ -size_type typedef (an unsigned integral type) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:247 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BitSetVectorReference & operator=(const bitset &b) │ │ │ │ │ -Assignment from bitset. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:258 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e │ │ │ │ │ -Dune::BitSetVectorConstReference< block_size, Alloc > │ │ │ │ │ -BitSetVectorConstReference │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_r_e_s_e_t │ │ │ │ │ -BitSetVectorReference & reset() │ │ │ │ │ -Clears every bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:382 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_b_l_o_c_k_B_i_t_F_i_e_l_d │ │ │ │ │ -BitSetVector & blockBitField │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:419 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_|_= │ │ │ │ │ -BitSetVectorReference & operator|=(const BitSetVectorConstReference &x) │ │ │ │ │ -Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_s_e_t │ │ │ │ │ -BitSetVectorReference & set(size_type n, int val=1) │ │ │ │ │ -Sets bit n if val is nonzero, and clears bit n if val is zero. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_b_i_t_s_e_t │ │ │ │ │ -std::bitset< block_size > bitset │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_^_= │ │ │ │ │ -BitSetVectorReference & operator^=(const bitset &x) │ │ │ │ │ -Bitwise exclusive or (for bitset). │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -std::vector< bool, Alloc >::reference reference │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_|_= │ │ │ │ │ -BitSetVectorReference & operator|=(const bitset &x) │ │ │ │ │ -Bitwise inclusive or (for bitset) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_>_>_= │ │ │ │ │ -BitSetVectorReference & operator>>=(size_type n) │ │ │ │ │ -Right shift. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:358 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_^_= │ │ │ │ │ -BitSetVectorReference & operator^=(const BitSetVectorConstReference &x) │ │ │ │ │ -Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_f_l_i_p │ │ │ │ │ -BitSetVectorReference & flip(size_type n) │ │ │ │ │ -Flips bit n. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:403 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_f_l_i_p │ │ │ │ │ -BitSetVectorReference & flip() │ │ │ │ │ -Flips the value of every bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:374 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_s_e_t │ │ │ │ │ -BitSetVectorReference & set() │ │ │ │ │ -Sets every bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_&_= │ │ │ │ │ -BitSetVectorReference & operator&=(const bitset &x) │ │ │ │ │ -Bitwise and (for bitset). │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BitSetVectorReference & operator=(bool b) │ │ │ │ │ -Assignment from bool, sets each bit in the bitset to b. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:250 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e │ │ │ │ │ -A proxy class that acts as a const reference to a single bitset in a │ │ │ │ │ -BitSetVector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const bitset &bs) const │ │ │ │ │ -Equality of reference and std::bitset. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_t_e_s_t │ │ │ │ │ -bool test(size_type n) const │ │ │ │ │ -Returns true if bit n is set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const_reference operator[](size_type i) const │ │ │ │ │ -Return reference to the i-th bit. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -bitset operator<<(size_type n) const │ │ │ │ │ -Returns a copy of *this shifted left by n bits. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b) │ │ │ │ │ -hide assignment operator │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e │ │ │ │ │ -BitSetVectorConstReference(const BitSetVector &blockBitField_, int │ │ │ │ │ -block_number_) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_b_l_o_c_k_B_i_t_F_i_e_l_d │ │ │ │ │ -const BitSetVector & blockBitField │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ -bitset operator>>(size_type n) const │ │ │ │ │ -Returns a copy of *this shifted right by n bits. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_g_e_t_B_i_t │ │ │ │ │ -const_reference getBit(size_type i) const │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const bitset &bs) const │ │ │ │ │ -Inequality of reference and std::bitset. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const BS &bs) const │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r │ │ │ │ │ -Dune::BitSetVector< block_size, Alloc > BitSetVector │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_b_i_t_s_e_t │ │ │ │ │ -std::bitset< block_size > bitset │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_a_l_l │ │ │ │ │ -bool all() const │ │ │ │ │ -Returns true if all bits are set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_~ │ │ │ │ │ -bitset operator~() const │ │ │ │ │ -Returns a copy of *this with all of its bits flipped. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -std::vector< bool, Alloc >::const_reference reference │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Returns block_size. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_c_o_u_n_t │ │ │ │ │ -size_type count() const │ │ │ │ │ -Returns the number of bits that are set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_n_o_n_e │ │ │ │ │ -bool none() const │ │ │ │ │ -Returns true if no bits are set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_a_n_y │ │ │ │ │ -bool any() const │ │ │ │ │ -Returns true if any bits are set. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_b_l_o_c_k___n_u_m_b_e_r │ │ │ │ │ -int block_number │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -std::vector< bool, Alloc >::const_reference const_reference │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const │ │ │ │ │ -BitSetVectorConstReference &v) │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -BitSetVectorConstReference< block_size, Alloc > type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:443 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -BitSetVectorConstReference< block_size, Alloc > type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -BitSetVectorReference< block_size, Alloc > type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _B_i_t_S_e_t_V_e_c_t_o_r_C_o_n_s_t_R_e_f_e_r_e_n_c_e_<_ _b_l_o_c_k___s_i_z_e_,_ _A_l_l_o_c_ _>_ _>_:_: │ │ │ │ │ -_t_y_p_e │ │ │ │ │ -BitSetVectorReference< block_size, Alloc > type │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -Get the 'const' version of a reference to a mutable object. │ │ │ │ │ -DDeeffiinniittiioonn genericiterator.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ -get the 'mutable' version of a reference to a const object │ │ │ │ │ -DDeeffiinniittiioonn genericiterator.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r │ │ │ │ │ -Generic class for stl-conforming iterators for container classes with operator │ │ │ │ │ -[]. │ │ │ │ │ -DDeeffiinniittiioonn genericiterator.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:141 │ │ │ │ │ +Get an iterator over all remote index lists. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:1522 │ │ │ │ │ +_D_u_n_e_:_:_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +Information about an index residing on another processor. │ │ │ │ │ +DDeeffiinniittiioonn remoteindices.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +A mutable iterator for the SLList. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_S_L_L_i_s_t │ │ │ │ │ +A single linked list. │ │ │ │ │ +DDeeffiinniittiioonn sllist.hh:44 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: matvectraits.hh File Reference │ │ │ │ +dune-common: shared_ptr.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,37 +71,57 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
matvectraits.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
shared_ptr.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix. │ │ │ │ +

This file implements several utilities related to std::shared_ptr. │ │ │ │ More...

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

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::DenseMatVecTraits< T >
struct  Dune::null_deleter< T >
 implements the Deleter concept of shared_ptr without deleting anything More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<typename T >
std::shared_ptr< T > Dune::stackobject_to_shared_ptr (T &t)
 Create a shared_ptr for a stack-allocated object.
 
template<class T >
auto Dune::wrap_or_move (T &&t)
 Capture R-value reference to shared_ptr.
 
template<class T >
auto Dune::wrap_or_move (T &t)
 Capture L-value reference to std::shared_ptr.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix.

│ │ │ │ +

This file implements several utilities related to std::shared_ptr.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,23 +1,40 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -matvectraits.hh File Reference │ │ │ │ │ -Documentation of the traits classes you need to write for each implementation │ │ │ │ │ -of DenseVector or DenseMatrix. _M_o_r_e_._._. │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +shared_ptr.hh File Reference │ │ │ │ │ +This file implements several utilities related to std::shared_ptr. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_n_u_l_l___d_e_l_e_t_e_r_<_ _T_ _> │ │ │ │ │ +  implements the Deleter concept of shared_ptr without deleting anything │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< T >  _D_u_n_e_:_:_s_t_a_c_k_o_b_j_e_c_t___t_o___s_h_a_r_e_d___p_t_r (T &t) │ │ │ │ │ +  Create a shared_ptr for a stack-allocated object. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_w_r_a_p___o_r___m_o_v_e (T &&t) │ │ │ │ │ +  Capture R-value reference to shared_ptr. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_w_r_a_p___o_r___m_o_v_e (T &t) │ │ │ │ │ +  Capture L-value reference to std::shared_ptr. │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Documentation of the traits classes you need to write for each implementation │ │ │ │ │ -of DenseVector or DenseMatrix. │ │ │ │ │ +This file implements several utilities related to std::shared_ptr. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: matvectraits.hh Source File │ │ │ │ +dune-common: shared_ptr.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,37 +74,72 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
matvectraits.hh
│ │ │ │ +
shared_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#ifndef DUNE_MATVECTRAITS_HH
│ │ │ │ -
6#define DUNE_MATVECTRAITS_HH
│ │ │ │ -
7
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13
│ │ │ │ -
22
│ │ │ │ -
24
│ │ │ │ -
26
│ │ │ │ -
30 template<class T>
│ │ │ │ - │ │ │ │ -
32
│ │ │ │ -
33} // end namespace Dune
│ │ │ │ -
34
│ │ │ │ -
35#endif // DUNE_FTRAITS_HH
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_SHARED_PTR_HH
│ │ │ │ +
7#define DUNE_SHARED_PTR_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <memory>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
47 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
49 {
│ │ │ │ +
50 void operator() (T*) const {}
│ │ │ │ +
51 };
│ │ │ │ +
│ │ │ │ +
52
│ │ │ │ +
71 template<typename T>
│ │ │ │ +
│ │ │ │ +
72 inline std::shared_ptr<T> stackobject_to_shared_ptr(T & t)
│ │ │ │ +
73 {
│ │ │ │ +
74 return std::shared_ptr<T>(&t, null_deleter<T>());
│ │ │ │ +
75 }
│ │ │ │ +
│ │ │ │ +
76
│ │ │ │ +
77
│ │ │ │ +
95 template<class T>
│ │ │ │ +
│ │ │ │ +
96 auto wrap_or_move(T&& t)
│ │ │ │ +
97 {
│ │ │ │ +
98 return std::make_shared<std::decay_t<T>>(std::forward<T>(t));
│ │ │ │ +
99 }
│ │ │ │ +
│ │ │ │ +
100
│ │ │ │ +
118 template<class T>
│ │ │ │ +
│ │ │ │ +
119 auto wrap_or_move(T& t)
│ │ │ │ +
120 {
│ │ │ │ + │ │ │ │ +
122 }
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
124}
│ │ │ │ +
125#endif
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Definition matvectraits.hh:31
│ │ │ │ +
std::shared_ptr< T > stackobject_to_shared_ptr(T &t)
Create a shared_ptr for a stack-allocated object.
Definition shared_ptr.hh:72
│ │ │ │ +
auto wrap_or_move(T &&t)
Capture R-value reference to shared_ptr.
Definition shared_ptr.hh:96
│ │ │ │ +
implements the Deleter concept of shared_ptr without deleting anything
Definition shared_ptr.hh:49
│ │ │ │ +
std::shared_ptr< T > stackobject_to_shared_ptr(T &t)
Create a shared_ptr for a stack-allocated object.
Definition shared_ptr.hh:72
│ │ │ │ +
void operator()(T *) const
Definition shared_ptr.hh:50
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,34 +1,74 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -matvectraits.hh │ │ │ │ │ +shared_ptr.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_MATVECTRAITS_HH │ │ │ │ │ -6#define DUNE_MATVECTRAITS_HH │ │ │ │ │ -7 │ │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ │ -13 │ │ │ │ │ -22 │ │ │ │ │ -24 │ │ │ │ │ -26 │ │ │ │ │ -30 template │ │ │ │ │ -_3_1 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s {}; │ │ │ │ │ -32 │ │ │ │ │ -33} // end namespace Dune │ │ │ │ │ -34 │ │ │ │ │ -35#endif // DUNE_FTRAITS_HH │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_SHARED_PTR_HH │ │ │ │ │ +7#define DUNE_SHARED_PTR_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +47 template │ │ │ │ │ +_4_8 struct _n_u_l_l___d_e_l_e_t_e_r │ │ │ │ │ +49 { │ │ │ │ │ +_5_0 void _o_p_e_r_a_t_o_r_(_)_ (T*) const {} │ │ │ │ │ +51 }; │ │ │ │ │ +52 │ │ │ │ │ +71 template │ │ │ │ │ +_7_2 inline std::shared_ptr _s_t_a_c_k_o_b_j_e_c_t___t_o___s_h_a_r_e_d___p_t_r(T & t) │ │ │ │ │ +73 { │ │ │ │ │ +74 return std::shared_ptr(&t, _n_u_l_l___d_e_l_e_t_e_r_<_T_>()); │ │ │ │ │ +75 } │ │ │ │ │ +76 │ │ │ │ │ +77 │ │ │ │ │ +95 template │ │ │ │ │ +_9_6 auto _w_r_a_p___o_r___m_o_v_e(T&& t) │ │ │ │ │ +97 { │ │ │ │ │ +98 return std::make_shared>(std::forward(t)); │ │ │ │ │ +99 } │ │ │ │ │ +100 │ │ │ │ │ +118 template │ │ │ │ │ +_1_1_9 auto _w_r_a_p___o_r___m_o_v_e(T& t) │ │ │ │ │ +120 { │ │ │ │ │ +121 return _s_t_a_c_k_o_b_j_e_c_t___t_o___s_h_a_r_e_d___p_t_r(t); │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +124} │ │ │ │ │ +125#endif │ │ │ │ │ +_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn matvectraits.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_s_t_a_c_k_o_b_j_e_c_t___t_o___s_h_a_r_e_d___p_t_r │ │ │ │ │ +std::shared_ptr< T > stackobject_to_shared_ptr(T &t) │ │ │ │ │ +Create a shared_ptr for a stack-allocated object. │ │ │ │ │ +DDeeffiinniittiioonn shared_ptr.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_w_r_a_p___o_r___m_o_v_e │ │ │ │ │ +auto wrap_or_move(T &&t) │ │ │ │ │ +Capture R-value reference to shared_ptr. │ │ │ │ │ +DDeeffiinniittiioonn shared_ptr.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_n_u_l_l___d_e_l_e_t_e_r │ │ │ │ │ +implements the Deleter concept of shared_ptr without deleting anything │ │ │ │ │ +DDeeffiinniittiioonn shared_ptr.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_n_u_l_l___d_e_l_e_t_e_r_:_:_s_t_a_c_k_o_b_j_e_c_t___t_o___s_h_a_r_e_d___p_t_r │ │ │ │ │ +std::shared_ptr< T > stackobject_to_shared_ptr(T &t) │ │ │ │ │ +Create a shared_ptr for a stack-allocated object. │ │ │ │ │ +DDeeffiinniittiioonn shared_ptr.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_n_u_l_l___d_e_l_e_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(T *) const │ │ │ │ │ +DDeeffiinniittiioonn shared_ptr.hh:50 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: singleton.hh File Reference │ │ │ │ +dune-common: math.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,40 +71,196 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
singleton.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
math.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Useful wrapper for creating singletons. │ │ │ │ +

Some useful basic math stuff. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/visibility.hh>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Singleton< T >
 An adapter to turn a class into a singleton. More...
struct  Dune::StandardMathematicalConstants< T >
 Standard implementation of MathematicalConstants. More...
 
struct  Dune::MathematicalConstants< Field >
 Provides commonly used mathematical constants. More...
 
struct  Dune::Factorial< m >
 
struct  Dune::Factorial< 0 >
 end of recursion of factorial via specialization More...
 
struct  Dune::MathOverloads::ADLTag
 Tag to make sure the functions in this namespace can be found by ADL. More...
 
struct  Dune::MathImpl::isUnorderedImpl
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::MathOverloads
 namespace for customization of math functions with Dune-Semantics
 
namespace  Dune::MathImpl
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
 
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class Base , class Exponent >
constexpr Base Dune::power (Base m, Exponent p)
 Power method for integer exponents.
 
template<class T >
static constexpr T Dune::factorial (const T &n) noexcept
 calculate the factorial of n as a constexpr
 
template<class T , T n>
static constexpr auto Dune::factorial (std::integral_constant< T, n >) noexcept
 calculate the factorial of n as a constexpr
 
template<class T >
static constexpr T Dune::binomial (const T &n, const T &k) noexcept
 calculate the binomial coefficient n over k as a constexpr
 
template<class T , T n, T k>
static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, k >) noexcept
 calculate the binomial coefficient n over k as a constexpr
 
template<class T , T n>
static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, n >) noexcept
 
template<class K >
Dune::conjugateComplex (const K &x)
 compute conjugate complex of x
 
template<class T >
int Dune::sign (const T &val)
 Return the sign of the value.
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isNaN, isnan)
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isInf, isinf)
 
 Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isFinite, isfinite)
 
template<class T >
auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 1 >, ADLTag) -> decltype(isUnordered(t1, t2))
 
template<class T >
auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 0 >, ADLTag)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isNaN)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isInf)
 
 Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isFinite)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isNaN (const T &t, PriorityTag< 2 >, ADLTag)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isInf (const T &t, PriorityTag< 2 >, ADLTag)
 
template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
auto Dune::MathOverloads::isFinite (const T &t, PriorityTag< 2 >, ADLTag)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Useful wrapper for creating singletons.

│ │ │ │ -

Inspired by the article CodeGuru: A Leak-Free Singleton class

│ │ │ │ -
│ │ │ │ +

Some useful basic math stuff.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_COMMON_MATH_ISFUNCTION

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_COMMON_MATH_ISFUNCTION( function,
 stdfunction 
)
│ │ │ │ +
│ │ │ │ +Value:
template<class T> \
│ │ │ │ +
auto function(const T &t, PriorityTag<1>, ADLTag) \
│ │ │ │ +
-> decltype(function(t)) { \
│ │ │ │ +
return function(t); \
│ │ │ │ +
} \
│ │ │ │ +
template<class T> \
│ │ │ │ +
auto function(const T &t, PriorityTag<0>, ADLTag) { \
│ │ │ │ +
using std::stdfunction; \
│ │ │ │ +
return stdfunction(t); \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR( function)
│ │ │ │ +
│ │ │ │ +Value:
struct function##Impl { \
│ │ │ │ +
template<class T> \
│ │ │ │ +
constexpr auto operator()(const T &t) const { \
│ │ │ │ +
return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \
│ │ │ │ +
} \
│ │ │ │ +
}; \
│ │ │ │ +
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,24 +1,154 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -singleton.hh File Reference │ │ │ │ │ -Useful wrapper for creating singletons. _M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_i_s_i_b_i_l_i_t_y_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +math.hh File Reference │ │ │ │ │ +Some useful basic math stuff. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_S_i_n_g_l_e_t_o_n_<_ _T_ _> │ │ │ │ │ -  An adapter to turn a class into a singleton. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_ _T_ _> │ │ │ │ │ +  Standard implementation of _M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_<_ _F_i_e_l_d_ _> │ │ │ │ │ +  Provides commonly used mathematical constants. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_<_ _m_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_<_ _0_ _> │ │ │ │ │ +  end of recursion of factorial via specialization _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g │ │ │ │ │ +  Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s │ │ │ │ │ +  namespace for customization of math functions with Dune-Semantics │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_M_a_t_h_I_m_p_l │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(function, stdfunction) │ │ │ │ │ +  │ │ │ │ │ +#define  _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(function) │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ + constexpr Base  _D_u_n_e_:_:_p_o_w_e_r (Base m, Exponent p) │ │ │ │ │ +  _P_o_w_e_r method for integer exponents. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static constexpr T  _D_u_n_e_:_:_f_a_c_t_o_r_i_a_l (const T &n) noexcept │ │ │ │ │ +  calculate the factorial of n as a constexpr │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto  _D_u_n_e_:_:_f_a_c_t_o_r_i_a_l (std::integral_constant< T, n >) │ │ │ │ │ + noexcept │ │ │ │ │ +  calculate the factorial of n as a constexpr │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static constexpr T  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (const T &n, const T &k) noexcept │ │ │ │ │ +  calculate the binomial coefficient n over k as a │ │ │ │ │ + constexpr │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (std::integral_constant< T, n >, std:: │ │ │ │ │ + integral_constant< T, k >) noexcept │ │ │ │ │ +  calculate the binomial coefficient n over k as a │ │ │ │ │ + constexpr │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto  _D_u_n_e_:_:_b_i_n_o_m_i_a_l (std::integral_constant< T, n >, std:: │ │ │ │ │ + integral_constant< T, n >) noexcept │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + K  _D_u_n_e_:_:_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const K &x) │ │ │ │ │ +  compute conjugate complex of x │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + int  _D_u_n_e_:_:_s_i_g_n (const T &val) │ │ │ │ │ +  Return the sign of the value. │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N (_i_s_N_a_N, │ │ │ │ │ + isnan) │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N (_i_s_I_n_f, │ │ │ │ │ + isinf) │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N │ │ │ │ │ + (_i_s_F_i_n_i_t_e, isfinite) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d (const T &t1, const T │ │ │ │ │ + &t2, _P_r_i_o_r_i_t_y_T_a_g< 1 >, _A_D_L_T_a_g) -> decltype(isUnordered │ │ │ │ │ + (t1, t2)) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d (const T &t1, const T │ │ │ │ │ + &t2, _P_r_i_o_r_i_t_y_T_a_g< 0 >, _A_D_L_T_a_g) │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ + (isNaN) │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ + (isInf) │ │ │ │ │ +  │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ + (isFinite) │ │ │ │ │ +  │ │ │ │ │ +template::value>> │ │ │ │ │ + auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_N_a_N (const T &t, _P_r_i_o_r_i_t_y_T_a_g< 2 │ │ │ │ │ + >, _A_D_L_T_a_g) │ │ │ │ │ +  │ │ │ │ │ +template::value>> │ │ │ │ │ + auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_I_n_f (const T &t, _P_r_i_o_r_i_t_y_T_a_g< 2 │ │ │ │ │ + >, _A_D_L_T_a_g) │ │ │ │ │ +  │ │ │ │ │ +template::value>> │ │ │ │ │ + auto  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_F_i_n_i_t_e (const T &t, _P_r_i_o_r_i_t_y_T_a_g< │ │ │ │ │ + 2 >, _A_D_L_T_a_g) │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Useful wrapper for creating singletons. │ │ │ │ │ -Inspired by the article _C_o_d_e_G_u_r_u_:_ _A_ _L_e_a_k_-_F_r_e_e_ _S_i_n_g_l_e_t_o_n_ _c_l_a_s_s │ │ │ │ │ +Some useful basic math stuff. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__CCOOMMMMOONN__MMAATTHH__IISSFFUUNNCCTTIIOONN ********** │ │ │ │ │ +#define DUNE_COMMON_MATH_ISFUNCTION (   function, │ │ │ │ │ +   stdfunction  │ │ │ │ │ + ) │ │ │ │ │ +VVaalluuee:: │ │ │ │ │ +template \ │ │ │ │ │ +auto function(const T &t, PriorityTag<1>, ADLTag) \ │ │ │ │ │ +-> decltype(function(t)) { \ │ │ │ │ │ +return function(t); \ │ │ │ │ │ +} \ │ │ │ │ │ +template \ │ │ │ │ │ +auto function(const T &t, PriorityTag<0>, ADLTag) { \ │ │ │ │ │ +using std::stdfunction; \ │ │ │ │ │ +return stdfunction(t); \ │ │ │ │ │ +} \ │ │ │ │ │ +static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +********** _?◆_? DDUUNNEE__CCOOMMMMOONN__MMAATTHH__IISSFFUUNNCCTTIIOONN__FFUUNNCCTTOORR ********** │ │ │ │ │ +#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (   function ) │ │ │ │ │ +VVaalluuee:: │ │ │ │ │ +struct function##Impl { \ │ │ │ │ │ +template \ │ │ │ │ │ +constexpr auto operator()(const T &t) const { \ │ │ │ │ │ +return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \ │ │ │ │ │ +} \ │ │ │ │ │ +}; \ │ │ │ │ │ +static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: singleton.hh Source File │ │ │ │ +dune-common: math.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,62 +74,373 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
singleton.hh
│ │ │ │ +
math.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_SINGLETON_HH
│ │ │ │ -
6#define DUNE_SINGLETON_HH
│ │ │ │ +
5#ifndef DUNE_MATH_HH
│ │ │ │ +
6#define DUNE_MATH_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ -
9
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
54 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
56 {
│ │ │ │ -
57 protected:
│ │ │ │ -
58 /* @brief Protected constructor. */
│ │ │ │ -
59 Singleton() = default;
│ │ │ │ -
60
│ │ │ │ -
61 public:
│ │ │ │ -
62
│ │ │ │ -
63 Singleton(const Singleton&) = delete;
│ │ │ │ -
64 void operator=(const Singleton&) = delete;
│ │ │ │ -
65
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
71 {
│ │ │ │ -
72 static T instance_;
│ │ │ │ -
73 return instance_;
│ │ │ │ -
74 }
│ │ │ │ +
12#include <cmath>
│ │ │ │ +
13#include <complex>
│ │ │ │ +
14#include <limits>
│ │ │ │ +
15#include <type_traits>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19namespace Dune
│ │ │ │ +
20{
│ │ │ │ +
21
│ │ │ │ +
32 template< class T >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34 {
│ │ │ │ +
│ │ │ │ +
38 static const T e ()
│ │ │ │ +
39 {
│ │ │ │ +
40 using std::exp;
│ │ │ │ +
41 static const T e = exp( T( 1 ) );
│ │ │ │ +
42 return e;
│ │ │ │ +
43 }
│ │ │ │
│ │ │ │ -
75 };
│ │ │ │ +
44
│ │ │ │ +
│ │ │ │ +
48 static const T pi ()
│ │ │ │ +
49 {
│ │ │ │ +
50 using std::acos;
│ │ │ │ +
51 static const T pi = acos( T( -1 ) );
│ │ │ │ +
52 return pi;
│ │ │ │ +
53 }
│ │ │ │
│ │ │ │ -
76
│ │ │ │ -
77} // namespace Dune
│ │ │ │ +
54 };
│ │ │ │ +
│ │ │ │ +
55
│ │ │ │ +
56
│ │ │ │ +
64 template< class Field >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
66 : public StandardMathematicalConstants<Field>
│ │ │ │ +
67 {};
│ │ │ │ +
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ +
74 template <class Base, class Exponent>
│ │ │ │ +
│ │ │ │ +
75 constexpr Base power(Base m, Exponent p)
│ │ │ │ +
76 {
│ │ │ │ +
77 static_assert(std::numeric_limits<Exponent>::is_integer, "Exponent must be an integer type!");
│ │ │ │
78
│ │ │ │ -
79#endif
│ │ │ │ -
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
│ │ │ │ +
79 auto result = Base(1);
│ │ │ │ +
80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not constexpr
│ │ │ │ +
81 for (Exponent i = Exponent(0); i<absp; i++)
│ │ │ │ +
82 result *= m;
│ │ │ │ +
83
│ │ │ │ +
84 if (p<0)
│ │ │ │ +
85 result = Base(1)/result;
│ │ │ │ +
86
│ │ │ │ +
87 return result;
│ │ │ │ +
88 }
│ │ │ │ +
│ │ │ │ +
89
│ │ │ │ +
92 template <int m>
│ │ │ │ +
│ │ │ │ +
93 struct Factorial
│ │ │ │ +
94 {
│ │ │ │ +
96 static constexpr int factorial = m * Factorial<m-1>::factorial;
│ │ │ │ +
97 };
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
100 template <>
│ │ │ │ +
│ │ │ │ +
101 struct [[deprecated("Use function factorial instead! Will be removed after Dune 2.9")]] Factorial<0>
│ │ │ │ +
102 {
│ │ │ │ +
103 // 0! = 1
│ │ │ │ +
104 static constexpr int factorial = 1;
│ │ │ │ +
105 };
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
107
│ │ │ │ +
109 // T has to be an integral type
│ │ │ │ +
110 template<class T>
│ │ │ │ +
│ │ │ │ +
111 constexpr inline static T factorial(const T& n) noexcept
│ │ │ │ +
112 {
│ │ │ │ +
113 static_assert(std::numeric_limits<T>::is_integer, "`factorial(n)` has to be called with an integer type.");
│ │ │ │ +
114 T fac = 1;
│ │ │ │ +
115 for(T k = 0; k < n; ++k)
│ │ │ │ +
116 fac *= k+1;
│ │ │ │ +
117 return fac;
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
121 template<class T, T n>
│ │ │ │ +
│ │ │ │ +
122 constexpr inline static auto factorial (std::integral_constant<T, n>) noexcept
│ │ │ │ +
123 {
│ │ │ │ +
124 return std::integral_constant<T, factorial(n)>{};
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
127
│ │ │ │ +
129 // T has to be an integral type
│ │ │ │ +
130 template<class T>
│ │ │ │ +
│ │ │ │ +
131 constexpr inline static T binomial (const T& n, const T& k) noexcept
│ │ │ │ +
132 {
│ │ │ │ +
133 static_assert(std::numeric_limits<T>::is_integer, "`binomial(n, k)` has to be called with an integer type.");
│ │ │ │ +
134
│ │ │ │ +
135 if( k < 0 || k > n )
│ │ │ │ +
136 return 0;
│ │ │ │ +
137
│ │ │ │ +
138 if (2*k > n)
│ │ │ │ +
139 return binomial(n, n-k);
│ │ │ │ +
140
│ │ │ │ +
141 T bin = 1;
│ │ │ │ +
142 for(auto i = n-k; i < n; ++i)
│ │ │ │ +
143 bin *= i+1;
│ │ │ │ +
144 return bin / factorial(k);
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
148 template<class T, T n, T k>
│ │ │ │ +
│ │ │ │ +
149 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, k>) noexcept
│ │ │ │ +
150 {
│ │ │ │ +
151 return std::integral_constant<T, binomial(n, k)>{};
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
154 template<class T, T n>
│ │ │ │ +
│ │ │ │ +
155 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, n>) noexcept
│ │ │ │ +
156 {
│ │ │ │ +
157 return std::integral_constant<T, (n >= 0 ? 1 : 0)>{};
│ │ │ │ +
158 }
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ +
160
│ │ │ │ +
162 // conjugate complex does nothing for non-complex types
│ │ │ │ +
163 template<class K>
│ │ │ │ +
│ │ │ │ +
164 inline K conjugateComplex (const K& x)
│ │ │ │ +
165 {
│ │ │ │ +
166 return x;
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
169#ifndef DOXYGEN
│ │ │ │ +
170 // specialization for complex
│ │ │ │ +
171 template<class K>
│ │ │ │ +
172 inline std::complex<K> conjugateComplex (const std::complex<K>& c)
│ │ │ │ +
173 {
│ │ │ │ +
174 return std::complex<K>(c.real(),-c.imag());
│ │ │ │ +
175 }
│ │ │ │ +
176#endif
│ │ │ │ +
177
│ │ │ │ +
179 template <class T>
│ │ │ │ +
│ │ │ │ +
180 int sign(const T& val)
│ │ │ │ +
181 {
│ │ │ │ +
182 return (val < 0 ? -1 : 1);
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
185
│ │ │ │ +
186 namespace Impl {
│ │ │ │ +
187 // Returns whether a given type behaves like std::complex<>, i.e. whether
│ │ │ │ +
188 // real() and imag() are defined
│ │ │ │ +
189 template<class T>
│ │ │ │ +
190 struct isComplexLike {
│ │ │ │ +
191 private:
│ │ │ │ +
192 template<class U>
│ │ │ │ +
193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type());
│ │ │ │ +
194
│ │ │ │ +
195 template<class U>
│ │ │ │ +
196 static auto test(...) -> decltype(std::false_type());
│ │ │ │ +
197
│ │ │ │ +
198 public:
│ │ │ │ +
199 static const bool value = decltype(test<T>(0))::value;
│ │ │ │ +
200 };
│ │ │ │ +
201 } // namespace Impl
│ │ │ │ +
202
│ │ │ │ +
204
│ │ │ │ +
227 namespace MathOverloads {
│ │ │ │ +
228
│ │ │ │ +
230 struct ADLTag {};
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ +
232#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \
│ │ │ │ +
233 template<class T> \
│ │ │ │ +
234 auto function(const T &t, PriorityTag<1>, ADLTag) \
│ │ │ │ +
235 -> decltype(function(t)) { \
│ │ │ │ +
236 return function(t); \
│ │ │ │ +
237 } \
│ │ │ │ +
238 template<class T> \
│ │ │ │ +
239 auto function(const T &t, PriorityTag<0>, ADLTag) { \
│ │ │ │ +
240 using std::stdfunction; \
│ │ │ │ +
241 return stdfunction(t); \
│ │ │ │ +
242 } \
│ │ │ │ +
243 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
248#undef DUNE_COMMON_MATH_ISFUNCTION
│ │ │ │ +
249
│ │ │ │ +
250 template<class T>
│ │ │ │ +
│ │ │ │ +
251 auto isUnordered(const T &t1, const T &t2, PriorityTag<1>, ADLTag)
│ │ │ │ +
252 -> decltype(isUnordered(t1, t2)) {
│ │ │ │ +
253 return isUnordered(t1, t2);
│ │ │ │ +
254 }
│ │ │ │ +
│ │ │ │ +
255
│ │ │ │ +
256 template<class T>
│ │ │ │ +
│ │ │ │ +
257 auto isUnordered(const T &t1, const T &t2, PriorityTag<0>, ADLTag) {
│ │ │ │ +
258 using std::isunordered;
│ │ │ │ +
259 return isunordered(t1, t2);
│ │ │ │ +
260 }
│ │ │ │ +
│ │ │ │ +
261 }
│ │ │ │ +
262
│ │ │ │ +
│ │ │ │ +
263 namespace MathImpl {
│ │ │ │ +
264
│ │ │ │ +
265 // NOTE: it is important that these functors have names different from the
│ │ │ │ +
266 // names of the functions they are forwarding to. Otherwise the
│ │ │ │ +
267 // unqualified call would find the functor type, not a function, and ADL
│ │ │ │ +
268 // would never be attempted.
│ │ │ │ +
│ │ │ │ +
269#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \
│ │ │ │ +
270 struct function##Impl { \
│ │ │ │ +
271 template<class T> \
│ │ │ │ +
272 constexpr auto operator()(const T &t) const { \
│ │ │ │ +
273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \
│ │ │ │ +
274 } \
│ │ │ │ +
275 }; \
│ │ │ │ +
276 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR
│ │ │ │ +
282
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
284 template<class T>
│ │ │ │ +
│ │ │ │ +
285 constexpr auto operator()(const T &t1, const T &t2) const {
│ │ │ │ +
286 return isUnordered(t1, t2, PriorityTag<10>{}, MathOverloads::ADLTag{});
│ │ │ │ +
287 }
│ │ │ │ +
│ │ │ │ +
288 };
│ │ │ │ +
│ │ │ │ +
289
│ │ │ │ +
290 } //MathImpl
│ │ │ │ +
│ │ │ │ +
291
│ │ │ │ +
292
│ │ │ │ +
293 namespace Impl {
│ │ │ │ +
294 /* This helper has a math functor as a static constexpr member. Doing
│ │ │ │ +
295 this as a static member of a template struct means we can do this
│ │ │ │ +
296 without violating the ODR or putting the definition into a separate
│ │ │ │ +
297 compilation unit, while still still ensuring the functor is the same
│ │ │ │ +
298 lvalue across all compilation units.
│ │ │ │ +
299 */
│ │ │ │ +
300 template<class T>
│ │ │ │ +
301 struct MathDummy
│ │ │ │ +
302 {
│ │ │ │ +
303 static constexpr T value{};
│ │ │ │ +
304 };
│ │ │ │ +
305
│ │ │ │ +
306 template<class T>
│ │ │ │ +
307 constexpr T MathDummy<T>::value;
│ │ │ │ +
308
│ │ │ │ +
309 } //namespace Impl
│ │ │ │ +
310
│ │ │ │ +
311 namespace {
│ │ │ │ +
312 /* Provide the math functors directly in the `Dune` namespace.
│ │ │ │ +
313
│ │ │ │ +
314 This actually declares a different name in each translation unit, but
│ │ │ │ +
315 they all resolve to the same lvalue.
│ │ │ │ +
316 */
│ │ │ │ +
317
│ │ │ │ +
319
│ │ │ │ +
323 constexpr auto const &isNaN = Impl::MathDummy<MathImpl::isNaNImpl>::value;
│ │ │ │ +
324
│ │ │ │ +
326
│ │ │ │ +
330 constexpr auto const &isInf = Impl::MathDummy<MathImpl::isInfImpl>::value;
│ │ │ │ +
331
│ │ │ │ +
333
│ │ │ │ +
337 constexpr auto const &isFinite = Impl::MathDummy<MathImpl::isFiniteImpl>::value;
│ │ │ │ +
338
│ │ │ │ +
340
│ │ │ │ +
345 constexpr auto const &isUnordered = Impl::MathDummy<MathImpl::isUnorderedImpl>::value;
│ │ │ │ +
346 }
│ │ │ │ +
347
│ │ │ │ +
348 namespace MathOverloads {
│ │ │ │ +
349 /*Overloads for complex types*/
│ │ │ │ +
350 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ +
│ │ │ │ +
351 auto isNaN(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ +
352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t));
│ │ │ │ +
353 }
│ │ │ │ +
│ │ │ │ +
354
│ │ │ │ +
355 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ +
│ │ │ │ +
356 auto isInf(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ +
357 return Dune::isInf(real(t)) || Dune::isInf(imag(t));
│ │ │ │ +
358 }
│ │ │ │ +
│ │ │ │ +
359
│ │ │ │ +
360 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
│ │ │ │ +
│ │ │ │ +
361 auto isFinite(const T &t, PriorityTag<2>, ADLTag) {
│ │ │ │ +
362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t));
│ │ │ │ +
363 }
│ │ │ │ +
│ │ │ │ +
364 } //MathOverloads
│ │ │ │ +
365}
│ │ │ │ +
366
│ │ │ │ +
367#endif // #ifndef DUNE_MATH_HH
│ │ │ │ +
#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
Definition math.hh:269
│ │ │ │ +
#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
Definition math.hh:232
│ │ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
An adapter to turn a class into a singleton.
Definition singleton.hh:56
│ │ │ │ -
Singleton()=default
│ │ │ │ -
Singleton(const Singleton &)=delete
│ │ │ │ -
void operator=(const Singleton &)=delete
│ │ │ │ -
static DUNE_EXPORT T & instance()
Get the instance of the singleton.
Definition singleton.hh:70
│ │ │ │ +
static constexpr T binomial(const T &n, const T &k) noexcept
calculate the binomial coefficient n over k as a constexpr
Definition math.hh:131
│ │ │ │ +
constexpr Base power(Base m, Exponent p)
Power method for integer exponents.
Definition math.hh:75
│ │ │ │ +
static constexpr T factorial(const T &n) noexcept
calculate the factorial of n as a constexpr
Definition math.hh:111
│ │ │ │ +
int sign(const T &val)
Return the sign of the value.
Definition math.hh:180
│ │ │ │ +
K conjugateComplex(const K &x)
compute conjugate complex of x
Definition math.hh:164
│ │ │ │ +
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
│ │ │ │ +
Standard implementation of MathematicalConstants.
Definition math.hh:34
│ │ │ │ +
static const T e()
Euler's number.
Definition math.hh:38
│ │ │ │ +
static const T pi()
Archimedes' constant.
Definition math.hh:48
│ │ │ │ +
Provides commonly used mathematical constants.
Definition math.hh:67
│ │ │ │ +
Definition math.hh:94
│ │ │ │ +
static constexpr int factorial
factorial stores m!
Definition math.hh:96
│ │ │ │ +
Tag to make sure the functions in this namespace can be found by ADL.
Definition math.hh:230
│ │ │ │ +
Definition math.hh:283
│ │ │ │ +
constexpr auto operator()(const T &t1, const T &t2) const
Definition math.hh:285
│ │ │ │ +
Helper class for tagging priorities.
Definition typeutilities.hh:73
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,66 +1,381 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -singleton.hh │ │ │ │ │ +math.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_SINGLETON_HH │ │ │ │ │ -6#define DUNE_SINGLETON_HH │ │ │ │ │ +5#ifndef DUNE_MATH_HH │ │ │ │ │ +6#define DUNE_MATH_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include <_d_u_n_e_/_c_o_m_m_o_n_/_v_i_s_i_b_i_l_i_t_y_._h_h> │ │ │ │ │ -9 │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -54 template │ │ │ │ │ -_5_5 class _S_i_n_g_l_e_t_o_n │ │ │ │ │ -56 { │ │ │ │ │ -57 protected: │ │ │ │ │ -58 /* @brief Protected constructor. */ │ │ │ │ │ -_5_9 _S_i_n_g_l_e_t_o_n() = default; │ │ │ │ │ -60 │ │ │ │ │ -61 public: │ │ │ │ │ -62 │ │ │ │ │ -_6_3 _S_i_n_g_l_e_t_o_n(const _S_i_n_g_l_e_t_o_n&) = delete; │ │ │ │ │ -_6_4 void _o_p_e_r_a_t_o_r_=(const _S_i_n_g_l_e_t_o_n&) = delete; │ │ │ │ │ -65 │ │ │ │ │ -_7_0 _D_U_N_E___E_X_P_O_R_T static T& _i_n_s_t_a_n_c_e() │ │ │ │ │ -71 { │ │ │ │ │ -72 static T instance_; │ │ │ │ │ -73 return instance_; │ │ │ │ │ -74 } │ │ │ │ │ -75 }; │ │ │ │ │ -76 │ │ │ │ │ -77} // namespace Dune │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +18 │ │ │ │ │ +19namespace _D_u_n_e │ │ │ │ │ +20{ │ │ │ │ │ +21 │ │ │ │ │ +32 template< class T > │ │ │ │ │ +_3_3 struct _S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ +34 { │ │ │ │ │ +_3_8 static const T _e () │ │ │ │ │ +39 { │ │ │ │ │ +40 using std::exp; │ │ │ │ │ +41 static const T _e = exp( T( 1 ) ); │ │ │ │ │ +42 return _e; │ │ │ │ │ +43 } │ │ │ │ │ +44 │ │ │ │ │ +_4_8 static const T _p_i () │ │ │ │ │ +49 { │ │ │ │ │ +50 using std::acos; │ │ │ │ │ +51 static const T _p_i = acos( T( -1 ) ); │ │ │ │ │ +52 return _p_i; │ │ │ │ │ +53 } │ │ │ │ │ +54 }; │ │ │ │ │ +55 │ │ │ │ │ +56 │ │ │ │ │ +64 template< class Field > │ │ │ │ │ +_6_5 struct _M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ +66 : public _S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ +67 {}; │ │ │ │ │ +68 │ │ │ │ │ +69 │ │ │ │ │ +74 template │ │ │ │ │ +_7_5 constexpr Base _p_o_w_e_r(Base m, Exponent p) │ │ │ │ │ +76 { │ │ │ │ │ +77 static_assert(std::numeric_limits::is_integer, "Exponent must be │ │ │ │ │ +an integer type!"); │ │ │ │ │ 78 │ │ │ │ │ -79#endif │ │ │ │ │ -_v_i_s_i_b_i_l_i_t_y_._h_h │ │ │ │ │ -Definition of macros controlling symbol visibility at the ABI level. │ │ │ │ │ -_D_U_N_E___E_X_P_O_R_T │ │ │ │ │ -#define DUNE_EXPORT │ │ │ │ │ -Export a symbol as part of the public ABI. │ │ │ │ │ -DDeeffiinniittiioonn visibility.hh:20 │ │ │ │ │ +79 auto result = Base(1); │ │ │ │ │ +80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not │ │ │ │ │ +constexpr │ │ │ │ │ +81 for (Exponent i = Exponent(0); i │ │ │ │ │ +_9_3 struct _F_a_c_t_o_r_i_a_l │ │ │ │ │ +94 { │ │ │ │ │ +_9_6 static constexpr int _f_a_c_t_o_r_i_a_l = m * _F_a_c_t_o_r_i_a_l_:_:_f_a_c_t_o_r_i_a_l; │ │ │ │ │ +97 }; │ │ │ │ │ +98 │ │ │ │ │ +100 template <> │ │ │ │ │ +_1_0_1 struct [[deprecated("Use function factorial instead! Will be removed after │ │ │ │ │ +Dune 2.9")]] _F_a_c_t_o_r_i_a_l<0> │ │ │ │ │ +102 { │ │ │ │ │ +103 // 0! = 1 │ │ │ │ │ +_1_0_4 static constexpr int _f_a_c_t_o_r_i_a_l = 1; │ │ │ │ │ +105 }; │ │ │ │ │ +106 │ │ │ │ │ +107 │ │ │ │ │ +109 // T has to be an integral type │ │ │ │ │ +110 template │ │ │ │ │ +_1_1_1 constexpr inline static T _f_a_c_t_o_r_i_a_l(const T& n) noexcept │ │ │ │ │ +112 { │ │ │ │ │ +113 static_assert(std::numeric_limits::is_integer, "`factorial(n)` has to be │ │ │ │ │ +called with an integer type."); │ │ │ │ │ +114 T fac = 1; │ │ │ │ │ +115 for(T k = 0; k < n; ++k) │ │ │ │ │ +116 fac *= k+1; │ │ │ │ │ +117 return fac; │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +121 template │ │ │ │ │ +_1_2_2 constexpr inline static auto _f_a_c_t_o_r_i_a_l (std::integral_constant) │ │ │ │ │ +noexcept │ │ │ │ │ +123 { │ │ │ │ │ +124 return std::integral_constant{}; │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +127 │ │ │ │ │ +129 // T has to be an integral type │ │ │ │ │ +130 template │ │ │ │ │ +_1_3_1 constexpr inline static T _b_i_n_o_m_i_a_l (const T& n, const T& k) noexcept │ │ │ │ │ +132 { │ │ │ │ │ +133 static_assert(std::numeric_limits::is_integer, "`binomial(n, k)` has to │ │ │ │ │ +be called with an integer type."); │ │ │ │ │ +134 │ │ │ │ │ +135 if( k < 0 || k > n ) │ │ │ │ │ +136 return 0; │ │ │ │ │ +137 │ │ │ │ │ +138 if (2*k > n) │ │ │ │ │ +139 return _b_i_n_o_m_i_a_l(n, n-k); │ │ │ │ │ +140 │ │ │ │ │ +141 T bin = 1; │ │ │ │ │ +142 for(auto i = n-k; i < n; ++i) │ │ │ │ │ +143 bin *= i+1; │ │ │ │ │ +144 return bin / _f_a_c_t_o_r_i_a_l(k); │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +148 template │ │ │ │ │ +_1_4_9 constexpr inline static auto _b_i_n_o_m_i_a_l (std::integral_constant, std:: │ │ │ │ │ +integral_constant) noexcept │ │ │ │ │ +150 { │ │ │ │ │ +151 return std::integral_constant{}; │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +154 template │ │ │ │ │ +_1_5_5 constexpr inline static auto _b_i_n_o_m_i_a_l (std::integral_constant, std:: │ │ │ │ │ +integral_constant) noexcept │ │ │ │ │ +156 { │ │ │ │ │ +157 return std::integral_constant= 0 ? 1 : 0)>{}; │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +160 │ │ │ │ │ +162 // conjugate complex does nothing for non-complex types │ │ │ │ │ +163 template │ │ │ │ │ +_1_6_4 inline K _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const K& x) │ │ │ │ │ +165 { │ │ │ │ │ +166 return x; │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +169#ifndef DOXYGEN │ │ │ │ │ +170 // specialization for complex │ │ │ │ │ +171 template │ │ │ │ │ +172 inline std::complex _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x (const std::complex& c) │ │ │ │ │ +173 { │ │ │ │ │ +174 return std::complex(c.real(),-c.imag()); │ │ │ │ │ +175 } │ │ │ │ │ +176#endif │ │ │ │ │ +177 │ │ │ │ │ +179 template │ │ │ │ │ +_1_8_0 int _s_i_g_n(const T& val) │ │ │ │ │ +181 { │ │ │ │ │ +182 return (val < 0 ? -1 : 1); │ │ │ │ │ +183 } │ │ │ │ │ +184 │ │ │ │ │ +185 │ │ │ │ │ +186 namespace Impl { │ │ │ │ │ +187 // Returns whether a given type behaves like std::complex<>, i.e. whether │ │ │ │ │ +188 // real() and imag() are defined │ │ │ │ │ +189 template │ │ │ │ │ +190 struct isComplexLike { │ │ │ │ │ +191 private: │ │ │ │ │ +192 template │ │ │ │ │ +193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type()); │ │ │ │ │ +194 │ │ │ │ │ +195 template │ │ │ │ │ +196 static auto test(...) -> decltype(std::false_type()); │ │ │ │ │ +197 │ │ │ │ │ +198 public: │ │ │ │ │ +199 static const bool value = decltype(test(0))::value; │ │ │ │ │ +200 }; │ │ │ │ │ +201 } // namespace Impl │ │ │ │ │ +202 │ │ │ │ │ +204 │ │ │ │ │ +227 namespace MathOverloads { │ │ │ │ │ +228 │ │ │ │ │ +_2_3_0 struct _A_D_L_T_a_g {}; │ │ │ │ │ +231 │ │ │ │ │ +_2_3_2#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \ │ │ │ │ │ +233 template \ │ │ │ │ │ +234 auto function(const T &t, PriorityTag<1>, ADLTag) \ │ │ │ │ │ +235 -> decltype(function(t)) { \ │ │ │ │ │ +236 return function(t); \ │ │ │ │ │ +237 } \ │ │ │ │ │ +238 template \ │ │ │ │ │ +239 auto function(const T &t, PriorityTag<0>, ADLTag) { \ │ │ │ │ │ +240 using std::stdfunction; \ │ │ │ │ │ +241 return stdfunction(t); \ │ │ │ │ │ +242 } \ │ │ │ │ │ +243 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +244 │ │ │ │ │ +_2_4_5 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_N_a_N,isnan); │ │ │ │ │ +_2_4_6 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_I_n_f,isinf); │ │ │ │ │ +_2_4_7 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N(_i_s_F_i_n_i_t_e,isfinite); │ │ │ │ │ +248#undef DUNE_COMMON_MATH_ISFUNCTION │ │ │ │ │ +249 │ │ │ │ │ +250 template │ │ │ │ │ +_2_5_1 auto _i_s_U_n_o_r_d_e_r_e_d(const T &t1, const T &t2, _P_r_i_o_r_i_t_y_T_a_g_<_1_>, _A_D_L_T_a_g) │ │ │ │ │ +252 -> decltype(_i_s_U_n_o_r_d_e_r_e_d(t1, t2)) { │ │ │ │ │ +253 return _i_s_U_n_o_r_d_e_r_e_d(t1, t2); │ │ │ │ │ +254 } │ │ │ │ │ +255 │ │ │ │ │ +256 template │ │ │ │ │ +_2_5_7 auto _i_s_U_n_o_r_d_e_r_e_d(const T &t1, const T &t2, _P_r_i_o_r_i_t_y_T_a_g_<_0_>, _A_D_L_T_a_g) { │ │ │ │ │ +258 using std::isunordered; │ │ │ │ │ +259 return isunordered(t1, t2); │ │ │ │ │ +260 } │ │ │ │ │ +261 } │ │ │ │ │ +262 │ │ │ │ │ +_2_6_3 namespace MathImpl { │ │ │ │ │ +264 │ │ │ │ │ +265 // NOTE: it is important that these functors have names different from the │ │ │ │ │ +266 // names of the functions they are forwarding to. Otherwise the │ │ │ │ │ +267 // unqualified call would find the functor type, not a function, and ADL │ │ │ │ │ +268 // would never be attempted. │ │ │ │ │ +_2_6_9#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \ │ │ │ │ │ +270 struct function##Impl { \ │ │ │ │ │ +271 template \ │ │ │ │ │ +272 constexpr auto operator()(const T &t) const { \ │ │ │ │ │ +273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \ │ │ │ │ │ +274 } \ │ │ │ │ │ +275 }; \ │ │ │ │ │ +276 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +277 │ │ │ │ │ +_2_7_8 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isNaN); │ │ │ │ │ +_2_7_9 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isInf); │ │ │ │ │ +_2_8_0 _D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R(isFinite); │ │ │ │ │ +281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR │ │ │ │ │ +282 │ │ │ │ │ +_2_8_3 struct _i_s_U_n_o_r_d_e_r_e_d_I_m_p_l { │ │ │ │ │ +284 template │ │ │ │ │ +_2_8_5 constexpr auto _o_p_e_r_a_t_o_r_(_)(const T &t1, const T &t2) const { │ │ │ │ │ +286 return isUnordered(t1, t2, _P_r_i_o_r_i_t_y_T_a_g_<_1_0_>{}, _M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g{}); │ │ │ │ │ +287 } │ │ │ │ │ +288 }; │ │ │ │ │ +289 │ │ │ │ │ +290 } //MathImpl │ │ │ │ │ +291 │ │ │ │ │ +292 │ │ │ │ │ +293 namespace Impl { │ │ │ │ │ +294 /* This helper has a math functor as a static constexpr member. Doing │ │ │ │ │ +295 this as a static member of a template struct means we can do this │ │ │ │ │ +296 without violating the ODR or putting the definition into a separate │ │ │ │ │ +297 compilation unit, while still still ensuring the functor is the same │ │ │ │ │ +298 lvalue across all compilation units. │ │ │ │ │ +299 */ │ │ │ │ │ +300 template │ │ │ │ │ +301 struct MathDummy │ │ │ │ │ +302 { │ │ │ │ │ +303 static constexpr T value{}; │ │ │ │ │ +304 }; │ │ │ │ │ +305 │ │ │ │ │ +306 template │ │ │ │ │ +307 constexpr T MathDummy::value; │ │ │ │ │ +308 │ │ │ │ │ +309 } //namespace Impl │ │ │ │ │ +310 │ │ │ │ │ +311 namespace { │ │ │ │ │ +312 /* Provide the math functors directly in the `Dune` namespace. │ │ │ │ │ +313 │ │ │ │ │ +314 This actually declares a different name in each translation unit, but │ │ │ │ │ +315 they all resolve to the same lvalue. │ │ │ │ │ +316 */ │ │ │ │ │ +317 │ │ │ │ │ +319 │ │ │ │ │ +323 constexpr auto const &_i_s_N_a_N = Impl::MathDummy::value; │ │ │ │ │ +324 │ │ │ │ │ +326 │ │ │ │ │ +330 constexpr auto const &_i_s_I_n_f = Impl::MathDummy::value; │ │ │ │ │ +331 │ │ │ │ │ +333 │ │ │ │ │ +337 constexpr auto const &_i_s_F_i_n_i_t_e = Impl::MathDummy:: │ │ │ │ │ +value; │ │ │ │ │ +338 │ │ │ │ │ +340 │ │ │ │ │ +345 constexpr auto const &_i_s_U_n_o_r_d_e_r_e_d = Impl::MathDummy::value; │ │ │ │ │ +346 } │ │ │ │ │ +347 │ │ │ │ │ +348 namespace MathOverloads { │ │ │ │ │ +349 /*Overloads for complex types*/ │ │ │ │ │ +350 template::value> > │ │ │ │ │ +_3_5_1 auto _i_s_N_a_N(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ +352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t)); │ │ │ │ │ +353 } │ │ │ │ │ +354 │ │ │ │ │ +355 template::value> > │ │ │ │ │ +_3_5_6 auto _i_s_I_n_f(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ +357 return Dune::isInf(real(t)) || Dune::isInf(imag(t)); │ │ │ │ │ +358 } │ │ │ │ │ +359 │ │ │ │ │ +360 template::value> > │ │ │ │ │ +_3_6_1 auto _i_s_F_i_n_i_t_e(const T &t, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) { │ │ │ │ │ +362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t)); │ │ │ │ │ +363 } │ │ │ │ │ +364 } //MathOverloads │ │ │ │ │ +365} │ │ │ │ │ +366 │ │ │ │ │ +367#endif // #ifndef DUNE_MATH_HH │ │ │ │ │ +_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N___F_U_N_C_T_O_R │ │ │ │ │ +#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) │ │ │ │ │ +DDeeffiinniittiioonn math.hh:269 │ │ │ │ │ +_D_U_N_E___C_O_M_M_O_N___M_A_T_H___I_S_F_U_N_C_T_I_O_N │ │ │ │ │ +#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) │ │ │ │ │ +DDeeffiinniittiioonn math.hh:232 │ │ │ │ │ +_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_S_i_n_g_l_e_t_o_n │ │ │ │ │ -An adapter to turn a class into a singleton. │ │ │ │ │ -DDeeffiinniittiioonn singleton.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_S_i_n_g_l_e_t_o_n_:_:_S_i_n_g_l_e_t_o_n │ │ │ │ │ -Singleton()=default │ │ │ │ │ -_D_u_n_e_:_:_S_i_n_g_l_e_t_o_n_:_:_S_i_n_g_l_e_t_o_n │ │ │ │ │ -Singleton(const Singleton &)=delete │ │ │ │ │ -_D_u_n_e_:_:_S_i_n_g_l_e_t_o_n_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -void operator=(const Singleton &)=delete │ │ │ │ │ -_D_u_n_e_:_:_S_i_n_g_l_e_t_o_n_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ -static DUNE_EXPORT T & instance() │ │ │ │ │ -Get the instance of the singleton. │ │ │ │ │ -DDeeffiinniittiioonn singleton.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_b_i_n_o_m_i_a_l │ │ │ │ │ +static constexpr T binomial(const T &n, const T &k) noexcept │ │ │ │ │ +calculate the binomial coefficient n over k as a constexpr │ │ │ │ │ +DDeeffiinniittiioonn math.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_p_o_w_e_r │ │ │ │ │ +constexpr Base power(Base m, Exponent p) │ │ │ │ │ +Power method for integer exponents. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_f_a_c_t_o_r_i_a_l │ │ │ │ │ +static constexpr T factorial(const T &n) noexcept │ │ │ │ │ +calculate the factorial of n as a constexpr │ │ │ │ │ +DDeeffiinniittiioonn math.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_s_i_g_n │ │ │ │ │ +int sign(const T &val) │ │ │ │ │ +Return the sign of the value. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x │ │ │ │ │ +K conjugateComplex(const K &x) │ │ │ │ │ +compute conjugate complex of x │ │ │ │ │ +DDeeffiinniittiioonn math.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_N_a_N │ │ │ │ │ +bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:604 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_I_n_f │ │ │ │ │ +bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:594 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_F_i_n_i_t_e │ │ │ │ │ +auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:584 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_U_n_o_r_d_e_r_e_d │ │ │ │ │ +bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, │ │ │ │ │ +PriorityTag< 2 >, ADLTag) │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ +Standard implementation of MathematicalConstants. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_:_:_e │ │ │ │ │ +static const T e() │ │ │ │ │ +Euler's number. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_n_d_a_r_d_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s_:_:_p_i │ │ │ │ │ +static const T pi() │ │ │ │ │ +Archimedes' constant. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_e_m_a_t_i_c_a_l_C_o_n_s_t_a_n_t_s │ │ │ │ │ +Provides commonly used mathematical constants. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_a_c_t_o_r_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn math.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_F_a_c_t_o_r_i_a_l_:_:_f_a_c_t_o_r_i_a_l │ │ │ │ │ +static constexpr int factorial │ │ │ │ │ +factorial stores m! │ │ │ │ │ +DDeeffiinniittiioonn math.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g │ │ │ │ │ +Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ +DDeeffiinniittiioonn math.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l │ │ │ │ │ +DDeeffiinniittiioonn math.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_I_m_p_l_:_:_i_s_U_n_o_r_d_e_r_e_d_I_m_p_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +constexpr auto operator()(const T &t1, const T &t2) const │ │ │ │ │ +DDeeffiinniittiioonn math.hh:285 │ │ │ │ │ +_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: filledarray.hh File Reference │ │ │ │ +dune-common: ios_state.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,42 +70,41 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
filledarray.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
ios_state.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

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

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::ios_base_all_saver
 Utility class for storing and resetting stream attributes. 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.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Utility to generate an array with a certain value.

│ │ │ │ +

Utility class for storing and resetting stream attributes.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,26 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -filledarray.hh File Reference │ │ │ │ │ -Utility to generate an array with a certain value. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +ios_state.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n │ │ │ │ │ +Utility class for storing and resetting stream attributes. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r │ │ │ │ │ +  Utility class for storing and resetting stream attributes. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr std::array< T, n >  _D_u_n_e_:_:_f_i_l_l_e_d_A_r_r_a_y (const T &t) │ │ │ │ │ -  Return an array filled with the provided value. │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Utility to generate an array with a certain value. │ │ │ │ │ +Utility class for storing and resetting stream attributes. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: filledarray.hh Source File │ │ │ │ +dune-common: ios_state.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,48 +74,55 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
filledarray.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
│ │ │ │ -
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)
│ │ │ │ +
5#ifndef DUNE_COMMON_IOS_STATE_HH
│ │ │ │ +
6#define DUNE_COMMON_IOS_STATE_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <ios>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
│ │ │ │ + │ │ │ │
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
│ │ │ │ +
35 public:
│ │ │ │ +
37 typedef std::ios_base state_type;
│ │ │ │ +
38
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
61 void restore();
│ │ │ │ +
62
│ │ │ │ +
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
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
Utility class for storing and resetting stream attributes.
Definition ios_state.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,45 +1,60 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -filledarray.hh │ │ │ │ │ +ios_state.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_FILLED_ARRAY_HH │ │ │ │ │ -7#define DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ -8 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -24 │ │ │ │ │ -32 template │ │ │ │ │ -_3_3 constexpr std::array _f_i_l_l_e_d_A_r_r_a_y(const T& t) │ │ │ │ │ +5#ifndef DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ +6#define DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e { │ │ │ │ │ +_3_3 class _i_o_s___b_a_s_e___a_l_l___s_a_v_e_r │ │ │ │ │ 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 │ │ │ │ │ -_D_u_n_e_:_:_f_i_l_l_e_d_A_r_r_a_y │ │ │ │ │ -constexpr std::array< T, n > filledArray(const T &t) │ │ │ │ │ -Return an array filled with the provided value. │ │ │ │ │ -DDeeffiinniittiioonn filledarray.hh:33 │ │ │ │ │ +35 public: │ │ │ │ │ +_3_7 typedef std::ios_base _s_t_a_t_e___t_y_p_e; │ │ │ │ │ +38 │ │ │ │ │ +48 _i_o_s___b_a_s_e___a_l_l___s_a_v_e_r(_s_t_a_t_e___t_y_p_e& ios_); │ │ │ │ │ +49 │ │ │ │ │ +53 _~_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r(); │ │ │ │ │ +54 │ │ │ │ │ +61 void _r_e_s_t_o_r_e(); │ │ │ │ │ +62 │ │ │ │ │ +63 private: │ │ │ │ │ +65 _s_t_a_t_e___t_y_p_e& 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 │ │ │ │ │ +_D_u_n_e_:_:_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r_:_:_~_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r │ │ │ │ │ +~ios_base_all_saver() │ │ │ │ │ +Destructor that restores the flags stored by the constructor. │ │ │ │ │ +DDeeffiinniittiioonn ios_state.cc:24 │ │ │ │ │ +_D_u_n_e_:_:_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r_:_:_r_e_s_t_o_r_e │ │ │ │ │ +void restore() │ │ │ │ │ +Restore flags now. │ │ │ │ │ +DDeeffiinniittiioonn ios_state.cc:29 │ │ │ │ │ +_D_u_n_e_:_:_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r_:_:_s_t_a_t_e___t_y_p_e │ │ │ │ │ +std::ios_base state_type │ │ │ │ │ +Export type of object we save the state for. │ │ │ │ │ +DDeeffiinniittiioonn ios_state.hh:37 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_i_o_s___b_a_s_e___a_l_l___s_a_v_e_r │ │ │ │ │ +Utility class for storing and resetting stream attributes. │ │ │ │ │ +DDeeffiinniittiioonn ios_state.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: ios_state.cc File Reference │ │ │ │ +dune-common: classname.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,26 +70,49 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
ios_state.cc File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
classname.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/ios_state.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <cstdlib>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <string>
│ │ │ │ +#include <typeinfo>
│ │ │ │ +#include <type_traits>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

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

│ │ │ │ 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.
 
template<class T >
std::string Dune::className (T &&v)
 Provide the demangled class name of a given object as a string.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,15 +1,34 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -ios_state.cc File Reference │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_o_s___s_t_a_t_e_._h_h> │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +classname.hh File Reference │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::string  _D_u_n_e_:_:_c_l_a_s_s_N_a_m_e () │ │ │ │ │ +  Provide the demangled class name of a type T as a string. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::string  _D_u_n_e_:_:_c_l_a_s_s_N_a_m_e (T &&v) │ │ │ │ │ +  Provide the demangled class name of a given object as a string. │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: sllist.hh File Reference │ │ │ │ +dune-common: path.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,60 +70,59 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
sllist.hh File Reference
│ │ │ │ +
path.cc 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>
│ │ │ │ -
│ │ │ │ -

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...
 
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iterator>
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/stringutility.hh>
│ │ │ │ +#include <dune/common/path.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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
 
std::string Dune::processPath (const std::string &p)
 sanitize a path for further processing
 
bool Dune::pathIndicatesDirectory (const std::string &p)
 check whether the given path indicates that it is a directory
 
std::string Dune::prettyPath (const std::string &p, bool isDirectory)
 pretty print path
 
std::string Dune::prettyPath (const std::string &p)
 pretty print path
 
std::string Dune::relativePath (const std::string &newbase, const std::string &p)
 compute a relative path between two paths
 
│ │ │ │

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 {} │ │ │ │ │ @@ -1,43 +1,46 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -sllist.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_S_L_L_i_s_t_<_ _T_,_ _A_ _> │ │ │ │ │ -  A single linked list. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ -  A mutable iterator for the _S_L_L_i_s_t. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ -  A constant iterator for the _S_L_L_i_s_t. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ -  A mutable iterator for the _S_L_L_i_s_t. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +path.cc File Reference │ │ │ │ │ +_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _F_i_l_e_s_y_s_t_e_m_ _P_a_t_h_s │ │ │ │ │ +Utilities for handling filesystem paths. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_r_i_n_g_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_t_h_._h_h> │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const _S_L_L_i_s_t< T, A > │ │ │ │ │ - &sllist) │ │ │ │ │ +std::string  _D_u_n_e_:_:_c_o_n_c_a_t_P_a_t_h_s (const std::string &base, const std::string &p) │ │ │ │ │ +  concatenate two paths │ │ │ │ │ +  │ │ │ │ │ +std::string  _D_u_n_e_:_:_p_r_o_c_e_s_s_P_a_t_h (const std::string &p) │ │ │ │ │ +  sanitize a path for further processing │ │ │ │ │ +  │ │ │ │ │ + bool  _D_u_n_e_:_:_p_a_t_h_I_n_d_i_c_a_t_e_s_D_i_r_e_c_t_o_r_y (const std::string &p) │ │ │ │ │ +  check whether the given path indicates that it is a directory │ │ │ │ │ +  │ │ │ │ │ +std::string  _D_u_n_e_:_:_p_r_e_t_t_y_P_a_t_h (const std::string &p, bool isDirectory) │ │ │ │ │ +  pretty print path │ │ │ │ │ +  │ │ │ │ │ +std::string  _D_u_n_e_:_:_p_r_e_t_t_y_P_a_t_h (const std::string &p) │ │ │ │ │ +  pretty print path │ │ │ │ │ +  │ │ │ │ │ +std::string  _D_u_n_e_:_:_r_e_l_a_t_i_v_e_P_a_t_h (const std::string &newbase, const std::string │ │ │ │ │ + &p) │ │ │ │ │ +  compute a relative path between two paths │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. │ │ │ │ │ +Utilities for handling filesystem paths. │ │ │ │ │ Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ + Jö Fahlke _j_o_r_r_i_._n_o_s_p_@_m_._t_@_j_o_._n_o_s_p_@_m_._r_r_i_t_._._n_o_s_p_@_m_._d_e │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: exceptions.cc File Reference │ │ │ │ +dune-common: enumset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,26 +70,72 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
exceptions.cc File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
enumset.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Classes for building sets out of enumeration values. │ │ │ │ +More...

│ │ │ │ +
#include <iostream>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::EmptySet< TA >
 An empty set. More...
 
class  Dune::AllSet< TA >
 A set containing everything. More...
 
class  Dune::EnumItem< TA, item >
 A set consisting only of one item. More...
 
class  Dune::EnumRange< TA, from, end >
 A set representing a range including the borders. More...
 
class  Dune::NegateSet< S >
 The negation of a set. An item is contained in the set if and only if it is not contained in the negated set. More...
 
class  Dune::Combine< TI1, TI2, TA >
 A set combining two other sets. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<typename TA , int i>
std::ostream & Dune::operator<< (std::ostream &os, const EnumItem< TA, i > &)
 
template<typename TA , int from, int to>
std::ostream & Dune::operator<< (std::ostream &os, const EnumRange< TA, from, to > &)
 
template<class TI1 , class TI2 >
Combine< TI1, TI2, typename TI1::Type > Dune::combine (const TI1 &set1, const TI2 &set2)
 
template<class TI1 , class TI2 , class T >
std::ostream & Dune::operator<< (std::ostream &os, const Combine< TI1, TI2, T > &)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Classes for building sets out of enumeration values.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,15 +1,58 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -exceptions.cc File Reference │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +enumset.hh File Reference │ │ │ │ │ +Classes for building sets out of enumeration values. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_E_m_p_t_y_S_e_t_<_ _T_A_ _> │ │ │ │ │ +  An empty set. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_l_l_S_e_t_<_ _T_A_ _> │ │ │ │ │ +  A set containing everything. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_E_n_u_m_I_t_e_m_<_ _T_A_,_ _i_t_e_m_ _> │ │ │ │ │ +  A set consisting only of one item. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_E_n_u_m_R_a_n_g_e_<_ _T_A_,_ _f_r_o_m_,_ _e_n_d_ _> │ │ │ │ │ +  A set representing a range including the borders. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_N_e_g_a_t_e_S_e_t_<_ _S_ _> │ │ │ │ │ +  The negation of a set. An item is contained in the set if and only if │ │ │ │ │ + it is not contained in the negated set. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_o_m_b_i_n_e_<_ _T_I_1_,_ _T_I_2_,_ _T_A_ _> │ │ │ │ │ +  A set combining two other sets. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ + std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ + const _E_n_u_m_I_t_e_m< TA, i > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ + const _E_n_u_m_R_a_n_g_e< TA, from, to > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +_C_o_m_b_i_n_e< TI1, TI2, typename TI1::Type >  _D_u_n_e_:_:_c_o_m_b_i_n_e (const TI1 &set1, const │ │ │ │ │ + TI2 &set2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ + const _C_o_m_b_i_n_e< TI1, TI2, T > &) │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Classes for building sets out of enumeration values. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugstream.hh File Reference │ │ │ │ +dune-common: genericiterator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,63 +71,59 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
debugstream.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
genericiterator.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ More...

│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <stack>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include <cassert>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
struct  Dune::const_reference< R >
 Get the 'const' version of a reference to a mutable object. More...
 
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
struct  Dune::const_reference< const R >
 
class  Dune::DebugStreamError
 standard exception for the debugstream More...
struct  Dune::const_reference< R & >
 
class  Dune::StreamWrap
struct  Dune::const_reference< const R & >
 
class  Dune::DebugStreamState
 Intermediate class to implement tie-operation of DebugStream. More...
struct  Dune::mutable_reference< R >
 get the 'mutable' version of a reference to a const object More...
 
class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
 Generic class to implement debug output streams. More...
struct  Dune::mutable_reference< const R >
 
struct  Dune::mutable_reference< R & >
 
struct  Dune::mutable_reference< const R & >
 
class  Dune::GenericIterator< C, T, R, D, IteratorFacade >
 Generic class for stl-conforming iterators for container classes with operator[]. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

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

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

│ │ │ │ +

Implements a generic iterator class for writing stl conformant iterators.

│ │ │ │ +

Using this generic iterator writing iterators for containers that implement operator[] is only a matter of seconds.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,47 +1,46 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ │ -debugstream.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _D_e_b_u_g_ _o_u_t_p_u_t │ │ │ │ │ -Defines several output streams for messages of different importance. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +genericiterator.hh File Reference │ │ │ │ │ +Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l_<_ _c_u_r_r_e_n_t_,_ _t_h_r_e_s_h_o_l_d_ _> │ │ │ │ │ -  Greater or equal template test. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _R_ _> │ │ │ │ │ +  Get the 'const' version of a reference to a mutable object. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s_<_ _c_u_r_r_e_n_t_,_ _m_a_s_k_ _> │ │ │ │ │ -  activate if current and mask have common bits switched on. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r │ │ │ │ │ -  standard exception for the debugstream _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _R_ _&_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ +struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _&_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e │ │ │ │ │ -  Intermediate class to implement tie-operation of _D_e_b_u_g_S_t_r_e_a_m. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _R_ _> │ │ │ │ │ +  get the 'mutable' version of a reference to a const object _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_<_ _t_h_i_s_l_e_v_e_l_,_ _d_l_e_v_e_l_,_ _a_l_e_v_e_l_,_ _a_c_t_i_v_a_t_o_r_ _> │ │ │ │ │ -  Generic class to implement debug output streams. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _R_ _&_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _&_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_<_ _C_,_ _T_,_ _R_,_ _D_,_ _I_t_e_r_a_t_o_r_F_a_c_a_d_e_ _> │ │ │ │ │ +  Generic class for stl-conforming iterators for container classes with │ │ │ │ │ + operator[]. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -typedef unsigned int  _D_u_n_e_:_:_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ -  Type for debug levels. │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -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 │ │ │ │ │ +Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ +Using this generic iterator writing iterators for containers that implement │ │ │ │ │ +operator[] is only a matter of seconds. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugstream.hh Source File │ │ │ │ +dune-common: genericiterator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,333 +74,239 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
debugstream.hh
│ │ │ │ +
genericiterator.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 };
│ │ │ │ +
5#ifndef DUNE_GENERICITERATOR_HH
│ │ │ │ +
6#define DUNE_GENERICITERATOR_HH
│ │ │ │ +
7
│ │ │ │ + │ │ │ │ +
9#include <cassert>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12
│ │ │ │ +
85 template<class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
87 {
│ │ │ │ +
88 typedef const R type;
│ │ │ │ +
89 };
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
91 template<class R>
│ │ │ │ +
│ │ │ │ +
92 struct const_reference<const R>
│ │ │ │ +
93 {
│ │ │ │ +
94 typedef const R type;
│ │ │ │ +
95 };
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
97 template<class R>
│ │ │ │ +
│ │ │ │ +
98 struct const_reference<R&>
│ │ │ │ +
99 {
│ │ │ │ +
100 typedef const R& type;
│ │ │ │ +
101 };
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
103 template<class R>
│ │ │ │ +
│ │ │ │ +
104 struct const_reference<const R&>
│ │ │ │ +
105 {
│ │ │ │ +
106 typedef const R& type;
│ │ │ │ +
107 };
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
114 template<class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
116 {
│ │ │ │ +
117 typedef R type;
│ │ │ │ +
118 };
│ │ │ │
│ │ │ │ +
119
│ │ │ │ +
120 template<class R>
│ │ │ │ +
│ │ │ │ +
121 struct mutable_reference<const R>
│ │ │ │ +
122 {
│ │ │ │ +
123 typedef R type;
│ │ │ │ +
124 };
│ │ │ │ +
│ │ │ │ +
125
│ │ │ │ +
126 template<class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
128 {
│ │ │ │ +
129 typedef R& type;
│ │ │ │ +
130 };
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
132 template<class R>
│ │ │ │ +
│ │ │ │ +
133 struct mutable_reference<const R&>
│ │ │ │ +
134 {
│ │ │ │ +
135 typedef R& type;
│ │ │ │ +
136 };
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
149 template<class C, class T, class R=T&, class D = std::ptrdiff_t,
│ │ │ │ +
150 template<class,class,class,class> class IteratorFacade=RandomAccessIteratorFacade>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
152 public IteratorFacade<GenericIterator<C,T,R,D,IteratorFacade>,T,R,D>
│ │ │ │ +
153 {
│ │ │ │ +
154 friend class GenericIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type, D, IteratorFacade>;
│ │ │ │ +
155 friend class GenericIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type, D, IteratorFacade>;
│ │ │ │
156
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
159 // !!! should be protected somehow but that won't be easy
│ │ │ │ +
157 typedef GenericIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type, D, IteratorFacade> MutableIterator;
│ │ │ │ +
158 typedef GenericIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type, D, IteratorFacade> ConstIterator;
│ │ │ │ +
159
│ │ │ │
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;
│ │ │ │ +
161
│ │ │ │ +
170 typedef C Container;
│ │ │ │ +
171
│ │ │ │ +
177 typedef T Value;
│ │ │ │ +
178
│ │ │ │ +
182 typedef D DifferenceType;
│ │ │ │ +
183
│ │ │ │ +
187 typedef R Reference;
│ │ │ │ +
188
│ │ │ │ +
189 // Constructors needed by the base iterators
│ │ │ │ +
│ │ │ │ +
190 GenericIterator() : container_(0), position_(0)
│ │ │ │ +
191 {}
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
201 : container_(&cont), position_(pos)
│ │ │ │ +
202 {}
│ │ │ │ +
│ │ │ │
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 }
│ │ │ │ +
│ │ │ │ +
211 GenericIterator(const MutableIterator& other) : container_(other.container_), position_(other.position_)
│ │ │ │ +
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;
│ │ │ │ +
│ │ │ │ +
223 GenericIterator(const ConstIterator& other) : container_(other.container_), position_(other.position_)
│ │ │ │ +
224 {}
│ │ │ │ +
│ │ │ │
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 }
│ │ │ │ +
226 // Methods needed by the forward iterator
│ │ │ │ +
│ │ │ │ +
227 bool equals(const MutableIterator & other) const
│ │ │ │ +
228 {
│ │ │ │ +
229 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
230 }
│ │ │ │ +
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ +
232 bool equals(const ConstIterator & other) const
│ │ │ │ +
233 {
│ │ │ │ +
234 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
238 return container_->operator[](position_);
│ │ │ │ +
239 }
│ │ │ │ +
│ │ │ │ +
240
│ │ │ │ +
│ │ │ │ +
241 void increment(){
│ │ │ │ +
242 ++position_;
│ │ │ │ +
243 }
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
245 // Additional function needed by BidirectionalIterator
│ │ │ │ +
│ │ │ │ +
246 void decrement(){
│ │ │ │ +
247 --position_;
│ │ │ │ +
248 }
│ │ │ │ +
│ │ │ │ +
249
│ │ │ │ +
250 // Additional function needed by RandomAccessIterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
252 return container_->operator[](position_+i);
│ │ │ │ +
253 }
│ │ │ │ +
│ │ │ │ +
254
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
256 position_=position_+n;
│ │ │ │ +
257 }
│ │ │ │ +
│ │ │ │ +
258
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
260 {
│ │ │ │ +
261 assert(other.container_==container_);
│ │ │ │ +
262 return other.position_ - position_;
│ │ │ │
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
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
266 {
│ │ │ │ +
267 assert(other.container_==container_);
│ │ │ │ +
268 return other.position_ - position_;
│ │ │ │ +
269 }
│ │ │ │ +
│ │ │ │ +
270
│ │ │ │ +
271 private:
│ │ │ │ +
272 Container *container_;
│ │ │ │ +
273 DifferenceType position_;
│ │ │ │ +
274 };
│ │ │ │ +
│ │ │ │ +
275
│ │ │ │ +
278} // end namespace Dune
│ │ │ │ +
279
│ │ │ │ +
280#endif
│ │ │ │ +
This file implements iterator facade classes for writing stl conformant iterators.
│ │ │ │ +
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
│ │ │ │ +
Get the 'const' version of a reference to a mutable object.
Definition genericiterator.hh:87
│ │ │ │ +
const R type
Definition genericiterator.hh:88
│ │ │ │ +
const R type
Definition genericiterator.hh:94
│ │ │ │ +
const R & type
Definition genericiterator.hh:100
│ │ │ │ +
const R & type
Definition genericiterator.hh:106
│ │ │ │ +
get the 'mutable' version of a reference to a const object
Definition genericiterator.hh:116
│ │ │ │ +
R type
Definition genericiterator.hh:117
│ │ │ │ +
R type
Definition genericiterator.hh:123
│ │ │ │ +
R & type
Definition genericiterator.hh:129
│ │ │ │ +
Generic class for stl-conforming iterators for container classes with operator[].
Definition genericiterator.hh:153
│ │ │ │ +
GenericIterator(const MutableIterator &other)
Copy constructor.
Definition genericiterator.hh:211
│ │ │ │ +
bool equals(const MutableIterator &other) const
Definition genericiterator.hh:227
│ │ │ │ +
Reference elementAt(DifferenceType i) const
Definition genericiterator.hh:251
│ │ │ │ +
void increment()
Definition genericiterator.hh:241
│ │ │ │ +
GenericIterator(const ConstIterator &other)
Copy constructor.
Definition genericiterator.hh:223
│ │ │ │ +
void advance(DifferenceType n)
Definition genericiterator.hh:255
│ │ │ │ +
GenericIterator(Container &cont, DifferenceType pos)
Constructor.
Definition genericiterator.hh:200
│ │ │ │ +
D DifferenceType
The type of the difference between two positions.
Definition genericiterator.hh:182
│ │ │ │ +
R Reference
The type of the reference to the values accessed.
Definition genericiterator.hh:187
│ │ │ │ +
DifferenceType distanceTo(const MutableIterator &other) const
Definition genericiterator.hh:259
│ │ │ │ +
C Container
The type of container we are an iterator for.
Definition genericiterator.hh:170
│ │ │ │ +
T Value
The value type of the iterator.
Definition genericiterator.hh:177
│ │ │ │ +
DifferenceType distanceTo(const ConstIterator &other) const
Definition genericiterator.hh:265
│ │ │ │ +
void decrement()
Definition genericiterator.hh:246
│ │ │ │ +
Reference dereference() const
Definition genericiterator.hh:237
│ │ │ │ +
bool equals(const ConstIterator &other) const
Definition genericiterator.hh:232
│ │ │ │ +
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:434
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,375 +1,267 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -debugstream.hh │ │ │ │ │ +genericiterator.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -17 │ │ │ │ │ -18namespace _D_u_n_e { │ │ │ │ │ -19 │ │ │ │ │ -_1_1_8 typedef unsigned int _D_e_b_u_g_L_e_v_e_l; │ │ │ │ │ +5#ifndef DUNE_GENERICITERATOR_HH │ │ │ │ │ +6#define DUNE_GENERICITERATOR_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h> │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e { │ │ │ │ │ +12 │ │ │ │ │ +85 template │ │ │ │ │ +_8_6 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +87 { │ │ │ │ │ +_8_8 typedef const R _t_y_p_e; │ │ │ │ │ +89 }; │ │ │ │ │ +90 │ │ │ │ │ +91 template │ │ │ │ │ +_9_2 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +93 { │ │ │ │ │ +_9_4 typedef const R _t_y_p_e; │ │ │ │ │ +95 }; │ │ │ │ │ +96 │ │ │ │ │ +97 template │ │ │ │ │ +_9_8 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +99 { │ │ │ │ │ +_1_0_0 typedef const R& _t_y_p_e; │ │ │ │ │ +101 }; │ │ │ │ │ +102 │ │ │ │ │ +103 template │ │ │ │ │ +_1_0_4 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +105 { │ │ │ │ │ +_1_0_6 typedef const R& _t_y_p_e; │ │ │ │ │ +107 }; │ │ │ │ │ +108 │ │ │ │ │ +114 template │ │ │ │ │ +_1_1_5 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ +116 { │ │ │ │ │ +_1_1_7 typedef R _t_y_p_e; │ │ │ │ │ +118 }; │ │ │ │ │ 119 │ │ │ │ │ -129 template │ │ │ │ │ -_1_3_0 struct _g_r_e_a_t_e_r___o_r___e_q_u_a_l { │ │ │ │ │ -_1_3_1 constexpr static bool _v_a_l_u_e = (current >= threshold); │ │ │ │ │ -132 }; │ │ │ │ │ -133 │ │ │ │ │ -134 │ │ │ │ │ -141 template │ │ │ │ │ -_1_4_2 struct _c_o_m_m_o_n___b_i_t_s { │ │ │ │ │ -_1_4_3 constexpr static bool _v_a_l_u_e = ((current & mask) != 0); │ │ │ │ │ -144 }; │ │ │ │ │ -145 │ │ │ │ │ -146 │ │ │ │ │ -_1_4_8 class _D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r : public _I_O_E_r_r_o_r {}; │ │ │ │ │ -149 │ │ │ │ │ -_1_5_0 class _S_t_r_e_a_m_W_r_a_p { │ │ │ │ │ -151 public: │ │ │ │ │ -_1_5_2 _S_t_r_e_a_m_W_r_a_p(std::ostream& _out) : _o_u_t(_out) { } │ │ │ │ │ -_1_5_3 std::ostream& _o_u_t; │ │ │ │ │ -_1_5_4 _S_t_r_e_a_m_W_r_a_p *_n_e_x_t; │ │ │ │ │ -155 }; │ │ │ │ │ +120 template │ │ │ │ │ +_1_2_1 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ +122 { │ │ │ │ │ +_1_2_3 typedef R _t_y_p_e; │ │ │ │ │ +124 }; │ │ │ │ │ +125 │ │ │ │ │ +126 template │ │ │ │ │ +_1_2_7 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ +128 { │ │ │ │ │ +_1_2_9 typedef R& _t_y_p_e; │ │ │ │ │ +130 }; │ │ │ │ │ +131 │ │ │ │ │ +132 template │ │ │ │ │ +_1_3_3 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ +134 { │ │ │ │ │ +_1_3_5 typedef R& type; │ │ │ │ │ +136 }; │ │ │ │ │ +137 │ │ │ │ │ +149 template class │ │ │ │ │ +IteratorFacade=_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e> │ │ │ │ │ +_1_5_1 class _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r : │ │ │ │ │ +152 public IteratorFacade,T,R,D> │ │ │ │ │ +153 { │ │ │ │ │ +154 friend class _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r::type, typename │ │ │ │ │ +std::remove_const::type, typename _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e::type, D, │ │ │ │ │ +IteratorFacade>; │ │ │ │ │ +155 friend class _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +const typename std::remove_const::type, typename const_reference::type, │ │ │ │ │ +D, IteratorFacade>; │ │ │ │ │ 156 │ │ │ │ │ -_1_5_8 class _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e { │ │ │ │ │ -159 // !!! should be protected somehow but that won't be easy │ │ │ │ │ +157 typedef _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r::type, typename std:: │ │ │ │ │ +remove_const::type, typename mutable_reference::type, D, IteratorFacade> │ │ │ │ │ +_M_u_t_a_b_l_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +158 typedef _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r::type, const │ │ │ │ │ +typename std::remove_const::type, typename const_reference::type, D, │ │ │ │ │ +IteratorFacade> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +159 │ │ │ │ │ 160 public: │ │ │ │ │ -_1_6_2 _S_t_r_e_a_m_W_r_a_p* _c_u_r_r_e_n_t; │ │ │ │ │ -163 │ │ │ │ │ -_1_6_5 bool ___a_c_t_i_v_e; │ │ │ │ │ -166 │ │ │ │ │ -_1_6_8 bool ___t_i_e_d; │ │ │ │ │ -169 │ │ │ │ │ -_1_7_1 unsigned int ___t_i_e_d___s_t_r_e_a_m_s; │ │ │ │ │ -172 }; │ │ │ │ │ -173 │ │ │ │ │ -188 template <_D_e_b_u_g_L_e_v_e_l thislevel = 1, │ │ │ │ │ -189 _D_e_b_u_g_L_e_v_e_l dlevel = 1, │ │ │ │ │ -190 _D_e_b_u_g_L_e_v_e_l alevel = 1, │ │ │ │ │ -191 template class activator = _g_r_e_a_t_e_r___o_r___e_q_u_a_l> │ │ │ │ │ -_1_9_2 class _D_e_b_u_g_S_t_r_e_a_m : public _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e { │ │ │ │ │ -193 public: │ │ │ │ │ -_1_9_9 _D_e_b_u_g_S_t_r_e_a_m(std::ostream& out = std::cerr) { │ │ │ │ │ -200 // start a new list of streams │ │ │ │ │ -201 _c_u_r_r_e_n_t = new _S_t_r_e_a_m_W_r_a_p(out); │ │ │ │ │ -202 _c_u_r_r_e_n_t->_n_e_x_t = 0; │ │ │ │ │ +161 │ │ │ │ │ +_1_7_0 typedef C _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +171 │ │ │ │ │ +_1_7_7 typedef T _V_a_l_u_e; │ │ │ │ │ +178 │ │ │ │ │ +_1_8_2 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ +183 │ │ │ │ │ +_1_8_7 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ +188 │ │ │ │ │ +189 // Constructors needed by the base iterators │ │ │ │ │ +_1_9_0 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r() : container_(0), position_(0) │ │ │ │ │ +191 {} │ │ │ │ │ +192 │ │ │ │ │ +_2_0_0 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r(_C_o_n_t_a_i_n_e_r& cont, _D_i_f_f_e_r_e_n_c_e_T_y_p_e pos) │ │ │ │ │ +201 : container_(&cont), position_(pos) │ │ │ │ │ +202 {} │ │ │ │ │ 203 │ │ │ │ │ -204 // check if we are above the default activation level │ │ │ │ │ -205 ___a_c_t_i_v_e = activator::value; │ │ │ │ │ -206 │ │ │ │ │ -207 // we're not tied to another DebugStream │ │ │ │ │ -208 ___t_i_e_d = false; │ │ │ │ │ -209 │ │ │ │ │ -210 // no child streams yet │ │ │ │ │ -211 ___t_i_e_d___s_t_r_e_a_m_s = 0; │ │ │ │ │ -212 } │ │ │ │ │ +_2_1_1 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r(const _M_u_t_a_b_l_e_I_t_e_r_a_t_o_r& other) : container_ │ │ │ │ │ +(other.container_), position_(other.position_) │ │ │ │ │ +212 {} │ │ │ │ │ 213 │ │ │ │ │ -_2_1_9 _D_e_b_u_g_S_t_r_e_a_m (_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e& master, │ │ │ │ │ -220 std::ostream& fallback = std::cerr) │ │ │ │ │ -221 { │ │ │ │ │ -222 // start a new list of streams │ │ │ │ │ -223 _c_u_r_r_e_n_t = new _S_t_r_e_a_m_W_r_a_p(fallback); │ │ │ │ │ -224 _c_u_r_r_e_n_t->_n_e_x_t = 0; │ │ │ │ │ +_2_2_3 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r(const _C_o_n_s_t_I_t_e_r_a_t_o_r& other) : container_(other.container_), │ │ │ │ │ +position_(other.position_) │ │ │ │ │ +224 {} │ │ │ │ │ 225 │ │ │ │ │ -226 // check if we are above the default activation level │ │ │ │ │ -227 ___a_c_t_i_v_e = activator::value; │ │ │ │ │ -228 ___t_i_e_d___s_t_r_e_a_m_s = 0; │ │ │ │ │ -229 │ │ │ │ │ -230 // tie to the provided stream │ │ │ │ │ -231 ___t_i_e_d = true; │ │ │ │ │ -232 tiedstate = &master; │ │ │ │ │ -233 tiedstate->___t_i_e_d___s_t_r_e_a_m_s++; │ │ │ │ │ -234 } │ │ │ │ │ -235 │ │ │ │ │ -_2_4_3 _~_D_e_b_u_g_S_t_r_e_a_m() │ │ │ │ │ -244 { │ │ │ │ │ -245 // untie │ │ │ │ │ -246 if (___t_i_e_d) │ │ │ │ │ -247 tiedstate->___t_i_e_d___s_t_r_e_a_m_s--; │ │ │ │ │ -248 else { │ │ │ │ │ -249 // check if somebody still ties to us... │ │ │ │ │ -250 if (___t_i_e_d___s_t_r_e_a_m_s != 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 (_c_u_r_r_e_n_t != 0) { │ │ │ │ │ -259 _S_t_r_e_a_m_W_r_a_p *s = _c_u_r_r_e_n_t; │ │ │ │ │ -260 _c_u_r_r_e_n_t = _c_u_r_r_e_n_t->_n_e_x_t; │ │ │ │ │ -261 delete s; │ │ │ │ │ -262 } │ │ │ │ │ +226 // Methods needed by the forward iterator │ │ │ │ │ +_2_2_7 bool _e_q_u_a_l_s(const _M_u_t_a_b_l_e_I_t_e_r_a_t_o_r & other) const │ │ │ │ │ +228 { │ │ │ │ │ +229 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ +230 } │ │ │ │ │ +231 │ │ │ │ │ +_2_3_2 bool _e_q_u_a_l_s(const _C_o_n_s_t_I_t_e_r_a_t_o_r & other) const │ │ │ │ │ +233 { │ │ │ │ │ +234 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +_2_3_7 _R_e_f_e_r_e_n_c_e _d_e_r_e_f_e_r_e_n_c_e() const { │ │ │ │ │ +238 return container_->operator[](position_); │ │ │ │ │ +239 } │ │ │ │ │ +240 │ │ │ │ │ +_2_4_1 void _i_n_c_r_e_m_e_n_t(){ │ │ │ │ │ +242 ++position_; │ │ │ │ │ +243 } │ │ │ │ │ +244 │ │ │ │ │ +245 // Additional function needed by BidirectionalIterator │ │ │ │ │ +_2_4_6 void _d_e_c_r_e_m_e_n_t(){ │ │ │ │ │ +247 --position_; │ │ │ │ │ +248 } │ │ │ │ │ +249 │ │ │ │ │ +250 // Additional function needed by RandomAccessIterator │ │ │ │ │ +_2_5_1 _R_e_f_e_r_e_n_c_e _e_l_e_m_e_n_t_A_t(_D_i_f_f_e_r_e_n_c_e_T_y_p_e i) const { │ │ │ │ │ +252 return container_->operator[](position_+i); │ │ │ │ │ +253 } │ │ │ │ │ +254 │ │ │ │ │ +_2_5_5 void _a_d_v_a_n_c_e(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n){ │ │ │ │ │ +256 position_=position_+n; │ │ │ │ │ +257 } │ │ │ │ │ +258 │ │ │ │ │ +_2_5_9 _D_i_f_f_e_r_e_n_c_e_T_y_p_e _d_i_s_t_a_n_c_e_T_o(const _M_u_t_a_b_l_e_I_t_e_r_a_t_o_r& other) const │ │ │ │ │ +260 { │ │ │ │ │ +261 assert(other.container_==container_); │ │ │ │ │ +262 return other.position_ - position_; │ │ │ │ │ 263 } │ │ │ │ │ 264 │ │ │ │ │ -266 template │ │ │ │ │ -_2_6_7 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(const T data) { │ │ │ │ │ -268 // remove the following code if stream wasn't compiled active │ │ │ │ │ -269 if (activator::value) { │ │ │ │ │ -270 if (! ___t_i_e_d) { │ │ │ │ │ -271 if (___a_c_t_i_v_e) │ │ │ │ │ -272 _c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ -273 } else { │ │ │ │ │ -274 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ -275 tiedstate->_c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ -276 } │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -279 return *this; │ │ │ │ │ -280 } │ │ │ │ │ -281 │ │ │ │ │ -_2_8_9 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(const int data) { │ │ │ │ │ -290 // remove the following code if stream wasn't compiled active │ │ │ │ │ -291 if (activator::value) { │ │ │ │ │ -292 if (! ___t_i_e_d) { │ │ │ │ │ -293 if (___a_c_t_i_v_e) │ │ │ │ │ -294 _c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ -295 } else { │ │ │ │ │ -296 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ -297 tiedstate->_c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ -298 } │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -301 return *this; │ │ │ │ │ -302 } │ │ │ │ │ -303 │ │ │ │ │ -_3_0_5 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(std::ostream& (*f)(std::ostream&)) { │ │ │ │ │ -306 if (activator::value) { │ │ │ │ │ -307 if (! ___t_i_e_d) { │ │ │ │ │ -308 if (___a_c_t_i_v_e) │ │ │ │ │ -309 f(_c_u_r_r_e_n_t->_o_u_t); │ │ │ │ │ -310 } else { │ │ │ │ │ -311 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ -312 f(tiedstate->_c_u_r_r_e_n_t->_o_u_t); │ │ │ │ │ -313 } │ │ │ │ │ -314 } │ │ │ │ │ -315 │ │ │ │ │ -316 return *this; │ │ │ │ │ -317 } │ │ │ │ │ -318 │ │ │ │ │ -_3_2_0 _D_e_b_u_g_S_t_r_e_a_m& _f_l_u_s_h() { │ │ │ │ │ -321 if (activator::value) { │ │ │ │ │ -322 if (! ___t_i_e_d) { │ │ │ │ │ -323 if (___a_c_t_i_v_e) │ │ │ │ │ -324 _c_u_r_r_e_n_t->_o_u_t.flush(); │ │ │ │ │ -325 } else { │ │ │ │ │ -326 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ -327 tiedstate->_c_u_r_r_e_n_t->_o_u_t.flush(); │ │ │ │ │ -328 } │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -331 return *this; │ │ │ │ │ -332 } │ │ │ │ │ -333 │ │ │ │ │ -_3_3_5 void _p_u_s_h(bool b) { │ │ │ │ │ -336 // are we at all active? │ │ │ │ │ -337 if (activator::value) { │ │ │ │ │ -338 _actstack.push(___a_c_t_i_v_e); │ │ │ │ │ -339 ___a_c_t_i_v_e = b; │ │ │ │ │ -340 } else { │ │ │ │ │ -341 // stay off │ │ │ │ │ -342 _actstack.push(false); │ │ │ │ │ -343 } │ │ │ │ │ -344 } │ │ │ │ │ -345 │ │ │ │ │ -_3_4_9 void _p_o_p() { │ │ │ │ │ -350 if (_actstack.empty()) │ │ │ │ │ -351 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "No previous activation setting!"); │ │ │ │ │ -352 │ │ │ │ │ -353 ___a_c_t_i_v_e = _actstack.top(); │ │ │ │ │ -354 _actstack.pop(); │ │ │ │ │ -355 } │ │ │ │ │ -356 │ │ │ │ │ -_3_6_3 bool _a_c_t_i_v_e() const { │ │ │ │ │ -364 return activator::value && ___a_c_t_i_v_e; │ │ │ │ │ -365 } │ │ │ │ │ -366 │ │ │ │ │ -_3_7_1 void _a_t_t_a_c_h(std::ostream& stream) { │ │ │ │ │ -372 if (___t_i_e_d) │ │ │ │ │ -373 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot attach to a tied stream!"); │ │ │ │ │ -374 │ │ │ │ │ -375 _S_t_r_e_a_m_W_r_a_p* newcurr = new _S_t_r_e_a_m_W_r_a_p(stream); │ │ │ │ │ -376 newcurr->_n_e_x_t = _c_u_r_r_e_n_t; │ │ │ │ │ -377 _c_u_r_r_e_n_t = newcurr; │ │ │ │ │ -378 } │ │ │ │ │ -379 │ │ │ │ │ -_3_8_3 void _d_e_t_a_c_h() { │ │ │ │ │ -384 if (_c_u_r_r_e_n_t->_n_e_x_t == 0) │ │ │ │ │ -385 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot detach initial stream!"); │ │ │ │ │ -386 if (___t_i_e_d) │ │ │ │ │ -387 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot detach a tied stream!"); │ │ │ │ │ -388 │ │ │ │ │ -389 _S_t_r_e_a_m_W_r_a_p* old = _c_u_r_r_e_n_t; │ │ │ │ │ -390 _c_u_r_r_e_n_t = _c_u_r_r_e_n_t->_n_e_x_t; │ │ │ │ │ -391 delete old; │ │ │ │ │ -392 } │ │ │ │ │ -393 │ │ │ │ │ -_3_9_7 void _t_i_e(_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e& to) { │ │ │ │ │ -398 if (to.___t_i_e_d) │ │ │ │ │ -399 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot tie to an already tied stream!"); │ │ │ │ │ -400 if (___t_i_e_d) │ │ │ │ │ -401 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Stream already tied: untie first!"); │ │ │ │ │ -402 │ │ │ │ │ -403 ___t_i_e_d = true; │ │ │ │ │ -404 tiedstate = &to; │ │ │ │ │ -405 │ │ │ │ │ -406 // tell master class │ │ │ │ │ -407 tiedstate->___t_i_e_d___s_t_r_e_a_m_s++; │ │ │ │ │ -408 } │ │ │ │ │ -409 │ │ │ │ │ -_4_1_3 void _u_n_t_i_e() { │ │ │ │ │ -414 if(! ___t_i_e_d) │ │ │ │ │ -415 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot untie, stream is not tied!"); │ │ │ │ │ -416 │ │ │ │ │ -417 tiedstate->___t_i_e_d___s_t_r_e_a_m_s--; │ │ │ │ │ -418 ___t_i_e_d = false; │ │ │ │ │ -419 tiedstate = 0; │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -422 private: │ │ │ │ │ -424 _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e* tiedstate; │ │ │ │ │ -425 │ │ │ │ │ -430 std::stack _actstack; │ │ │ │ │ -431 }; │ │ │ │ │ -432 │ │ │ │ │ -434} │ │ │ │ │ -435 │ │ │ │ │ -436 │ │ │ │ │ -437#endif │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ -StreamWrap(std::ostream &_out) │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ -DebugStream(std::ostream &out=std::cerr) │ │ │ │ │ -Create a DebugStream and set initial output stream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:199 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_u_n_t_i_e │ │ │ │ │ -void untie() │ │ │ │ │ -Untie stream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:413 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_f_l_u_s_h │ │ │ │ │ -DebugStream & flush() │ │ │ │ │ -pass on flush to underlying output stream │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_a_t_t_a_c_h │ │ │ │ │ -void attach(std::ostream &stream) │ │ │ │ │ -set output to a different stream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_d_e_t_a_c_h │ │ │ │ │ -void detach() │ │ │ │ │ -detach current output stream and restore to previous stream │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:383 │ │ │ │ │ -_D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s_:_:_v_a_l_u_e │ │ │ │ │ -static constexpr bool value │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_o_u_t │ │ │ │ │ -std::ostream & out │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_p_o_p │ │ │ │ │ -void pop() │ │ │ │ │ -restore previously set activation flag │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:349 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_a_c_t_i_v_e │ │ │ │ │ -bool active() const │ │ │ │ │ -reports if this stream will produce output │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:363 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___a_c_t_i_v_e │ │ │ │ │ -bool _active │ │ │ │ │ -flag to switch output during runtime │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___t_i_e_d___s_t_r_e_a_m_s │ │ │ │ │ -unsigned int _tied_streams │ │ │ │ │ -how many streams are tied to this state │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_t_i_e │ │ │ │ │ -void tie(DebugStreamState &to) │ │ │ │ │ -Tie a stream to this one. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:397 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_p_u_s_h │ │ │ │ │ -void push(bool b) │ │ │ │ │ -set activation flag and store old value │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:335 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ -unsigned int DebugLevel │ │ │ │ │ -Type for debug levels. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___t_i_e_d │ │ │ │ │ -bool _tied │ │ │ │ │ -are we tied to another DebugStream? │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:_c_u_r_r_e_n_t │ │ │ │ │ -StreamWrap * current │ │ │ │ │ -current output stream and link to possibly pushed old output streams │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -DebugStream & operator<<(const T data) │ │ │ │ │ -Generic types are passed on to current output stream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l_:_:_v_a_l_u_e │ │ │ │ │ -static constexpr bool value │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_~_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ -~DebugStream() │ │ │ │ │ -Destroy stream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ -DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr) │ │ │ │ │ -Create a DebugStream and directly tie to another DebugStream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -DebugStream & operator<<(const int data) │ │ │ │ │ -explicit specialization so that enums can be printed │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -DebugStream & operator<<(std::ostream &(*f)(std::ostream &)) │ │ │ │ │ -pass on manipulators to underlying output stream │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:305 │ │ │ │ │ -_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_n_e_x_t │ │ │ │ │ -StreamWrap * next │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:154 │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_2_6_5 _D_i_f_f_e_r_e_n_c_e_T_y_p_e _d_i_s_t_a_n_c_e_T_o(const _C_o_n_s_t_I_t_e_r_a_t_o_r& other) const │ │ │ │ │ +266 { │ │ │ │ │ +267 assert(other.container_==container_); │ │ │ │ │ +268 return other.position_ - position_; │ │ │ │ │ +269 } │ │ │ │ │ +270 │ │ │ │ │ +271 private: │ │ │ │ │ +272 _C_o_n_t_a_i_n_e_r *container_; │ │ │ │ │ +273 _D_i_f_f_e_r_e_n_c_e_T_y_p_e position_; │ │ │ │ │ +274 }; │ │ │ │ │ +275 │ │ │ │ │ +278} // end namespace Dune │ │ │ │ │ +279 │ │ │ │ │ +280#endif │ │ │ │ │ +_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h │ │ │ │ │ +This file implements iterator facade classes for writing stl conformant │ │ │ │ │ +iterators. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l │ │ │ │ │ -Greater or equal template test. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s │ │ │ │ │ -activate if current and mask have common bits switched on. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r │ │ │ │ │ -standard exception for the debugstream │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e │ │ │ │ │ -Intermediate class to implement tie-operation of DebugStream. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ -Generic class to implement debug output streams. │ │ │ │ │ -DDeeffiinniittiioonn debugstream.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_I_O_E_r_r_o_r │ │ │ │ │ -Default exception class for I/O errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:231 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +Get the 'const' version of a reference to a mutable object. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_:_:_t_y_p_e │ │ │ │ │ +const R type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _>_:_:_t_y_p_e │ │ │ │ │ +const R type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _R_ _&_ _>_:_:_t_y_p_e │ │ │ │ │ +const R & type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _&_ _>_:_:_t_y_p_e │ │ │ │ │ +const R & type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e │ │ │ │ │ +get the 'mutable' version of a reference to a const object │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_:_:_t_y_p_e │ │ │ │ │ +R type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _c_o_n_s_t_ _R_ _>_:_:_t_y_p_e │ │ │ │ │ +R type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _R_ _&_ _>_:_:_t_y_p_e │ │ │ │ │ +R & type │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r │ │ │ │ │ +Generic class for stl-conforming iterators for container classes with operator │ │ │ │ │ +[]. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r │ │ │ │ │ +GenericIterator(const MutableIterator &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const MutableIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ +Reference elementAt(DifferenceType i) const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:251 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r │ │ │ │ │ +GenericIterator(const ConstIterator &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:223 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +void advance(DifferenceType n) │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r │ │ │ │ │ +GenericIterator(Container &cont, DifferenceType pos) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:200 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_D_i_f_f_e_r_e_n_c_e_T_y_p_e │ │ │ │ │ +D DifferenceType │ │ │ │ │ +The type of the difference between two positions. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ +R Reference │ │ │ │ │ +The type of the reference to the values accessed. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +DifferenceType distanceTo(const MutableIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +C Container │ │ │ │ │ +The type of container we are an iterator for. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_V_a_l_u_e │ │ │ │ │ +T Value │ │ │ │ │ +The value type of the iterator. │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +DifferenceType distanceTo(const ConstIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:265 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +Reference dereference() const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const ConstIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn genericiterator.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ +Base class for stl conformant forward iterators. │ │ │ │ │ +DDeeffiinniittiioonn iteratorfacades.hh:434 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: quadmath.hh File Reference │ │ │ │ +dune-common: iteratorrange.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,19 +69,35 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
quadmath.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
iteratorrange.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::IteratorRange< Iterator >
 Simple range between a begin and an end iterator. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,10 +1,19 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -quadmath.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +iteratorrange.hh File Reference │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_<_ _I_t_e_r_a_t_o_r_ _> │ │ │ │ │ +  Simple range between a begin and an end iterator. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: quadmath.hh Source File │ │ │ │ +dune-common: iteratorrange.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,490 +74,84 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
quadmath.hh
│ │ │ │ +
iteratorrange.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_QUADMATH_HH
│ │ │ │ -
6#define DUNE_QUADMATH_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │ +
6#define DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │
7
│ │ │ │ -
8#if HAVE_QUADMATH
│ │ │ │ -
9#include <quadmath.h>
│ │ │ │ -
10
│ │ │ │ -
11#include <cmath>
│ │ │ │ -
12#include <cstddef>
│ │ │ │ -
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;
│ │ │ │ -
29
│ │ │ │ -
30 } // end namespace Impl
│ │ │ │ -
31
│ │ │ │ -
32 using Impl::Float128;
│ │ │ │ -
33
│ │ │ │ -
34 // The purpose of this namespace is to move the `<cmath>` function overloads
│ │ │ │ -
35 // out of namespace `Dune`, see AlignedNumber in debugalign.hh.
│ │ │ │ -
36 namespace Impl
│ │ │ │ -
37 {
│ │ │ │ -
38 using float128_t = __float128;
│ │ │ │ -
39
│ │ │ │ -
41 class Float128
│ │ │ │ -
42 {
│ │ │ │ -
43 float128_t value_ = 0.0q;
│ │ │ │ +
8namespace Dune {
│ │ │ │ +
9
│ │ │ │ +
11
│ │ │ │ +
20 template<typename Iterator>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
22 {
│ │ │ │ +
23
│ │ │ │ +
24 public:
│ │ │ │ +
25
│ │ │ │ +
27 typedef Iterator iterator;
│ │ │ │ +
28
│ │ │ │ +
30
│ │ │ │ +
33 typedef Iterator const_iterator;
│ │ │ │ +
34
│ │ │ │ +
│ │ │ │ +
36 IteratorRange(const Iterator& begin, const Iterator& end)
│ │ │ │ +
37 : _begin(begin)
│ │ │ │ +
38 , _end(end)
│ │ │ │ +
39 {}
│ │ │ │ +
│ │ │ │ +
40
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
43 {}
│ │ │ │ +
│ │ │ │
44
│ │ │ │ -
45 public:
│ │ │ │ -
46 constexpr Float128() = default;
│ │ │ │ -
47 constexpr Float128(const float128_t& value) noexcept
│ │ │ │ -
48 : value_(value)
│ │ │ │ -
49 {}
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
47 {
│ │ │ │ +
48 return _begin;
│ │ │ │ +
49 }
│ │ │ │ +
│ │ │ │
50
│ │ │ │ -
51 // constructor from any floating-point or integer type
│ │ │ │ -
52 template <class T,
│ │ │ │ -
53 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
│ │ │ │ -
54 constexpr Float128(const T& value) noexcept
│ │ │ │ -
55 : value_(value)
│ │ │ │ -
56 {}
│ │ │ │ -
57
│ │ │ │ -
58 // constructor from pointer to null-terminated byte string
│ │ │ │ -
59 explicit Float128(const char* str) noexcept
│ │ │ │ -
60 : value_(strtoflt128(str, NULL))
│ │ │ │ -
61 {}
│ │ │ │ -
62
│ │ │ │ -
63 // accessors
│ │ │ │ -
64 constexpr operator float128_t() const noexcept { return value_; }
│ │ │ │ +
│ │ │ │ +
52 iterator end() const
│ │ │ │ +
53 {
│ │ │ │ +
54 return _end;
│ │ │ │ +
55 }
│ │ │ │ +
│ │ │ │ +
56
│ │ │ │ +
57 private:
│ │ │ │ +
58
│ │ │ │ +
59 Iterator _begin;
│ │ │ │ +
60 Iterator _end;
│ │ │ │ +
61
│ │ │ │ +
62 };
│ │ │ │ +
│ │ │ │ +
63
│ │ │ │ +
64}
│ │ │ │
65
│ │ │ │ -
66 constexpr float128_t const& value() const noexcept { return value_; }
│ │ │ │ -
67 constexpr float128_t& value() noexcept { return value_; }
│ │ │ │ -
68
│ │ │ │ -
69 // I/O
│ │ │ │ -
70 template<class CharT, class Traits>
│ │ │ │ -
71 friend std::basic_istream<CharT, Traits>&
│ │ │ │ -
72 operator>>(std::basic_istream<CharT, Traits>& in, Float128& x)
│ │ │ │ -
73 {
│ │ │ │ -
74 std::string buf;
│ │ │ │ -
75 buf.reserve(128);
│ │ │ │ -
76 in >> buf;
│ │ │ │ -
77 x.value() = strtoflt128(buf.c_str(), NULL);
│ │ │ │ -
78 return in;
│ │ │ │ -
79 }
│ │ │ │ -
80
│ │ │ │ -
81 template<class CharT, class Traits>
│ │ │ │ -
82 friend std::basic_ostream<CharT, Traits>&
│ │ │ │ -
83 operator<<(std::basic_ostream<CharT, Traits>& out, const Float128& x)
│ │ │ │ -
84 {
│ │ │ │ -
85 const std::size_t bufSize = 128;
│ │ │ │ -
86 CharT buf[128];
│ │ │ │ -
87
│ │ │ │ -
88 std::string format = "%." + std::to_string(out.precision()) + "Q" +
│ │ │ │ -
89 ((out.flags() | std::ios_base::scientific) ? "e" : "f");
│ │ │ │ -
90 const int numChars = quadmath_snprintf(buf, bufSize, format.c_str(), x.value());
│ │ │ │ -
91 if (std::size_t(numChars) >= bufSize) {
│ │ │ │ -
92 DUNE_THROW(Dune::RangeError, "Failed to print Float128 value: buffer overflow");
│ │ │ │ -
93 }
│ │ │ │ -
94 out << buf;
│ │ │ │ -
95 return out;
│ │ │ │ -
96 }
│ │ │ │ -
97
│ │ │ │ -
98 // Increment, decrement
│ │ │ │ -
99 constexpr Float128& operator++() noexcept { ++value_; return *this; }
│ │ │ │ -
100 constexpr Float128& operator--() noexcept { --value_; return *this; }
│ │ │ │ -
101
│ │ │ │ -
102 constexpr Float128 operator++(int) noexcept { Float128 tmp{*this}; ++value_; return tmp; }
│ │ │ │ -
103 constexpr Float128 operator--(int) noexcept { Float128 tmp{*this}; --value_; return tmp; }
│ │ │ │ -
104
│ │ │ │ -
105 // unary operators
│ │ │ │ -
106 constexpr Float128 operator+() const noexcept { return Float128{+value_}; }
│ │ │ │ -
107 constexpr Float128 operator-() const noexcept { return Float128{-value_}; }
│ │ │ │ -
108
│ │ │ │ -
109 // assignment operators
│ │ │ │ -
110#define DUNE_ASSIGN_OP(OP) \
│ │ │ │ -
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(-=);
│ │ │ │ -
120
│ │ │ │ -
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
│ │ │ │ -
130 // in the first or second argument.
│ │ │ │ -
131#define DUNE_BINARY_OP(OP) \
│ │ │ │ -
132 constexpr Float128 operator OP(const Float128& t, \
│ │ │ │ -
133 const Float128& u) noexcept \
│ │ │ │ -
134 { \
│ │ │ │ -
135 return Float128{float128_t(t) OP float128_t(u)}; \
│ │ │ │ -
136 } \
│ │ │ │ -
137 constexpr Float128 operator OP(const float128_t& t, \
│ │ │ │ -
138 const Float128& u) noexcept \
│ │ │ │ -
139 { \
│ │ │ │ -
140 return Float128{t OP float128_t(u)}; \
│ │ │ │ -
141 } \
│ │ │ │ -
142 constexpr Float128 operator OP(const Float128& t, \
│ │ │ │ -
143 const float128_t& u) noexcept \
│ │ │ │ -
144 { \
│ │ │ │ -
145 return Float128{float128_t(t) OP u}; \
│ │ │ │ -
146 } \
│ │ │ │ -
147 template <class T, \
│ │ │ │ -
148 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \
│ │ │ │ -
149 constexpr Float128 operator OP(const T& t, \
│ │ │ │ -
150 const Float128& u) noexcept \
│ │ │ │ -
151 { \
│ │ │ │ -
152 return Float128{float128_t(t) OP float128_t(u)}; \
│ │ │ │ -
153 } \
│ │ │ │ -
154 template <class U, \
│ │ │ │ -
155 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \
│ │ │ │ -
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) \
│ │ │ │ -
174 constexpr bool operator OP(const Float128& t, \
│ │ │ │ -
175 const Float128& u) noexcept \
│ │ │ │ -
176 { \
│ │ │ │ -
177 return float128_t(t) OP float128_t(u); \
│ │ │ │ -
178 } \
│ │ │ │ -
179 template <class T, \
│ │ │ │ -
180 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \
│ │ │ │ -
181 constexpr bool operator OP(const T& t, \
│ │ │ │ -
182 const Float128& u) noexcept \
│ │ │ │ -
183 { \
│ │ │ │ -
184 return float128_t(t) OP float128_t(u); \
│ │ │ │ -
185 } \
│ │ │ │ -
186 template <class U, \
│ │ │ │ -
187 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \
│ │ │ │ -
188 constexpr bool operator OP(const Float128& t, \
│ │ │ │ -
189 const U& u) noexcept \
│ │ │ │ -
190 { \
│ │ │ │ -
191 return float128_t(t) OP float128_t(u); \
│ │ │ │ -
192 } \
│ │ │ │ -
193 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
194
│ │ │ │ -
195 DUNE_BINARY_BOOL_OP(==);
│ │ │ │ -
196 DUNE_BINARY_BOOL_OP(!=);
│ │ │ │ -
197 DUNE_BINARY_BOOL_OP(<);
│ │ │ │ -
198 DUNE_BINARY_BOOL_OP(>);
│ │ │ │ -
199 DUNE_BINARY_BOOL_OP(<=);
│ │ │ │ -
200 DUNE_BINARY_BOOL_OP(>=);
│ │ │ │ -
201
│ │ │ │ -
202#undef DUNE_BINARY_BOOL_OP
│ │ │ │ -
203
│ │ │ │ -
204 // Overloads for the cmath functions
│ │ │ │ -
205
│ │ │ │ -
206 // function with name `name` redirects to quadmath function `func`
│ │ │ │ -
207#define DUNE_UNARY_FUNC(name,func) \
│ │ │ │ -
208 inline Float128 name(const Float128& u) noexcept \
│ │ │ │ -
209 { \
│ │ │ │ -
210 return Float128{func (float128_t(u))}; \
│ │ │ │ -
211 } \
│ │ │ │ -
212 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
213
│ │ │ │ -
214 // like DUNE_UNARY_FUNC but with custom return type
│ │ │ │ -
215#define DUNE_CUSTOM_UNARY_FUNC(type,name,func) \
│ │ │ │ -
216 inline type name(const Float128& u) noexcept \
│ │ │ │ -
217 { \
│ │ │ │ -
218 return (type)(func (float128_t(u))); \
│ │ │ │ -
219 } \
│ │ │ │ -
220 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
221
│ │ │ │ -
222 // redirects to quadmath function with two arguments
│ │ │ │ -
223#define DUNE_BINARY_FUNC(name,func) \
│ │ │ │ -
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);
│ │ │ │ -
248 DUNE_CUSTOM_UNARY_FUNC(int, ilogb, ilogbq);
│ │ │ │ -
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);
│ │ │ │ -
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);
│ │ │ │ -
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);
│ │ │ │ -
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
│ │ │ │ -
278#undef DUNE_CUSTOM_UNARY_FUNC
│ │ │ │ -
279#undef DUNE_BINARY_FUNC
│ │ │ │ -
280
│ │ │ │ -
281 // like DUNE_BINARY_FUNC but provide overloads with arithmetic
│ │ │ │ -
282 // types in the first or second argument.
│ │ │ │ -
283#define DUNE_BINARY_ARITHMETIC_FUNC(name,func) \
│ │ │ │ -
284 inline Float128 name(const Float128& t, \
│ │ │ │ -
285 const Float128& u) noexcept \
│ │ │ │ -
286 { \
│ │ │ │ -
287 return Float128{func (float128_t(t), float128_t(u))}; \
│ │ │ │ -
288 } \
│ │ │ │ -
289 template <class T, \
│ │ │ │ -
290 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \
│ │ │ │ -
291 inline Float128 name(const T& t, \
│ │ │ │ -
292 const Float128& u) noexcept \
│ │ │ │ -
293 { \
│ │ │ │ -
294 return Float128{func (float128_t(t), float128_t(u))}; \
│ │ │ │ -
295 } \
│ │ │ │ -
296 template <class U, \
│ │ │ │ -
297 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \
│ │ │ │ -
298 inline Float128 name(const Float128& t, \
│ │ │ │ -
299 const U& u) noexcept \
│ │ │ │ -
300 { \
│ │ │ │ -
301 return Float128{func (float128_t(t), float128_t(u))}; \
│ │ │ │ -
302 } \
│ │ │ │ -
303 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
304
│ │ │ │ -
305 DUNE_BINARY_ARITHMETIC_FUNC(atan2,atan2q);
│ │ │ │ -
306 DUNE_BINARY_ARITHMETIC_FUNC(copysign,copysignq);
│ │ │ │ -
307 DUNE_BINARY_ARITHMETIC_FUNC(fdim,fdimq);
│ │ │ │ -
308 DUNE_BINARY_ARITHMETIC_FUNC(fmax,fmaxq);
│ │ │ │ -
309 DUNE_BINARY_ARITHMETIC_FUNC(fmin,fminq);
│ │ │ │ -
310 DUNE_BINARY_ARITHMETIC_FUNC(fmod,fmodq);
│ │ │ │ -
311 DUNE_BINARY_ARITHMETIC_FUNC(hypot,hypotq);
│ │ │ │ -
312 DUNE_BINARY_ARITHMETIC_FUNC(remainder,remainderq);
│ │ │ │ -
313
│ │ │ │ -
314#undef DUNE_BINARY_ARITHMETIC_FUNC
│ │ │ │ -
315
│ │ │ │ -
316 // some more cmath functions with special signature
│ │ │ │ -
317
│ │ │ │ -
318 inline Float128 fma(const Float128& t, const Float128& u, const Float128& v)
│ │ │ │ -
319 {
│ │ │ │ -
320 return Float128{fmaq(float128_t(t),float128_t(u),float128_t(v))};
│ │ │ │ -
321 }
│ │ │ │ -
322
│ │ │ │ -
323 inline Float128 frexp(const Float128& u, int* p)
│ │ │ │ -
324 {
│ │ │ │ -
325 return Float128{frexpq(float128_t(u), p)};
│ │ │ │ -
326 }
│ │ │ │ -
327
│ │ │ │ -
328 inline Float128 ldexp(const Float128& u, int p)
│ │ │ │ -
329 {
│ │ │ │ -
330 return Float128{ldexpq(float128_t(u), p)};
│ │ │ │ -
331 }
│ │ │ │ -
332
│ │ │ │ -
333 inline Float128 remquo(const Float128& t, const Float128& u, int* quo)
│ │ │ │ -
334 {
│ │ │ │ -
335 return Float128{remquoq(float128_t(t), float128_t(u), quo)};
│ │ │ │ -
336 }
│ │ │ │ -
337
│ │ │ │ -
338 inline Float128 scalbln(const Float128& u, long int e)
│ │ │ │ -
339 {
│ │ │ │ -
340 return Float128{scalblnq(float128_t(u), e)};
│ │ │ │ -
341 }
│ │ │ │ -
342
│ │ │ │ -
343 inline Float128 scalbn(const Float128& u, int e)
│ │ │ │ -
344 {
│ │ │ │ -
345 return Float128{scalbnq(float128_t(u), e)};
│ │ │ │ -
346 }
│ │ │ │ -
347
│ │ │ │ -
349 // NOTE: This is much faster than a pow(x, Float128(p)) call
│ │ │ │ -
350 // NOTE: This is a modified version of boost::math::cstdfloat::detail::pown
│ │ │ │ -
351 // (adapted to the type Float128) that is part of the Boost 1.65 Math toolkit 2.8.0
│ │ │ │ -
352 // and is implemented by Christopher Kormanyos, John Maddock, and Paul A. Bristow,
│ │ │ │ -
353 // distributed under the Boost Software License, Version 1.0
│ │ │ │ -
354 // (See http://www.boost.org/LICENSE_1_0.txt)
│ │ │ │ -
355 template <class Int,
│ │ │ │ -
356 std::enable_if_t<std::is_integral<Int>::value, int> = 0>
│ │ │ │ -
357 inline Float128 pow(const Float128& x, const Int p)
│ │ │ │ -
358 {
│ │ │ │ -
359 static const Float128 max_value = FLT128_MAX;
│ │ │ │ -
360 static const Float128 min_value = FLT128_MIN;
│ │ │ │ -
361 static const Float128 inf_value = float128_t{1} / float128_t{0};
│ │ │ │ -
362
│ │ │ │ -
363 const bool isneg = (x < 0);
│ │ │ │ -
364 const bool isnan = (x != x);
│ │ │ │ -
365 const bool isinf = (isneg ? bool(-x > max_value) : bool(+x > max_value));
│ │ │ │ -
366
│ │ │ │ -
367 if (isnan) { return x; }
│ │ │ │ -
368 if (isinf) { return Float128{nanq("")}; }
│ │ │ │ -
369
│ │ │ │ -
370 const Float128 abs_x = (isneg ? -x : x);
│ │ │ │ -
371 if (p < Int(0)) {
│ │ │ │ -
372 if (abs_x < min_value)
│ │ │ │ -
373 return (isneg ? -inf_value : +inf_value);
│ │ │ │ -
374 else
│ │ │ │ -
375 return Float128(1) / pow(x, Int(-p));
│ │ │ │ -
376 }
│ │ │ │ -
377
│ │ │ │ -
378 if (p == Int(0)) { return Float128(1); }
│ │ │ │ -
379 if (p == Int(1)) { return x; }
│ │ │ │ -
380 if (abs_x > max_value)
│ │ │ │ -
381 return (isneg ? -inf_value : +inf_value);
│ │ │ │ -
382
│ │ │ │ -
383 if (p == Int(2)) { return (x * x); }
│ │ │ │ -
384 if (p == Int(3)) { return ((x * x) * x); }
│ │ │ │ -
385 if (p == Int(4)) { const Float128 x2 = (x * x); return (x2 * x2); }
│ │ │ │ -
386
│ │ │ │ -
387 Float128 result = ((p % Int(2)) != Int(0)) ? x : Float128(1);
│ │ │ │ -
388 Float128 xn = x; // binary powers of x
│ │ │ │ -
389
│ │ │ │ -
390 Int p2 = p;
│ │ │ │ -
391 while (Int(p2 /= 2) != Int(0)) {
│ │ │ │ -
392 xn *= xn; // Square xn for each binary power
│ │ │ │ -
393
│ │ │ │ -
394 const bool has_binary_power = (Int(p2 % Int(2)) != Int(0));
│ │ │ │ -
395 if (has_binary_power)
│ │ │ │ -
396 result *= xn;
│ │ │ │ -
397 }
│ │ │ │ -
398
│ │ │ │ -
399 return result;
│ │ │ │ -
400 }
│ │ │ │ -
401
│ │ │ │ -
402
│ │ │ │ -
403 } // end namespace Impl
│ │ │ │ -
404
│ │ │ │ -
405 template <>
│ │ │ │ -
406 struct IsNumber<Impl::Float128>
│ │ │ │ -
407 : public std::true_type {};
│ │ │ │ -
408
│ │ │ │ -
409} // end namespace Dune
│ │ │ │ -
410
│ │ │ │ -
411namespace std
│ │ │ │ -
412{
│ │ │ │ -
413#ifndef NO_STD_NUMERIC_LIMITS_SPECIALIZATION
│ │ │ │ -
414 template <>
│ │ │ │ -
415 class numeric_limits<Dune::Impl::Float128>
│ │ │ │ -
416 {
│ │ │ │ -
417 using Float128 = Dune::Impl::Float128;
│ │ │ │ -
418 using float128_t = Dune::Impl::float128_t;
│ │ │ │ -
419
│ │ │ │ -
420 public:
│ │ │ │ -
421 static constexpr bool is_specialized = true;
│ │ │ │ -
422 static constexpr Float128 min() noexcept { return FLT128_MIN; }
│ │ │ │ -
423 static constexpr Float128 max() noexcept { return FLT128_MAX; }
│ │ │ │ -
424 static constexpr Float128 lowest() noexcept { return -FLT128_MAX; }
│ │ │ │ -
425 static constexpr int digits = FLT128_MANT_DIG;
│ │ │ │ -
426 static constexpr int digits10 = 34;
│ │ │ │ -
427 static constexpr int max_digits10 = 36;
│ │ │ │ -
428 static constexpr bool is_signed = true;
│ │ │ │ -
429 static constexpr bool is_integer = false;
│ │ │ │ -
430 static constexpr bool is_exact = false;
│ │ │ │ -
431 static constexpr int radix = 2;
│ │ │ │ -
432 static constexpr Float128 epsilon() noexcept { return FLT128_EPSILON; }
│ │ │ │ -
433 static constexpr Float128 round_error() noexcept { return float128_t{0.5}; }
│ │ │ │ -
434 static constexpr int min_exponent = FLT128_MIN_EXP;
│ │ │ │ -
435 static constexpr int min_exponent10 = FLT128_MIN_10_EXP;
│ │ │ │ -
436 static constexpr int max_exponent = FLT128_MAX_EXP;
│ │ │ │ -
437 static constexpr int max_exponent10 = FLT128_MAX_10_EXP;
│ │ │ │ -
438 static constexpr bool has_infinity = true;
│ │ │ │ -
439 static constexpr bool has_quiet_NaN = true;
│ │ │ │ -
440 static constexpr bool has_signaling_NaN = false;
│ │ │ │ -
441 static constexpr float_denorm_style has_denorm = denorm_present;
│ │ │ │ -
442 static constexpr bool has_denorm_loss = false;
│ │ │ │ -
443 static constexpr Float128 infinity() noexcept { return float128_t{1}/float128_t{0}; }
│ │ │ │ -
444 static Float128 quiet_NaN() noexcept { return nanq(""); }
│ │ │ │ -
445 static constexpr Float128 signaling_NaN() noexcept { return float128_t{}; }
│ │ │ │ -
446 static constexpr Float128 denorm_min() noexcept { return FLT128_DENORM_MIN; }
│ │ │ │ -
447 static constexpr bool is_iec559 = true;
│ │ │ │ -
448 static constexpr bool is_bounded = false;
│ │ │ │ -
449 static constexpr bool is_modulo = false;
│ │ │ │ -
450 static constexpr bool traps = false;
│ │ │ │ -
451 static constexpr bool tinyness_before = false;
│ │ │ │ -
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.
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ -
STL namespace.
│ │ │ │ +
66#endif // DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
T max_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:481
│ │ │ │ -
T min_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:487
│ │ │ │ -
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
│ │ │ │ -
Default exception class for range errors.
Definition exceptions.hh:254
│ │ │ │ +
Simple range between a begin and an end iterator.
Definition iteratorrange.hh:22
│ │ │ │ +
iterator begin() const
Returns an iterator pointing to the begin of the range.
Definition iteratorrange.hh:46
│ │ │ │ +
Iterator const_iterator
The iterator belonging to this range.
Definition iteratorrange.hh:33
│ │ │ │ +
iterator end() const
Returns an iterator pointing past the end of the range.
Definition iteratorrange.hh:52
│ │ │ │ +
IteratorRange()
Default constructor, relies on iterators being default-constructible.
Definition iteratorrange.hh:42
│ │ │ │ +
Iterator iterator
The iterator belonging to this range.
Definition iteratorrange.hh:27
│ │ │ │ +
IteratorRange(const Iterator &begin, const Iterator &end)
Constructs an iterator range on [begin,end).
Definition iteratorrange.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,527 +1,90 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -quadmath.hh │ │ │ │ │ +iteratorrange.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_QUADMATH_HH │ │ │ │ │ -6#define DUNE_QUADMATH_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_ITERATORRANGE_HH │ │ │ │ │ +6#define DUNE_COMMON_ITERATORRANGE_HH │ │ │ │ │ 7 │ │ │ │ │ -8#if HAVE_QUADMATH │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include // abs │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e │ │ │ │ │ -24{ │ │ │ │ │ -25 namespace Impl │ │ │ │ │ -26 { │ │ │ │ │ -27 // forward declaration │ │ │ │ │ -28 class Float128; │ │ │ │ │ -29 │ │ │ │ │ -30 } // end namespace Impl │ │ │ │ │ -31 │ │ │ │ │ -32 using Impl::Float128; │ │ │ │ │ -33 │ │ │ │ │ -34 // The purpose of this namespace is to move the `` function overloads │ │ │ │ │ -35 // out of namespace `Dune`, see AlignedNumber in debugalign.hh. │ │ │ │ │ -36 namespace Impl │ │ │ │ │ -37 { │ │ │ │ │ -38 using float128_t = __float128; │ │ │ │ │ -39 │ │ │ │ │ -41 class Float128 │ │ │ │ │ -42 { │ │ │ │ │ -43 float128_t value_ = 0.0q; │ │ │ │ │ +8namespace _D_u_n_e { │ │ │ │ │ +9 │ │ │ │ │ +11 │ │ │ │ │ +20 template │ │ │ │ │ +_2_1 class _I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ +22 { │ │ │ │ │ +23 │ │ │ │ │ +24 public: │ │ │ │ │ +25 │ │ │ │ │ +_2_7 typedef Iterator _i_t_e_r_a_t_o_r; │ │ │ │ │ +28 │ │ │ │ │ +30 │ │ │ │ │ +_3_3 typedef Iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +34 │ │ │ │ │ +_3_6 _I_t_e_r_a_t_o_r_R_a_n_g_e(const Iterator& _b_e_g_i_n, const Iterator& _e_n_d) │ │ │ │ │ +37 : _begin(_b_e_g_i_n) │ │ │ │ │ +38 , _end(_e_n_d) │ │ │ │ │ +39 {} │ │ │ │ │ +40 │ │ │ │ │ +_4_2 _I_t_e_r_a_t_o_r_R_a_n_g_e() │ │ │ │ │ +43 {} │ │ │ │ │ 44 │ │ │ │ │ -45 public: │ │ │ │ │ -46 constexpr Float128() = default; │ │ │ │ │ -47 constexpr Float128(const float128_t& value) noexcept │ │ │ │ │ -48 : value_(value) │ │ │ │ │ -49 {} │ │ │ │ │ +_4_6 _i_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ +47 { │ │ │ │ │ +48 return _begin; │ │ │ │ │ +49 } │ │ │ │ │ 50 │ │ │ │ │ -51 // constructor from any floating-point or integer type │ │ │ │ │ -52 template ::value, int> = 0> │ │ │ │ │ -54 constexpr Float128(const T& value) noexcept │ │ │ │ │ -55 : value_(value) │ │ │ │ │ -56 {} │ │ │ │ │ -57 │ │ │ │ │ -58 // constructor from pointer to null-terminated byte string │ │ │ │ │ -59 explicit Float128(const char* str) noexcept │ │ │ │ │ -60 : value_(strtoflt128(str, NULL)) │ │ │ │ │ -61 {} │ │ │ │ │ -62 │ │ │ │ │ -63 // accessors │ │ │ │ │ -64 constexpr operator float128_t() const noexcept { return value_; } │ │ │ │ │ +_5_2 _i_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ +53 { │ │ │ │ │ +54 return _end; │ │ │ │ │ +55 } │ │ │ │ │ +56 │ │ │ │ │ +57 private: │ │ │ │ │ +58 │ │ │ │ │ +59 Iterator _begin; │ │ │ │ │ +60 Iterator _end; │ │ │ │ │ +61 │ │ │ │ │ +62 }; │ │ │ │ │ +63 │ │ │ │ │ +64} │ │ │ │ │ 65 │ │ │ │ │ -66 constexpr float128_t const& value() const noexcept { return value_; } │ │ │ │ │ -67 constexpr float128_t& value() noexcept { return value_; } │ │ │ │ │ -68 │ │ │ │ │ -69 // I/O │ │ │ │ │ -70 template │ │ │ │ │ -71 friend std::basic_istream& │ │ │ │ │ -72 _o_p_e_r_a_t_o_r_>_>(std::basic_istream& in, Float128& x) │ │ │ │ │ -73 { │ │ │ │ │ -74 std::string buf; │ │ │ │ │ -75 buf.reserve(128); │ │ │ │ │ -76 in >> buf; │ │ │ │ │ -77 x.value() = strtoflt128(buf.c_str(), NULL); │ │ │ │ │ -78 return in; │ │ │ │ │ -79 } │ │ │ │ │ -80 │ │ │ │ │ -81 template │ │ │ │ │ -82 friend std::basic_ostream& │ │ │ │ │ -83 _o_p_e_r_a_t_o_r_<_<(std::basic_ostream& out, const Float128& x) │ │ │ │ │ -84 { │ │ │ │ │ -85 const std::size_t bufSize = 128; │ │ │ │ │ -86 CharT buf[128]; │ │ │ │ │ -87 │ │ │ │ │ -88 std::string format = "%." + std::to_string(out.precision()) + "Q" + │ │ │ │ │ -89 ((out.flags() | std::ios_base::scientific) ? "e" : "f"); │ │ │ │ │ -90 const int numChars = quadmath_snprintf(buf, bufSize, format.c_str(), x.value │ │ │ │ │ -()); │ │ │ │ │ -91 if (std::size_t(numChars) >= bufSize) { │ │ │ │ │ -92 _D_U_N_E___T_H_R_O_W(_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r, "Failed to print Float128 value: buffer │ │ │ │ │ -overflow"); │ │ │ │ │ -93 } │ │ │ │ │ -94 out << buf; │ │ │ │ │ -95 return out; │ │ │ │ │ -96 } │ │ │ │ │ -97 │ │ │ │ │ -98 // Increment, decrement │ │ │ │ │ -99 constexpr Float128& operator++() noexcept { ++value_; return *this; } │ │ │ │ │ -100 constexpr Float128& operator--() noexcept { --value_; return *this; } │ │ │ │ │ -101 │ │ │ │ │ -102 constexpr Float128 operator++(int) noexcept { Float128 tmp{*this}; │ │ │ │ │ -++value_; return tmp; } │ │ │ │ │ -103 constexpr Float128 operator--(int) noexcept { Float128 tmp{*this}; -- │ │ │ │ │ -value_; return tmp; } │ │ │ │ │ -104 │ │ │ │ │ -105 // unary operators │ │ │ │ │ -106 constexpr Float128 _o_p_e_r_a_t_o_r_+() const noexcept { return Float128{+value_}; } │ │ │ │ │ -107 constexpr Float128 _o_p_e_r_a_t_o_r_-() const noexcept { return Float128{-value_}; } │ │ │ │ │ -108 │ │ │ │ │ -109 // assignment operators │ │ │ │ │ -110#define DUNE_ASSIGN_OP(OP) \ │ │ │ │ │ -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 _D_U_N_E___A_S_S_I_G_N___O_P(+=); │ │ │ │ │ -119 _D_U_N_E___A_S_S_I_G_N___O_P(-=); │ │ │ │ │ -120 │ │ │ │ │ -121 _D_U_N_E___A_S_S_I_G_N___O_P(*=); │ │ │ │ │ -122 _D_U_N_E___A_S_S_I_G_N___O_P(/=); │ │ │ │ │ -123 │ │ │ │ │ -124#undef DUNE_ASSIGN_OP │ │ │ │ │ -125 │ │ │ │ │ -126 }; // end class Float128 │ │ │ │ │ -127 │ │ │ │ │ -128 // binary operators: │ │ │ │ │ -129 // For symmetry provide overloads with arithmetic types │ │ │ │ │ -130 // in the first or second argument. │ │ │ │ │ -131#define DUNE_BINARY_OP(OP) \ │ │ │ │ │ -132 constexpr Float128 operator OP(const Float128& t, \ │ │ │ │ │ -133 const Float128& u) noexcept \ │ │ │ │ │ -134 { \ │ │ │ │ │ -135 return Float128{float128_t(t) OP float128_t(u)}; \ │ │ │ │ │ -136 } \ │ │ │ │ │ -137 constexpr Float128 operator OP(const float128_t& t, \ │ │ │ │ │ -138 const Float128& u) noexcept \ │ │ │ │ │ -139 { \ │ │ │ │ │ -140 return Float128{t OP float128_t(u)}; \ │ │ │ │ │ -141 } \ │ │ │ │ │ -142 constexpr Float128 operator OP(const Float128& t, \ │ │ │ │ │ -143 const float128_t& u) noexcept \ │ │ │ │ │ -144 { \ │ │ │ │ │ -145 return Float128{float128_t(t) OP u}; \ │ │ │ │ │ -146 } \ │ │ │ │ │ -147 template ::value, int> = 0> \ │ │ │ │ │ -149 constexpr Float128 operator OP(const T& t, \ │ │ │ │ │ -150 const Float128& u) noexcept \ │ │ │ │ │ -151 { \ │ │ │ │ │ -152 return Float128{float128_t(t) OP float128_t(u)}; \ │ │ │ │ │ -153 } \ │ │ │ │ │ -154 template ::value, int> = 0> \ │ │ │ │ │ -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 │ │ │ │ │ -163 _D_U_N_E___B_I_N_A_R_Y___O_P(+); │ │ │ │ │ -164 _D_U_N_E___B_I_N_A_R_Y___O_P(-); │ │ │ │ │ -165 _D_U_N_E___B_I_N_A_R_Y___O_P(*); │ │ │ │ │ -166 _D_U_N_E___B_I_N_A_R_Y___O_P(/); │ │ │ │ │ -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) \ │ │ │ │ │ -174 constexpr bool operator OP(const Float128& t, \ │ │ │ │ │ -175 const Float128& u) noexcept \ │ │ │ │ │ -176 { \ │ │ │ │ │ -177 return float128_t(t) OP float128_t(u); \ │ │ │ │ │ -178 } \ │ │ │ │ │ -179 template ::value, int> = 0> \ │ │ │ │ │ -181 constexpr bool operator OP(const T& t, \ │ │ │ │ │ -182 const Float128& u) noexcept \ │ │ │ │ │ -183 { \ │ │ │ │ │ -184 return float128_t(t) OP float128_t(u); \ │ │ │ │ │ -185 } \ │ │ │ │ │ -186 template ::value, int> = 0> \ │ │ │ │ │ -188 constexpr bool operator OP(const Float128& t, \ │ │ │ │ │ -189 const U& u) noexcept \ │ │ │ │ │ -190 { \ │ │ │ │ │ -191 return float128_t(t) OP float128_t(u); \ │ │ │ │ │ -192 } \ │ │ │ │ │ -193 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -194 │ │ │ │ │ -195 DUNE_BINARY_BOOL_OP(==); │ │ │ │ │ -196 DUNE_BINARY_BOOL_OP(!=); │ │ │ │ │ -197 DUNE_BINARY_BOOL_OP(<); │ │ │ │ │ -198 DUNE_BINARY_BOOL_OP(>); │ │ │ │ │ -199 DUNE_BINARY_BOOL_OP(<=); │ │ │ │ │ -200 DUNE_BINARY_BOOL_OP(>=); │ │ │ │ │ -201 │ │ │ │ │ -202#undef DUNE_BINARY_BOOL_OP │ │ │ │ │ -203 │ │ │ │ │ -204 // Overloads for the cmath functions │ │ │ │ │ -205 │ │ │ │ │ -206 // function with name `name` redirects to quadmath function `func` │ │ │ │ │ -207#define DUNE_UNARY_FUNC(name,func) \ │ │ │ │ │ -208 inline Float128 name(const Float128& u) noexcept \ │ │ │ │ │ -209 { \ │ │ │ │ │ -210 return Float128{func (float128_t(u))}; \ │ │ │ │ │ -211 } \ │ │ │ │ │ -212 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -213 │ │ │ │ │ -214 // like DUNE_UNARY_FUNC but with custom return type │ │ │ │ │ -215#define DUNE_CUSTOM_UNARY_FUNC(type,name,func) \ │ │ │ │ │ -216 inline type name(const Float128& u) noexcept \ │ │ │ │ │ -217 { \ │ │ │ │ │ -218 return (type)(func (float128_t(u))); \ │ │ │ │ │ -219 } \ │ │ │ │ │ -220 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -221 │ │ │ │ │ -222 // redirects to quadmath function with two arguments │ │ │ │ │ -223#define DUNE_BINARY_FUNC(name,func) \ │ │ │ │ │ -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 _D_U_N_E___U_N_A_R_Y___F_U_N_C(abs, fabsq); │ │ │ │ │ -232 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acos, acosq); │ │ │ │ │ -233 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acosh, acoshq); │ │ │ │ │ -234 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asin, asinq); │ │ │ │ │ -235 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asinh, asinhq); │ │ │ │ │ -236 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atan, atanq); │ │ │ │ │ -237 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atanh, atanhq); │ │ │ │ │ -238 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cbrt, cbrtq); │ │ │ │ │ -239 _D_U_N_E___U_N_A_R_Y___F_U_N_C(ceil, ceilq); │ │ │ │ │ -240 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cos, cosq); │ │ │ │ │ -241 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cosh, coshq); │ │ │ │ │ -242 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erf, erfq); │ │ │ │ │ -243 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erfc, erfcq); │ │ │ │ │ -244 _D_U_N_E___U_N_A_R_Y___F_U_N_C(exp, expq); │ │ │ │ │ -245 _D_U_N_E___U_N_A_R_Y___F_U_N_C(expm1, expm1q); │ │ │ │ │ -246 _D_U_N_E___U_N_A_R_Y___F_U_N_C(fabs, fabsq); │ │ │ │ │ -247 _D_U_N_E___U_N_A_R_Y___F_U_N_C(floor, floorq); │ │ │ │ │ -248 DUNE_CUSTOM_UNARY_FUNC(int, ilogb, ilogbq); │ │ │ │ │ -249 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lgamma, lgammaq); │ │ │ │ │ -250 DUNE_CUSTOM_UNARY_FUNC(long long int, llrint, llrintq); │ │ │ │ │ -251 DUNE_CUSTOM_UNARY_FUNC(long long int, llround, llroundq); │ │ │ │ │ -252 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log, logq); │ │ │ │ │ -253 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log10, log10q); │ │ │ │ │ -254 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log1p, log1pq); │ │ │ │ │ -255 _D_U_N_E___U_N_A_R_Y___F_U_N_C(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 _D_U_N_E___U_N_A_R_Y___F_U_N_C(nearbyint, nearbyintq); │ │ │ │ │ -260 DUNE_BINARY_FUNC(nextafter, nextafterq); │ │ │ │ │ -261 DUNE_BINARY_FUNC(pow, powq); // overload for integer argument see below │ │ │ │ │ -262 _D_U_N_E___U_N_A_R_Y___F_U_N_C(rint, rintq); │ │ │ │ │ -263 _D_U_N_E___U_N_A_R_Y___F_U_N_C(round, roundq); │ │ │ │ │ -264 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sin, sinq); │ │ │ │ │ -265 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sinh, sinhq); │ │ │ │ │ -266 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sqrt, sqrtq); │ │ │ │ │ -267 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tan, tanq); │ │ │ │ │ -268 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tanh, tanhq); │ │ │ │ │ -269 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tgamma, tgammaq); │ │ │ │ │ -270 _D_U_N_E___U_N_A_R_Y___F_U_N_C(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 │ │ │ │ │ -278#undef DUNE_CUSTOM_UNARY_FUNC │ │ │ │ │ -279#undef DUNE_BINARY_FUNC │ │ │ │ │ -280 │ │ │ │ │ -281 // like DUNE_BINARY_FUNC but provide overloads with arithmetic │ │ │ │ │ -282 // types in the first or second argument. │ │ │ │ │ -283#define DUNE_BINARY_ARITHMETIC_FUNC(name,func) \ │ │ │ │ │ -284 inline Float128 name(const Float128& t, \ │ │ │ │ │ -285 const Float128& u) noexcept \ │ │ │ │ │ -286 { \ │ │ │ │ │ -287 return Float128{func (float128_t(t), float128_t(u))}; \ │ │ │ │ │ -288 } \ │ │ │ │ │ -289 template ::value, int> = 0> \ │ │ │ │ │ -291 inline Float128 name(const T& t, \ │ │ │ │ │ -292 const Float128& u) noexcept \ │ │ │ │ │ -293 { \ │ │ │ │ │ -294 return Float128{func (float128_t(t), float128_t(u))}; \ │ │ │ │ │ -295 } \ │ │ │ │ │ -296 template ::value, int> = 0> \ │ │ │ │ │ -298 inline Float128 name(const Float128& t, \ │ │ │ │ │ -299 const U& u) noexcept \ │ │ │ │ │ -300 { \ │ │ │ │ │ -301 return Float128{func (float128_t(t), float128_t(u))}; \ │ │ │ │ │ -302 } \ │ │ │ │ │ -303 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -304 │ │ │ │ │ -305 DUNE_BINARY_ARITHMETIC_FUNC(atan2,atan2q); │ │ │ │ │ -306 DUNE_BINARY_ARITHMETIC_FUNC(copysign,copysignq); │ │ │ │ │ -307 DUNE_BINARY_ARITHMETIC_FUNC(fdim,fdimq); │ │ │ │ │ -308 DUNE_BINARY_ARITHMETIC_FUNC(fmax,fmaxq); │ │ │ │ │ -309 DUNE_BINARY_ARITHMETIC_FUNC(fmin,fminq); │ │ │ │ │ -310 DUNE_BINARY_ARITHMETIC_FUNC(fmod,fmodq); │ │ │ │ │ -311 DUNE_BINARY_ARITHMETIC_FUNC(hypot,hypotq); │ │ │ │ │ -312 DUNE_BINARY_ARITHMETIC_FUNC(remainder,remainderq); │ │ │ │ │ -313 │ │ │ │ │ -314#undef DUNE_BINARY_ARITHMETIC_FUNC │ │ │ │ │ -315 │ │ │ │ │ -316 // some more cmath functions with special signature │ │ │ │ │ -317 │ │ │ │ │ -318 inline Float128 fma(const Float128& t, const Float128& u, const Float128& │ │ │ │ │ -v) │ │ │ │ │ -319 { │ │ │ │ │ -320 return Float128{fmaq(float128_t(t),float128_t(u),float128_t(v))}; │ │ │ │ │ -321 } │ │ │ │ │ -322 │ │ │ │ │ -323 inline Float128 frexp(const Float128& u, int* p) │ │ │ │ │ -324 { │ │ │ │ │ -325 return Float128{frexpq(float128_t(u), p)}; │ │ │ │ │ -326 } │ │ │ │ │ -327 │ │ │ │ │ -328 inline Float128 ldexp(const Float128& u, int p) │ │ │ │ │ -329 { │ │ │ │ │ -330 return Float128{ldexpq(float128_t(u), p)}; │ │ │ │ │ -331 } │ │ │ │ │ -332 │ │ │ │ │ -333 inline Float128 remquo(const Float128& t, const Float128& u, int* quo) │ │ │ │ │ -334 { │ │ │ │ │ -335 return Float128{remquoq(float128_t(t), float128_t(u), quo)}; │ │ │ │ │ -336 } │ │ │ │ │ -337 │ │ │ │ │ -338 inline Float128 scalbln(const Float128& u, long int e) │ │ │ │ │ -339 { │ │ │ │ │ -340 return Float128{scalblnq(float128_t(u), e)}; │ │ │ │ │ -341 } │ │ │ │ │ -342 │ │ │ │ │ -343 inline Float128 scalbn(const Float128& u, int e) │ │ │ │ │ -344 { │ │ │ │ │ -345 return Float128{scalbnq(float128_t(u), e)}; │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -349 // NOTE: This is much faster than a pow(x, Float128(p)) call │ │ │ │ │ -350 // NOTE: This is a modified version of boost::math::cstdfloat::detail::pown │ │ │ │ │ -351 // (adapted to the type Float128) that is part of the Boost 1.65 Math │ │ │ │ │ -toolkit 2.8.0 │ │ │ │ │ -352 // and is implemented by Christopher Kormanyos, John Maddock, and Paul A. │ │ │ │ │ -Bristow, │ │ │ │ │ -353 // distributed under the Boost Software License, Version 1.0 │ │ │ │ │ -354 // (See http://www.boost.org/LICENSE_1_0.txt) │ │ │ │ │ -355 template ::value, int> = 0> │ │ │ │ │ -357 inline Float128 pow(const Float128& x, const Int p) │ │ │ │ │ -358 { │ │ │ │ │ -359 static const Float128 _m_a_x___v_a_l_u_e = FLT128_MAX; │ │ │ │ │ -360 static const Float128 _m_i_n___v_a_l_u_e = FLT128_MIN; │ │ │ │ │ -361 static const Float128 inf_value = float128_t{1} / float128_t{0}; │ │ │ │ │ -362 │ │ │ │ │ -363 const bool isneg = (x < 0); │ │ │ │ │ -364 const bool isnan = (x != x); │ │ │ │ │ -365 const bool isinf = (isneg ? bool(-x > _m_a_x___v_a_l_u_e) : bool(+x > _m_a_x___v_a_l_u_e)); │ │ │ │ │ -366 │ │ │ │ │ -367 if (isnan) { return x; } │ │ │ │ │ -368 if (isinf) { return Float128{nanq("")}; } │ │ │ │ │ -369 │ │ │ │ │ -370 const Float128 abs_x = (isneg ? -x : x); │ │ │ │ │ -371 if (p < Int(0)) { │ │ │ │ │ -372 if (abs_x < _m_i_n___v_a_l_u_e) │ │ │ │ │ -373 return (isneg ? -inf_value : +inf_value); │ │ │ │ │ -374 else │ │ │ │ │ -375 return Float128(1) / pow(x, Int(-p)); │ │ │ │ │ -376 } │ │ │ │ │ -377 │ │ │ │ │ -378 if (p == Int(0)) { return Float128(1); } │ │ │ │ │ -379 if (p == Int(1)) { return x; } │ │ │ │ │ -380 if (abs_x > _m_a_x___v_a_l_u_e) │ │ │ │ │ -381 return (isneg ? -inf_value : +inf_value); │ │ │ │ │ -382 │ │ │ │ │ -383 if (p == Int(2)) { return (x * x); } │ │ │ │ │ -384 if (p == Int(3)) { return ((x * x) * x); } │ │ │ │ │ -385 if (p == Int(4)) { const Float128 x2 = (x * x); return (x2 * x2); } │ │ │ │ │ -386 │ │ │ │ │ -387 Float128 result = ((p % Int(2)) != Int(0)) ? x : Float128(1); │ │ │ │ │ -388 Float128 xn = x; // binary powers of x │ │ │ │ │ -389 │ │ │ │ │ -390 Int p2 = p; │ │ │ │ │ -391 while (Int(p2 /= 2) != Int(0)) { │ │ │ │ │ -392 xn *= xn; // Square xn for each binary power │ │ │ │ │ -393 │ │ │ │ │ -394 const bool has_binary_power = (Int(p2 % Int(2)) != Int(0)); │ │ │ │ │ -395 if (has_binary_power) │ │ │ │ │ -396 result *= xn; │ │ │ │ │ -397 } │ │ │ │ │ -398 │ │ │ │ │ -399 return result; │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -402 │ │ │ │ │ -403 } // end namespace Impl │ │ │ │ │ -404 │ │ │ │ │ -405 template <> │ │ │ │ │ -406 struct IsNumber │ │ │ │ │ -407 : public std::true_type {}; │ │ │ │ │ -408 │ │ │ │ │ -409} // end namespace Dune │ │ │ │ │ -410 │ │ │ │ │ -411namespace _s_t_d │ │ │ │ │ -412{ │ │ │ │ │ -413#ifndef NO_STD_NUMERIC_LIMITS_SPECIALIZATION │ │ │ │ │ -414 template <> │ │ │ │ │ -415 class numeric_limits<_D_u_n_e::Impl::Float128> │ │ │ │ │ -416 { │ │ │ │ │ -417 using Float128 = Dune::Impl::Float128; │ │ │ │ │ -418 using float128_t = Dune::Impl::float128_t; │ │ │ │ │ -419 │ │ │ │ │ -420 public: │ │ │ │ │ -421 static constexpr bool is_specialized = true; │ │ │ │ │ -422 static constexpr Float128 _m_i_n() noexcept { return FLT128_MIN; } │ │ │ │ │ -423 static constexpr Float128 _m_a_x() noexcept { return FLT128_MAX; } │ │ │ │ │ -424 static constexpr Float128 lowest() noexcept { return -FLT128_MAX; } │ │ │ │ │ -425 static constexpr int digits = FLT128_MANT_DIG; │ │ │ │ │ -426 static constexpr int digits10 = 34; │ │ │ │ │ -427 static constexpr int max_digits10 = 36; │ │ │ │ │ -428 static constexpr bool is_signed = true; │ │ │ │ │ -429 static constexpr bool is_integer = false; │ │ │ │ │ -430 static constexpr bool is_exact = false; │ │ │ │ │ -431 static constexpr int radix = 2; │ │ │ │ │ -432 static constexpr Float128 epsilon() noexcept { return FLT128_EPSILON; } │ │ │ │ │ -433 static constexpr Float128 round_error() noexcept { return float128_t{0.5}; │ │ │ │ │ -} │ │ │ │ │ -434 static constexpr int min_exponent = FLT128_MIN_EXP; │ │ │ │ │ -435 static constexpr int min_exponent10 = FLT128_MIN_10_EXP; │ │ │ │ │ -436 static constexpr int max_exponent = FLT128_MAX_EXP; │ │ │ │ │ -437 static constexpr int max_exponent10 = FLT128_MAX_10_EXP; │ │ │ │ │ -438 static constexpr bool has_infinity = true; │ │ │ │ │ -439 static constexpr bool has_quiet_NaN = true; │ │ │ │ │ -440 static constexpr bool has_signaling_NaN = false; │ │ │ │ │ -441 static constexpr float_denorm_style has_denorm = denorm_present; │ │ │ │ │ -442 static constexpr bool has_denorm_loss = false; │ │ │ │ │ -443 static constexpr Float128 infinity() noexcept { return float128_t{1}/ │ │ │ │ │ -float128_t{0}; } │ │ │ │ │ -444 static Float128 quiet_NaN() noexcept { return nanq(""); } │ │ │ │ │ -445 static constexpr Float128 signaling_NaN() noexcept { return float128_t{}; } │ │ │ │ │ -446 static constexpr Float128 denorm_min() noexcept { return FLT128_DENORM_MIN; │ │ │ │ │ -} │ │ │ │ │ -447 static constexpr bool is_iec559 = true; │ │ │ │ │ -448 static constexpr bool is_bounded = false; │ │ │ │ │ -449 static constexpr bool is_modulo = false; │ │ │ │ │ -450 static constexpr bool traps = false; │ │ │ │ │ -451 static constexpr bool tinyness_before = false; │ │ │ │ │ -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 │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ -#define DUNE_BINARY_OP(OP) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:248 │ │ │ │ │ -_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ -#define DUNE_UNARY_FUNC(name) │ │ │ │ │ -_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ -Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ -Read a std::tuple. │ │ │ │ │ -DDeeffiinniittiioonn streamoperators.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:542 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ -bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:535 │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +66#endif // DUNE_COMMON_ITERATORRANGE_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_m_a_x___v_a_l_u_e │ │ │ │ │ -T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_m_i_n___v_a_l_u_e │ │ │ │ │ -T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_i_n │ │ │ │ │ -auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:447 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_a_x │ │ │ │ │ -auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ +Simple range between a begin and an end iterator. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() const │ │ │ │ │ +Returns an iterator pointing to the begin of the range. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator const_iterator │ │ │ │ │ +The iterator belonging to this range. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_e_n_d │ │ │ │ │ +iterator end() const │ │ │ │ │ +Returns an iterator pointing past the end of the range. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ +IteratorRange() │ │ │ │ │ +Default constructor, relies on iterators being default-constructible. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator iterator │ │ │ │ │ +The iterator belonging to this range. │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ +IteratorRange(const Iterator &begin, const Iterator &end) │ │ │ │ │ +Constructs an iterator range on [begin,end). │ │ │ │ │ +DDeeffiinniittiioonn iteratorrange.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: to_unique_ptr.hh File Reference │ │ │ │ +dune-common: float_cmp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,44 +70,101 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ +Enumerations | │ │ │ │ Functions
│ │ │ │ -
to_unique_ptr.hh File Reference
│ │ │ │ +
float_cmp.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ -Typedefs

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

│ │ │ │ +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 T , class... Args>
std::unique_ptr< T > Dune::makeToUnique (Args &&... args)
 Alias for std::make_unique introduced as transition wrapper.
 
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
 
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
 
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
 
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
 
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
 
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
 
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
 
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
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Various ways to compare floating-point numbers.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,27 +1,81 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -to_unique_ptr.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +float_cmp.hh File Reference │ │ │ │ │ +Various ways to compare floating-point numbers. _M_o_r_e_._._. │ │ │ │ │ +#include "_f_l_o_a_t___c_m_p_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_ _T_,_ _s_t_y_l_e_ _> │ │ │ │ │ +  mapping from a value type and a compare style to a default epsilon │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_<_ _T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___ _> │ │ │ │ │ +  Class encapsulating a default epsilon. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_T_o_U_n_i_q_u_e_P_t_r = std::unique_ptr< T > │ │ │ │ │ -  Alias for std::unique_ptr introduced as transition wrapper. │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_l_o_a_t_C_m_p │ │ │ │ │ +  │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_C_m_p_S_t_y_l_e { _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_r_e_l_a_t_i_v_e_W_e_a_k , _D_u_n_e_:_: │ │ │ │ │ + _F_l_o_a_t_C_m_p_:_:_r_e_l_a_t_i_v_e_S_t_r_o_n_g , _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_a_b_s_o_l_u_t_e , _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_: │ │ │ │ │ + _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e = relativeWeak } │ │ │ │ │ +  │ │ │ │ │ +enum   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_R_o_u_n_d_i_n_g_S_t_y_l_e { │ │ │ │ │ +   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_o_w_a_r_d_Z_e_r_o , _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_o_w_a_r_d_I_n_f , _D_u_n_e_:_: │ │ │ │ │ + _F_l_o_a_t_C_m_p_:_:_d_o_w_n_w_a_r_d , _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_u_p_w_a_r_d , │ │ │ │ │ +   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_d_e_f_a_u_l_t_R_o_u_n_d_i_n_g_S_t_y_l_e = towardZero │ │ │ │ │ + } │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::unique_ptr< T >  _D_u_n_e_:_:_m_a_k_e_T_o_U_n_i_q_u_e (Args &&... args) │ │ │ │ │ -  Alias for std::make_unique introduced as transition │ │ │ │ │ - wrapper. │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_e_q (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test for equality using epsilon │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_n_e (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test for inequality using epsilon │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_g_t (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test if first greater than second │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_l_t (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test if first lesser than second │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_g_e (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test if first greater or equal second │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_l_e (const T &first, const T &second, typename │ │ │ │ │ + _E_p_s_i_l_o_n_T_y_p_e< T >::Type epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, style >::value()) │ │ │ │ │ +  test if first lesser or equal second │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + I  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_r_o_u_n_d (const T &val, typename _E_p_s_i_l_o_n_T_y_p_e< T >::Type │ │ │ │ │ + epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, cstyle >::value()) │ │ │ │ │ +  round using epsilon │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + I  _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_r_u_n_c (const T &val, typename _E_p_s_i_l_o_n_T_y_p_e< T >::Type │ │ │ │ │ + epsilon=_D_e_f_a_u_l_t_E_p_s_i_l_o_n< T, cstyle >::value()) │ │ │ │ │ +  truncate using epsilon │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Various ways to compare floating-point numbers. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: to_unique_ptr.hh Source File │ │ │ │ +dune-common: float_cmp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,48 +74,197 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
to_unique_ptr.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_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 }
│ │ │ │ -
│ │ │ │ -
27
│ │ │ │ -
28} // end namespace Dune
│ │ │ │ -
29
│ │ │ │ -
30#endif // DUNE_TO_UNIQUE_PTR_HH
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,49 +1,298 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -to_unique_ptr.hh │ │ │ │ │ +float_cmp.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 _D_u_n_e │ │ │ │ │ -14{ │ │ │ │ │ -17 template │ │ │ │ │ -_1_8 using _T_o_U_n_i_q_u_e_P_t_r [[deprecated]] = std::unique_ptr; │ │ │ │ │ -19 │ │ │ │ │ -22 template │ │ │ │ │ -_2_3 [[deprecated]] std::unique_ptr _m_a_k_e_T_o_U_n_i_q_u_e (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 │ │ │ │ │ +5#ifndef DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ +6#define DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ +7 │ │ │ │ │ +97namespace _D_u_n_e { │ │ │ │ │ +100 namespace FloatCmp { │ │ │ │ │ +101 // basic constants │ │ │ │ │ +_1_0_4 enum _C_m_p_S_t_y_l_e { │ │ │ │ │ +_1_0_6 _r_e_l_a_t_i_v_e_W_e_a_k, │ │ │ │ │ +_1_0_8 _r_e_l_a_t_i_v_e_S_t_r_o_n_g, │ │ │ │ │ +_1_1_0 _a_b_s_o_l_u_t_e, │ │ │ │ │ +112 _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e = _r_e_l_a_t_i_v_e_W_e_a_k │ │ │ │ │ +_1_1_3 }; │ │ │ │ │ +_1_1_6 enum _R_o_u_n_d_i_n_g_S_t_y_l_e { │ │ │ │ │ +_1_1_8 _t_o_w_a_r_d_Z_e_r_o, │ │ │ │ │ +_1_2_0 _t_o_w_a_r_d_I_n_f, │ │ │ │ │ +_1_2_2 _d_o_w_n_w_a_r_d, │ │ │ │ │ +_1_2_4 _u_p_w_a_r_d, │ │ │ │ │ +126 _d_e_f_a_u_l_t_R_o_u_n_d_i_n_g_S_t_y_l_e = _t_o_w_a_r_d_Z_e_r_o │ │ │ │ │ +_1_2_7 }; │ │ │ │ │ +128 │ │ │ │ │ +129 template struct EpsilonType; │ │ │ │ │ +130 │ │ │ │ │ +132 │ │ │ │ │ +137 template │ │ │ │ │ +_1_3_8 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ +_1_4_0 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e(); │ │ │ │ │ +141 }; │ │ │ │ │ +142 │ │ │ │ │ +143 // operations in functional style │ │ │ │ │ +144 │ │ │ │ │ +147 │ │ │ │ │ +149 │ │ │ │ │ +156 template │ │ │ │ │ +157 bool _e_q(const T &first, │ │ │ │ │ +158 const T &second, │ │ │ │ │ +159 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +161 │ │ │ │ │ +169 template │ │ │ │ │ +170 bool _n_e(const T &first, │ │ │ │ │ +171 const T &second, │ │ │ │ │ +172 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +174 │ │ │ │ │ +185 template │ │ │ │ │ +186 bool _g_t(const T &first, │ │ │ │ │ +187 const T &second, │ │ │ │ │ +188 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +190 │ │ │ │ │ +201 template │ │ │ │ │ +202 bool _l_t(const T &first, │ │ │ │ │ +203 const T &second, │ │ │ │ │ +204 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +206 │ │ │ │ │ +217 template │ │ │ │ │ +218 bool _g_e(const T &first, │ │ │ │ │ +219 const T &second, │ │ │ │ │ +220 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +222 │ │ │ │ │ +233 template │ │ │ │ │ +234 bool _l_e(const T &first, │ │ │ │ │ +235 const T &second, │ │ │ │ │ +236 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +237 │ │ │ │ │ +238 // rounding operations │ │ │ │ │ +240 │ │ │ │ │ +253 template │ │ │ │ │ +254 I _r_o_u_n_d(const T &val, typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = │ │ │ │ │ +_D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _c_s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +255 // truncation │ │ │ │ │ +257 │ │ │ │ │ +270 template │ │ │ │ │ +271 I _t_r_u_n_c(const T &val, typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon = │ │ │ │ │ +_D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_T_,_ _c_s_t_y_l_e_>_:_:_v_a_l_u_e()); │ │ │ │ │ +272 │ │ │ │ │ +274 // group FloatCmp │ │ │ │ │ +275 } //namespace FloatCmp │ │ │ │ │ +276 │ │ │ │ │ +277 │ │ │ │ │ +278 // oo interface │ │ │ │ │ +280 │ │ │ │ │ +286 template │ │ │ │ │ +_2_8_8 class _F_l_o_a_t_C_m_p_O_p_s { │ │ │ │ │ +289 typedef _F_l_o_a_t_C_m_p_:_:_C_m_p_S_t_y_l_e _C_m_p_S_t_y_l_e; │ │ │ │ │ +290 typedef _F_l_o_a_t_C_m_p_:_:_R_o_u_n_d_i_n_g_S_t_y_l_e _R_o_u_n_d_i_n_g_S_t_y_l_e; │ │ │ │ │ +291 │ │ │ │ │ +292 public: │ │ │ │ │ +293 // record template parameters │ │ │ │ │ +_2_9_5 static const _C_m_p_S_t_y_l_e _c_s_t_y_l_e = cstyle_; │ │ │ │ │ +_2_9_7 static const _R_o_u_n_d_i_n_g_S_t_y_l_e _r_s_t_y_l_e = rstyle_; │ │ │ │ │ +_2_9_9 typedef T _V_a_l_u_e_T_y_p_e; │ │ │ │ │ +301 │ │ │ │ │ +_3_0_4 typedef typename _F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _E_p_s_i_l_o_n_T_y_p_e; │ │ │ │ │ +305 │ │ │ │ │ +306 private: │ │ │ │ │ +307 _E_p_s_i_l_o_n_T_y_p_e epsilon_; │ │ │ │ │ +308 │ │ │ │ │ +309 typedef _F_l_o_a_t_C_m_p_:_:_D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_E_p_s_i_l_o_n_T_y_p_e_,_ _c_s_t_y_l_e_> _D_e_f_a_u_l_t_E_p_s_i_l_o_n; │ │ │ │ │ +310 │ │ │ │ │ +311 public: │ │ │ │ │ +313 │ │ │ │ │ +316 _F_l_o_a_t_C_m_p_O_p_s(_E_p_s_i_l_o_n_T_y_p_e _e_p_s_i_l_o_n = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_:_:_v_a_l_u_e()); │ │ │ │ │ +317 │ │ │ │ │ +319 _E_p_s_i_l_o_n_T_y_p_e _e_p_s_i_l_o_n() const; │ │ │ │ │ +321 void _e_p_s_i_l_o_n(_E_p_s_i_l_o_n_T_y_p_e epsilon__); │ │ │ │ │ +322 │ │ │ │ │ +324 bool _e_q(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +326 │ │ │ │ │ +329 bool _n_e(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +331 │ │ │ │ │ +335 bool _g_t(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +337 │ │ │ │ │ +341 bool _l_t(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +343 │ │ │ │ │ +347 bool _g_e(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +349 │ │ │ │ │ +353 bool _l_e(const _V_a_l_u_e_T_y_p_e &first, const _V_a_l_u_e_T_y_p_e &second) const; │ │ │ │ │ +354 │ │ │ │ │ +356 │ │ │ │ │ +365 template │ │ │ │ │ +366 I _r_o_u_n_d(const _V_a_l_u_e_T_y_p_e &val) const; │ │ │ │ │ +367 │ │ │ │ │ +369 │ │ │ │ │ +378 template │ │ │ │ │ +379 I _t_r_u_n_c(const _V_a_l_u_e_T_y_p_e &val) const; │ │ │ │ │ +380 │ │ │ │ │ +381 }; │ │ │ │ │ +382 │ │ │ │ │ +383} //namespace Dune │ │ │ │ │ +384 │ │ │ │ │ +385#include "_f_l_o_a_t___c_m_p_._c_c" │ │ │ │ │ +386 │ │ │ │ │ +387#endif //DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ +_f_l_o_a_t___c_m_p_._c_c │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_n_e │ │ │ │ │ +bool ne(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test for inequality using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:151 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_C_m_p_S_t_y_l_e │ │ │ │ │ +CmpStyle │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_e_q │ │ │ │ │ +bool eq(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test for equality using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:144 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_r_o_u_n_d │ │ │ │ │ +I round(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +round using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:311 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_r_u_n_c │ │ │ │ │ +I trunc(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:407 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_R_o_u_n_d_i_n_g_S_t_y_l_e │ │ │ │ │ +RoundingStyle │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_l_t │ │ │ │ │ +bool lt(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first lesser than second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:165 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_g_t │ │ │ │ │ +bool gt(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first greater than second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:158 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_g_e │ │ │ │ │ +bool ge(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first greater or equal second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:172 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_l_e │ │ │ │ │ +bool le(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first lesser or equal second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:179 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e │ │ │ │ │ +@ defaultCmpStyle │ │ │ │ │ +the global default compare style (relative_weak) │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_r_e_l_a_t_i_v_e_S_t_r_o_n_g │ │ │ │ │ +@ relativeStrong │ │ │ │ │ +|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_r_e_l_a_t_i_v_e_W_e_a_k │ │ │ │ │ +@ relativeWeak │ │ │ │ │ +|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_a_b_s_o_l_u_t_e │ │ │ │ │ +@ absolute │ │ │ │ │ +|a-b| <= epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_o_w_a_r_d_Z_e_r_o │ │ │ │ │ +@ towardZero │ │ │ │ │ +always round toward 0 │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_t_o_w_a_r_d_I_n_f │ │ │ │ │ +@ towardInf │ │ │ │ │ +always round away from 0 │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_u_p_w_a_r_d │ │ │ │ │ +@ upward │ │ │ │ │ +round toward │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_d_o_w_n_w_a_r_d │ │ │ │ │ +@ downward │ │ │ │ │ +round toward │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_d_e_f_a_u_l_t_R_o_u_n_d_i_n_g_S_t_y_l_e │ │ │ │ │ +@ defaultRoundingStyle │ │ │ │ │ +the global default rounding style (toward_zero) │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:126 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_m_a_k_e_T_o_U_n_i_q_u_e │ │ │ │ │ -std::unique_ptr< T > makeToUnique(Args &&... args) │ │ │ │ │ -Alias for std::make_unique introduced as transition wrapper. │ │ │ │ │ -DDeeffiinniittiioonn to_unique_ptr.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_T_o_U_n_i_q_u_e_P_t_r │ │ │ │ │ -std::unique_ptr< T > ToUniquePtr │ │ │ │ │ -Alias for std::unique_ptr introduced as transition wrapper. │ │ │ │ │ -DDeeffiinniittiioonn to_unique_ptr.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_:_:_T_y_p_e │ │ │ │ │ +T Type │ │ │ │ │ +The epsilon type corresponding to value type T. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:25 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_D_e_f_a_u_l_t_E_p_s_i_l_o_n │ │ │ │ │ +mapping from a value type and a compare style to a default epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_D_e_f_a_u_l_t_E_p_s_i_l_o_n_:_:_v_a_l_u_e │ │ │ │ │ +static EpsilonType< T >::Type value() │ │ │ │ │ +Returns the default epsilon for the given value type and compare style. │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s │ │ │ │ │ +Class encapsulating a default epsilon. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:288 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_l_e │ │ │ │ │ +bool le(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first lesser or equal second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:486 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_e_q │ │ │ │ │ +bool eq(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test for equality using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:451 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_c_s_t_y_l_e │ │ │ │ │ +static const CmpStyle cstyle │ │ │ │ │ +How comparisons are done. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_l_t │ │ │ │ │ +bool lt(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first lesser than second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:472 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_g_e │ │ │ │ │ +bool ge(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first greater or equal second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:479 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_r_s_t_y_l_e │ │ │ │ │ +static const RoundingStyle rstyle │ │ │ │ │ +How rounding is done. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_E_p_s_i_l_o_n_T_y_p_e │ │ │ │ │ +FloatCmp::EpsilonType< T >::Type EpsilonType │ │ │ │ │ +Type of the epsilon. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_n_e │ │ │ │ │ +bool ne(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test for inequality using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:458 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_V_a_l_u_e_T_y_p_e │ │ │ │ │ +T ValueType │ │ │ │ │ +Type of the values to compare. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_e_p_s_i_l_o_n │ │ │ │ │ +EpsilonType epsilon() const │ │ │ │ │ +return the current epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:436 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_r_o_u_n_d │ │ │ │ │ +I round(const ValueType &val) const │ │ │ │ │ +round using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:495 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_t_r_u_n_c │ │ │ │ │ +I trunc(const ValueType &val) const │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:503 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_O_p_s_:_:_g_t │ │ │ │ │ +bool gt(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first greater than second │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:465 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: version.hh File Reference │ │ │ │ +dune-common: parametertree.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,777 +69,27 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Macros
│ │ │ │ -
version.hh File Reference
│ │ │ │ +
parametertree.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ - │ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -Macros

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

Detailed Description

│ │ │ │ -

Various macros to work with Dune module version numbers.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_MODULE_VERSION_ID

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

Compute a unique uint id for the given module.

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_EQUAL

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_VERSION_EQUAL( module,
 major,
 minor 
)
│ │ │ │ -
│ │ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) == major) && \
│ │ │ │ -
(DUNE_VERSION_JOIN(module,MINOR) == minor))
│ │ │ │ -
#define DUNE_VERSION_JOIN(module, type)
Constructs the preprocessor name used in config.h to hold version numbers.
Definition version.hh: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 DUNE_VERSION_GTE_REV( module,
 major,
 minor,
 revision 
)
│ │ │ │ -
│ │ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \
│ │ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \
│ │ │ │ -
&& (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
│ │ │ │ -
│ │ │ │ -

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_ID

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

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_JOIN

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

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_LT

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

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_LT_REV

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

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_LTE

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

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

│ │ │ │ -

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

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

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

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

◆ DUNE_VERSION_LTE_REV

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

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

│ │ │ │ -

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

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

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

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

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

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

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

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

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <cstring>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include "boundschecking.hh"
│ │ │ │ -#include "exceptions.hh"
│ │ │ │ -#include "genericiterator.hh"
│ │ │ │ -#include <vector>
│ │ │ │ -#include "densevector.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...
struct  Dune::ImplementationDefined
 Dummy struct used for documentation purposes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Enumerations

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

Detailed Description

│ │ │ │ -

This file implements a dense vector with a dynamic size.

│ │ │ │ +

Documentation related stuff.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,40 +1,25 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -dynvector.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _D_e_n_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y │ │ │ │ │ -This file implements a dense vector with a dynamic size. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h" │ │ │ │ │ -#include "_e_x_c_e_p_t_i_o_n_s_._h_h" │ │ │ │ │ -#include "_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include "_d_e_n_s_e_v_e_c_t_o_r_._h_h" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ +documentation.hh File Reference │ │ │ │ │ +Documentation related stuff. _M_o_r_e_._._. │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ -  Construct a vector with a dynamic size. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d │ │ │ │ │ +  Dummy struct used for documentation purposes. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   { _D_u_n_e_:_:_i_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d } │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file implements a dense vector with a dynamic size. │ │ │ │ │ +Documentation related stuff. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dynvector.hh Source File │ │ │ │ +dune-common: documentation.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,271 +74,38 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
dynvector.hh
│ │ │ │ +
documentation.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
│ │ │ │ -
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>
│ │ │ │ -
16
│ │ │ │ -
17#include "boundschecking.hh"
│ │ │ │ -
18#include "exceptions.hh"
│ │ │ │ -
19#include "genericiterator.hh"
│ │ │ │ -
20
│ │ │ │ -
21#include <vector>
│ │ │ │ -
22#include "densevector.hh"
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
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 };
│ │ │ │ -
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_COMMON_DOCUMENTATION_HH
│ │ │ │ +
7#define DUNE_COMMON_DOCUMENTATION_HH
│ │ │ │ +
8
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14
│ │ │ │ + │ │ │ │
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 {}
│ │ │ │ -
│ │ │ │ -
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
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ -
Implements the dense vector interface, with an exchangeable storage class.
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
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
│ │ │ │ -
STL namespace.
│ │ │ │ + │ │ │ │ +
56
│ │ │ │ +
57}
│ │ │ │ +
58
│ │ │ │ +
59
│ │ │ │ +
60#endif // DUNE_COMMON_DOCUMENTATION_HH
│ │ │ │
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
│ │ │ │ +
@ implementationDefined
Definition documentation.hh:55
│ │ │ │ +
Dummy struct used for documentation purposes.
Definition documentation.hh:42
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,341 +1,38 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -dynvector.hh │ │ │ │ │ +documentation.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include "_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h" │ │ │ │ │ -18#include "_e_x_c_e_p_t_i_o_n_s_._h_h" │ │ │ │ │ -19#include "_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21#include │ │ │ │ │ -22#include "_d_e_n_s_e_v_e_c_t_o_r_._h_h" │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25 │ │ │ │ │ -34 template< class K, class Allocator > class DynamicVector; │ │ │ │ │ -35 template< class K, class Allocator > │ │ │ │ │ -_3_6 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s< _D_y_n_a_m_i_c_V_e_c_t_o_r< K, Allocator > > │ │ │ │ │ -37 { │ │ │ │ │ -_3_8 typedef _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _> _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ │ -_3_9 typedef std::vector< K, Allocator > _c_o_n_t_a_i_n_e_r___t_y_p_e; │ │ │ │ │ -_4_0 typedef K _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_4_1 typedef typename container_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -42 }; │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_COMMON_DOCUMENTATION_HH │ │ │ │ │ +7#define DUNE_COMMON_DOCUMENTATION_HH │ │ │ │ │ +8 │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14 │ │ │ │ │ +_4_2 struct _I_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d {}; │ │ │ │ │ 43 │ │ │ │ │ -44 template< class K, class Allocator > │ │ │ │ │ -_4_5 struct _F_i_e_l_d_T_r_a_i_t_s< _D_y_n_a_m_i_c_V_e_c_t_o_r< K, Allocator > > │ │ │ │ │ -46 { │ │ │ │ │ -_4_7 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_ _K_ _>_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_4_8 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_ _K_ _>_:_:_r_e_a_l___t_y_p_e _r_e_a_l___t_y_p_e; │ │ │ │ │ -49 }; │ │ │ │ │ -50 │ │ │ │ │ -57 template< class K, class Allocator = std::allocator< K > > │ │ │ │ │ -_5_8 class _D_y_n_a_m_i_c_V_e_c_t_o_r : public _D_e_n_s_e_V_e_c_t_o_r< DynamicVector< K, Allocator > > │ │ │ │ │ -59 { │ │ │ │ │ -60 std::vector< K, Allocator > _data; │ │ │ │ │ -61 │ │ │ │ │ -62 typedef _D_e_n_s_e_V_e_c_t_o_r_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _> > _B_a_s_e; │ │ │ │ │ -63 public: │ │ │ │ │ -_6_4 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -_6_5 typedef typename _B_a_s_e_:_:_v_a_l_u_e___t_y_p_e _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -66 │ │ │ │ │ -_6_7 typedef std::vector< K, Allocator > _c_o_n_t_a_i_n_e_r___t_y_p_e; │ │ │ │ │ -68 │ │ │ │ │ -_6_9 typedef Allocator _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -70 │ │ │ │ │ -_7_2 explicit _D_y_n_a_m_i_c_V_e_c_t_o_r(const _a_l_l_o_c_a_t_o_r___t_y_p_e &a = _a_l_l_o_c_a_t_o_r___t_y_p_e() ) : │ │ │ │ │ -73 _data( a ) │ │ │ │ │ -74 {} │ │ │ │ │ -75 │ │ │ │ │ -_7_6 explicit _D_y_n_a_m_i_c_V_e_c_t_o_r(_s_i_z_e___t_y_p_e n, const _a_l_l_o_c_a_t_o_r___t_y_p_e &a = _a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -() ) : │ │ │ │ │ -77 _data( n, _v_a_l_u_e___t_y_p_e(), a ) │ │ │ │ │ -78 {} │ │ │ │ │ -79 │ │ │ │ │ -_8_1 _D_y_n_a_m_i_c_V_e_c_t_o_r( _s_i_z_e___t_y_p_e n, _v_a_l_u_e___t_y_p_e c, const _a_l_l_o_c_a_t_o_r___t_y_p_e &a = │ │ │ │ │ -_a_l_l_o_c_a_t_o_r___t_y_p_e() ) : │ │ │ │ │ -82 _data( n, c, a ) │ │ │ │ │ -83 {} │ │ │ │ │ -84 │ │ │ │ │ -_8_6 _D_y_n_a_m_i_c_V_e_c_t_o_r (std::initializer_list const &l) : │ │ │ │ │ -87 _data(l) │ │ │ │ │ -88 {} │ │ │ │ │ -89 │ │ │ │ │ -_9_1 _D_y_n_a_m_i_c_V_e_c_t_o_r(const _D_y_n_a_m_i_c_V_e_c_t_o_r & x) : │ │ │ │ │ -92 _B_a_s_e(), _data(x._data) │ │ │ │ │ -93 {} │ │ │ │ │ -94 │ │ │ │ │ -_9_6 _D_y_n_a_m_i_c_V_e_c_t_o_r(_D_y_n_a_m_i_c_V_e_c_t_o_r && x) : │ │ │ │ │ -97 _data(_s_t_d::move(x._data)) │ │ │ │ │ -98 {} │ │ │ │ │ -99 │ │ │ │ │ -100 template< class T > │ │ │ │ │ -_1_0_1 _D_y_n_a_m_i_c_V_e_c_t_o_r(const _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _T_,_ _A_l_l_o_c_a_t_o_r_ _> & x) : │ │ │ │ │ -102 _data(x._b_e_g_i_n(), x._e_n_d(), x.get_allocator()) │ │ │ │ │ -103 {} │ │ │ │ │ -104 │ │ │ │ │ -106 template< class X > │ │ │ │ │ -_1_0_7 _D_y_n_a_m_i_c_V_e_c_t_o_r(const _D_e_n_s_e_V_e_c_t_o_r_<_ _X_ _> & x, const _a_l_l_o_c_a_t_o_r___t_y_p_e &a = │ │ │ │ │ -_a_l_l_o_c_a_t_o_r___t_y_p_e() ) : │ │ │ │ │ -108 _data(a) │ │ │ │ │ -109 { │ │ │ │ │ -110 const _s_i_z_e___t_y_p_e n = x._s_i_z_e(); │ │ │ │ │ -111 _data.reserve(n); │ │ │ │ │ -112 for( _s_i_z_e___t_y_p_e i =0; i │ │ │ │ │ -_1_8_9 inline std::istream &_o_p_e_r_a_t_o_r_>_>_ ( std::istream &in, │ │ │ │ │ -190 _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _> &v ) │ │ │ │ │ -191 { │ │ │ │ │ -192 _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _> w(v); │ │ │ │ │ -193 for( typename _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_s_i_z_e___t_y_p_e i = 0; i < w._s_i_z_e(); │ │ │ │ │ -++i ) │ │ │ │ │ -194 in >> w[ i ]; │ │ │ │ │ -195 if(in) │ │ │ │ │ -196 v = std::move(w); │ │ │ │ │ -197 return in; │ │ │ │ │ -198 } │ │ │ │ │ -199 │ │ │ │ │ -202} // end namespace │ │ │ │ │ -203 │ │ │ │ │ -204#endif │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h │ │ │ │ │ -Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ -_d_e_n_s_e_v_e_c_t_o_r_._h_h │ │ │ │ │ -Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ -_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ -Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ -Read a std::tuple. │ │ │ │ │ -DDeeffiinniittiioonn streamoperators.hh:43 │ │ │ │ │ -_D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S │ │ │ │ │ -#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ -nothing. │ │ │ │ │ -DDeeffiinniittiioonn boundschecking.hh:30 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_5_5 enum { _i_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d }; │ │ │ │ │ +56 │ │ │ │ │ +57} │ │ │ │ │ +58 │ │ │ │ │ +59 │ │ │ │ │ +60#endif // DUNE_COMMON_DOCUMENTATION_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r │ │ │ │ │ -Interface for a class of dense vectors over a given field. │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -Traits::value_type value_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:250 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -size method │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:336 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Traits::size_type size_type │ │ │ │ │ -The type used for the index access and size operation. │ │ │ │ │ -DDeeffiinniittiioonn densevector.hh:259 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -Construct a vector with a dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type n, value_type c=value_type()) │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(const DynamicVector &x) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Base::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_c_o_n_t_a_i_n_e_r___t_y_p_e │ │ │ │ │ -std::vector< K, Allocator > container_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -K & operator[](size_type i) │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_c_o_n_t_a_i_n_e_r │ │ │ │ │ -container_type & container() │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -Base::value_type value_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_d_a_t_a │ │ │ │ │ -const K * data() const noexcept │ │ │ │ │ -return pointer to underlying array │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -Allocator allocator_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(const allocator_type &a=allocator_type()) │ │ │ │ │ -Constructor making uninitialized vector. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(DynamicVector &&x) │ │ │ │ │ -Move constructor. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_d_a_t_a │ │ │ │ │ -K * data() noexcept │ │ │ │ │ -return pointer to underlying array │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -DynamicVector & operator=(DynamicVector &&other) │ │ │ │ │ -Move assignment operator. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -DynamicVector & operator=(const DynamicVector &other) │ │ │ │ │ -Copy assignment operator. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ -size_type capacity() const │ │ │ │ │ -Number of elements for which memory has been allocated. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_c_o_n_t_a_i_n_e_r │ │ │ │ │ -const container_type & container() const │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(size_type n, const allocator_type &a=allocator_type()) │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(std::initializer_list< K > const &l) │ │ │ │ │ -Construct from a std::initializer_list. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(const DynamicVector< T, Allocator > &x) │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const K & operator[](size_type i) const │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_r_e_s_e_r_v_e │ │ │ │ │ -void reserve(size_type n) │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(size_type n, value_type c, const allocator_type &a=allocator_type │ │ │ │ │ -()) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r_:_:_D_y_n_a_m_i_c_V_e_c_t_o_r │ │ │ │ │ -DynamicVector(const DenseVector< X > &x, const allocator_type &a=allocator_type │ │ │ │ │ -()) │ │ │ │ │ -Copy constructor from another DenseVector. │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:107 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -K value_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ -DynamicVector< K, Allocator > derived_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_c_o_n_t_a_i_n_e_r___t_y_p_e │ │ │ │ │ -std::vector< K, Allocator > container_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -container_type::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< K >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_y_n_a_m_i_c_V_e_c_t_o_r_<_ _K_,_ _A_l_l_o_c_a_t_o_r_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< K >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn dynvector.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:26 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -T field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn matvectraits.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_i_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d │ │ │ │ │ +@ implementationDefined │ │ │ │ │ +DDeeffiinniittiioonn documentation.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_D_e_f_i_n_e_d │ │ │ │ │ +Dummy struct used for documentation purposes. │ │ │ │ │ +DDeeffiinniittiioonn documentation.hh:42 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: assertandreturn.hh File Reference │ │ │ │ +dune-common: lru.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,28 +70,45 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
assertandreturn.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
lru.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ + │ │ │ │ +

LRU Cache Container, using an STL like interface. │ │ │ │ +More...

│ │ │ │ +
#include <list>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Macros

#define DUNE_ASSERT_AND_RETURN(C, X)   (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
 Asserts a condition and return on success in constexpr context.
 

│ │ │ │ +Classes

class  Dune::lru< Key, Tp, Traits >
 LRU Cache Container. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Namespaces

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

Detailed Description

│ │ │ │ +

LRU Cache Container, using an STL like interface.

│ │ │ │ +
Author
Christian Engwer
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,17 +1,29 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -assertandreturn.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +lru.hh File Reference │ │ │ │ │ +LRU Cache Container, using an STL like interface. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___A_S_S_E_R_T___A_N_D___R_E_T_U_R_N(C, X)   (!(C) ? throw [&](){assert(!#C);return │ │ │ │ │ - 0;}() : 0), X │ │ │ │ │ -  Asserts a condition and return on success in constexpr context. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_l_r_u_<_ _K_e_y_,_ _T_p_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +  LRU Cache Container. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +LRU Cache Container, using an STL like interface. │ │ │ │ │ + Author │ │ │ │ │ + Christian Engwer │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: assertandreturn.hh Source File │ │ │ │ +dune-common: lru.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,36 +74,238 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
assertandreturn.hh
│ │ │ │ +
lru.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_ASSERTANDRETURN_HH
│ │ │ │ -
6#define DUNE_COMMON_ASSERTANDRETURN_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_LRU_HH
│ │ │ │ +
6#define DUNE_COMMON_LRU_HH
│ │ │ │
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9
│ │ │ │ -
11
│ │ │ │ -
19#ifdef NDEBUG
│ │ │ │ -
20 #define DUNE_ASSERT_AND_RETURN(C,X) X
│ │ │ │ -
21#else
│ │ │ │ -
22 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
│ │ │ │ -
23#endif
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27#endif // DUNE_COMMON_ASSERTANDRETURN_HH
│ │ │ │ +
8#include <list>
│ │ │ │ +
9#include <utility>
│ │ │ │ +
10#include <map>
│ │ │ │ +
11#include <memory>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21
│ │ │ │ +
22 namespace {
│ │ │ │ +
23
│ │ │ │ +
24 /*
│ │ │ │ +
25 hide the default traits in an empty namespace
│ │ │ │ +
26 */
│ │ │ │ +
27 template <typename Key, typename Tp,
│ │ │ │ +
28 typename Alloc = std::allocator<Tp> >
│ │ │ │ +
29 struct _lru_default_traits
│ │ │ │ +
30 {
│ │ │ │ +
31 typedef Key key_type;
│ │ │ │ +
32 typedef Alloc allocator;
│ │ │ │ +
33 typedef std::list< std::pair<Key, Tp> > list_type;
│ │ │ │ +
34 typedef typename list_type::iterator iterator;
│ │ │ │ +
35 typedef typename std::less<key_type> cmp;
│ │ │ │ +
36 typedef std::map< key_type, iterator, cmp,
│ │ │ │ +
37 typename std::allocator_traits<allocator>::template rebind_alloc<std::pair<const key_type, iterator> > > map_type;
│ │ │ │ +
38 };
│ │ │ │ +
39
│ │ │ │ +
40 } // end empty namespace
│ │ │ │ +
41
│ │ │ │ +
49 template <typename Key, typename Tp,
│ │ │ │ +
50 typename Traits = _lru_default_traits<Key, Tp> >
│ │ │ │ +
│ │ │ │ +
51 class lru
│ │ │ │ +
52 {
│ │ │ │ +
53 typedef typename Traits::list_type list_type;
│ │ │ │ +
54 typedef typename Traits::map_type map_type;
│ │ │ │ +
55 typedef typename Traits::allocator allocator;
│ │ │ │ +
56 typedef typename map_type::iterator map_iterator;
│ │ │ │ +
57 typedef typename map_type::const_iterator const_map_iterator;
│ │ │ │ +
58
│ │ │ │ +
59 public:
│ │ │ │ +
60 typedef typename Traits::key_type key_type;
│ │ │ │ +
61 typedef typename allocator::value_type value_type;
│ │ │ │ +
62 using pointer = typename allocator::value_type*;
│ │ │ │ +
63 using const_pointer = typename allocator::value_type const*;
│ │ │ │ +
64 using const_reference = typename allocator::value_type const&;
│ │ │ │ +
65 using reference = typename allocator::value_type&;
│ │ │ │ +
66 typedef typename allocator::size_type size_type;
│ │ │ │ +
67 typedef typename list_type::iterator iterator;
│ │ │ │ +
68 typedef typename list_type::const_iterator const_iterator;
│ │ │ │ +
69
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
75 {
│ │ │ │ +
76 return _data.front().second;
│ │ │ │ +
77 }
│ │ │ │ +
│ │ │ │ +
78
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
84 {
│ │ │ │ +
85 return _data.front().second;
│ │ │ │ +
86 }
│ │ │ │ +
│ │ │ │ +
87
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
93 {
│ │ │ │ +
94 return _data.back().second;
│ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ +
101 const_reference back ([[maybe_unused]] int i) const
│ │ │ │ +
102 {
│ │ │ │ +
103 return _data.back().second;
│ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
106
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 {
│ │ │ │ +
112 key_type k = _data.front().first;
│ │ │ │ +
113 _data.pop_front();
│ │ │ │ +
114 _index.erase(k);
│ │ │ │ +
115 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
119 void pop_back()
│ │ │ │ +
120 {
│ │ │ │ +
121 key_type k = _data.back().first;
│ │ │ │ +
122 _data.pop_back();
│ │ │ │ +
123 _index.erase(k);
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125
│ │ │ │ +
│ │ │ │ +
131 iterator find (const key_type & key)
│ │ │ │ +
132 {
│ │ │ │ +
133 const map_iterator it = _index.find(key);
│ │ │ │ +
134 if (it == _index.end()) return _data.end();
│ │ │ │ +
135 return it->second;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
│ │ │ │ +
143 const_iterator find (const key_type & key) const
│ │ │ │ +
144 {
│ │ │ │ +
145 const map_iterator it = _index.find(key);
│ │ │ │ +
146 if (it == _index.end()) return _data.end();
│ │ │ │ +
147 return it->second;
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
162 {
│ │ │ │ +
163 std::pair<key_type, value_type> x(key, data);
│ │ │ │ +
164 /* insert item as mru */
│ │ │ │ +
165 iterator it = _data.insert(_data.begin(), x);
│ │ │ │ +
166 /* store index */
│ │ │ │ +
167 _index.insert(std::make_pair(key,it));
│ │ │ │ +
168
│ │ │ │ +
169 return it->second;
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │ +
171
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
176 {
│ │ │ │ +
177 return touch (key);
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
186 {
│ │ │ │ +
187 /* query _index for iterator */
│ │ │ │ +
188 map_iterator it = _index.find(key);
│ │ │ │ +
189 if (it == _index.end())
│ │ │ │ + │ │ │ │ +
191 "Failed to touch key " << key << ", it is not in the lru container");
│ │ │ │ +
192 /* update _data
│ │ │ │ +
193 move it to the front
│ │ │ │ +
194 */
│ │ │ │ +
195 _data.splice(_data.begin(), _data, it->second);
│ │ │ │ +
196 return it->second->second;
│ │ │ │ +
197 }
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 return _data.size();
│ │ │ │ +
205 }
│ │ │ │ +
│ │ │ │ +
206
│ │ │ │ +
│ │ │ │ +
213 void resize(size_type new_size)
│ │ │ │ +
214 {
│ │ │ │ +
215 assert(new_size <= size());
│ │ │ │ +
216
│ │ │ │ +
217 while (new_size < size())
│ │ │ │ +
218 pop_back();
│ │ │ │ +
219 }
│ │ │ │ +
│ │ │ │ +
220
│ │ │ │ +
│ │ │ │ +
224 void clear()
│ │ │ │ +
225 {
│ │ │ │ +
226 _data.clear();
│ │ │ │ +
227 _index.clear();
│ │ │ │ +
228 }
│ │ │ │ +
│ │ │ │ +
229
│ │ │ │ +
230 private:
│ │ │ │ +
231 list_type _data;
│ │ │ │ +
232 map_type _index;
│ │ │ │ +
233
│ │ │ │ +
234 };
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
236} // namespace Dune
│ │ │ │ +
237
│ │ │ │ +
238#endif // DUNE_COMMON_LRU_HH
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ +
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
Default exception class for range errors.
Definition exceptions.hh:254
│ │ │ │ +
LRU Cache Container.
Definition lru.hh:52
│ │ │ │ +
void pop_back()
Removes the last element.
Definition lru.hh:119
│ │ │ │ +
iterator find(const key_type &key)
Finds the element whose key is k.
Definition lru.hh:131
│ │ │ │ +
reference insert(const key_type &key)
mark data associated with key as most recent
Definition lru.hh:175
│ │ │ │ +
list_type::const_iterator const_iterator
Definition lru.hh:68
│ │ │ │ +
void resize(size_type new_size)
ensure a maximum size of the container
Definition lru.hh:213
│ │ │ │ +
allocator::size_type size_type
Definition lru.hh:66
│ │ │ │ +
list_type::iterator iterator
Definition lru.hh:67
│ │ │ │ +
allocator::value_type value_type
Definition lru.hh:61
│ │ │ │ +
const_reference front() const
Definition lru.hh:83
│ │ │ │ +
typename allocator::value_type const * const_pointer
Definition lru.hh:63
│ │ │ │ +
size_type size() const
Retrieve number of entries in the container.
Definition lru.hh:202
│ │ │ │ +
typename allocator::value_type & reference
Definition lru.hh:65
│ │ │ │ +
reference back()
Definition lru.hh:92
│ │ │ │ +
void pop_front()
Removes the first element.
Definition lru.hh:110
│ │ │ │ +
reference front()
Definition lru.hh:74
│ │ │ │ +
void clear()
Definition lru.hh:224
│ │ │ │ +
reference touch(const key_type &key)
mark data associated with key as most recent
Definition lru.hh:185
│ │ │ │ +
reference insert(const key_type &key, const_reference data)
Insert a value into the container.
Definition lru.hh:161
│ │ │ │ +
typename allocator::value_type * pointer
Definition lru.hh:62
│ │ │ │ +
const_iterator find(const key_type &key) const
Finds the element whose key is k.
Definition lru.hh:143
│ │ │ │ +
typename allocator::value_type const & const_reference
Definition lru.hh:64
│ │ │ │ +
Traits::key_type key_type
Definition lru.hh:60
│ │ │ │ +
const_reference back(int i) const
Definition lru.hh:101
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,31 +1,267 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -assertandreturn.hh │ │ │ │ │ +lru.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_ASSERTANDRETURN_HH │ │ │ │ │ -6#define DUNE_COMMON_ASSERTANDRETURN_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_LRU_HH │ │ │ │ │ +6#define DUNE_COMMON_LRU_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -11 │ │ │ │ │ -19#ifdef NDEBUG │ │ │ │ │ -20 #define DUNE_ASSERT_AND_RETURN(C,X) X │ │ │ │ │ -21#else │ │ │ │ │ -_2_2 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return │ │ │ │ │ -0;}() : 0), X │ │ │ │ │ -23#endif │ │ │ │ │ -24 │ │ │ │ │ -25 │ │ │ │ │ -26 │ │ │ │ │ -27#endif // DUNE_COMMON_ASSERTANDRETURN_HH │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +14 │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21 │ │ │ │ │ +22 namespace { │ │ │ │ │ +23 │ │ │ │ │ +24 /* │ │ │ │ │ +25 hide the default traits in an empty namespace │ │ │ │ │ +26 */ │ │ │ │ │ +27 template > │ │ │ │ │ +29 struct _lru_default_traits │ │ │ │ │ +30 { │ │ │ │ │ +31 typedef Key key_type; │ │ │ │ │ +32 typedef Alloc allocator; │ │ │ │ │ +33 typedef std::list< std::pair > list_type; │ │ │ │ │ +34 typedef typename list_type::iterator iterator; │ │ │ │ │ +35 typedef typename std::less cmp; │ │ │ │ │ +36 typedef std::map< key_type, iterator, cmp, │ │ │ │ │ +37 typename std::allocator_traits::template rebind_alloc > > map_type; │ │ │ │ │ +38 }; │ │ │ │ │ +39 │ │ │ │ │ +40 } // end empty namespace │ │ │ │ │ +41 │ │ │ │ │ +49 template > │ │ │ │ │ +_5_1 class _l_r_u │ │ │ │ │ +52 { │ │ │ │ │ +53 typedef typename Traits::list_type list_type; │ │ │ │ │ +54 typedef typename Traits::map_type map_type; │ │ │ │ │ +55 typedef typename Traits::allocator allocator; │ │ │ │ │ +56 typedef typename map_type::iterator map_iterator; │ │ │ │ │ +57 typedef typename map_type::const_iterator const_map_iterator; │ │ │ │ │ +58 │ │ │ │ │ +59 public: │ │ │ │ │ +_6_0 typedef typename Traits::key_type _k_e_y___t_y_p_e; │ │ │ │ │ +_6_1 typedef typename allocator::value_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_6_2 using _p_o_i_n_t_e_r = typename allocator::value_type*; │ │ │ │ │ +_6_3 using _c_o_n_s_t___p_o_i_n_t_e_r = typename allocator::value_type const*; │ │ │ │ │ +_6_4 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = typename allocator::value_type const&; │ │ │ │ │ +_6_5 using _r_e_f_e_r_e_n_c_e = typename allocator::value_type&; │ │ │ │ │ +_6_6 typedef typename allocator::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +_6_7 typedef typename list_type::iterator _i_t_e_r_a_t_o_r; │ │ │ │ │ +_6_8 typedef typename list_type::const_iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +69 │ │ │ │ │ +_7_4 _r_e_f_e_r_e_n_c_e _f_r_o_n_t() │ │ │ │ │ +75 { │ │ │ │ │ +76 return _data.front().second; │ │ │ │ │ +77 } │ │ │ │ │ +78 │ │ │ │ │ +_8_3 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const │ │ │ │ │ +84 { │ │ │ │ │ +85 return _data.front().second; │ │ │ │ │ +86 } │ │ │ │ │ +87 │ │ │ │ │ +_9_2 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ +93 { │ │ │ │ │ +94 return _data.back().second; │ │ │ │ │ +95 } │ │ │ │ │ +96 │ │ │ │ │ +_1_0_1 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k ([[maybe_unused]] int i) const │ │ │ │ │ +102 { │ │ │ │ │ +103 return _data.back().second; │ │ │ │ │ +104 } │ │ │ │ │ +105 │ │ │ │ │ +106 │ │ │ │ │ +_1_1_0 void _p_o_p___f_r_o_n_t() │ │ │ │ │ +111 { │ │ │ │ │ +112 _k_e_y___t_y_p_e k = _data.front().first; │ │ │ │ │ +113 _data.pop_front(); │ │ │ │ │ +114 _index.erase(k); │ │ │ │ │ +115 } │ │ │ │ │ +_1_1_9 void _p_o_p___b_a_c_k() │ │ │ │ │ +120 { │ │ │ │ │ +121 _k_e_y___t_y_p_e k = _data.back().first; │ │ │ │ │ +122 _data.pop_back(); │ │ │ │ │ +123 _index.erase(k); │ │ │ │ │ +124 } │ │ │ │ │ +125 │ │ │ │ │ +_1_3_1 _i_t_e_r_a_t_o_r _f_i_n_d (const _k_e_y___t_y_p_e & key) │ │ │ │ │ +132 { │ │ │ │ │ +133 const map_iterator it = _index.find(key); │ │ │ │ │ +134 if (it == _index.end()) return _data.end(); │ │ │ │ │ +135 return it->second; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +_1_4_3 _c_o_n_s_t___i_t_e_r_a_t_o_r _f_i_n_d (const _k_e_y___t_y_p_e & key) const │ │ │ │ │ +144 { │ │ │ │ │ +145 const map_iterator it = _index.find(key); │ │ │ │ │ +146 if (it == _index.end()) return _data.end(); │ │ │ │ │ +147 return it->second; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +_1_6_1 _r_e_f_e_r_e_n_c_e _i_n_s_e_r_t (const _k_e_y___t_y_p_e & key, _c_o_n_s_t___r_e_f_e_r_e_n_c_e data) │ │ │ │ │ +162 { │ │ │ │ │ +163 std::pair x(key, data); │ │ │ │ │ +164 /* insert item as mru */ │ │ │ │ │ +165 _i_t_e_r_a_t_o_r it = _data.insert(_data.begin(), x); │ │ │ │ │ +166 /* store index */ │ │ │ │ │ +167 _index.insert(std::make_pair(key,it)); │ │ │ │ │ +168 │ │ │ │ │ +169 return it->second; │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +_1_7_5 _r_e_f_e_r_e_n_c_e _i_n_s_e_r_t (const _k_e_y___t_y_p_e & key) │ │ │ │ │ +176 { │ │ │ │ │ +177 return _t_o_u_c_h (key); │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +_1_8_5 _r_e_f_e_r_e_n_c_e _t_o_u_c_h (const _k_e_y___t_y_p_e & key) │ │ │ │ │ +186 { │ │ │ │ │ +187 /* query _index for iterator */ │ │ │ │ │ +188 map_iterator it = _index.find(key); │ │ │ │ │ +189 if (it == _index.end()) │ │ │ │ │ +190 _D_U_N_E___T_H_R_O_W(_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r, │ │ │ │ │ +191 "Failed to touch key " << key << ", it is not in the lru container"); │ │ │ │ │ +192 /* update _data │ │ │ │ │ +193 move it to the front │ │ │ │ │ +194 */ │ │ │ │ │ +195 _data.splice(_data.begin(), _data, it->second); │ │ │ │ │ +196 return it->second->second; │ │ │ │ │ +197 } │ │ │ │ │ +198 │ │ │ │ │ +_2_0_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +203 { │ │ │ │ │ +204 return _data.size(); │ │ │ │ │ +205 } │ │ │ │ │ +206 │ │ │ │ │ +_2_1_3 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e new_size) │ │ │ │ │ +214 { │ │ │ │ │ +215 assert(new_size <= _s_i_z_e()); │ │ │ │ │ +216 │ │ │ │ │ +217 while (new_size < _s_i_z_e()) │ │ │ │ │ +218 _p_o_p___b_a_c_k(); │ │ │ │ │ +219 } │ │ │ │ │ +220 │ │ │ │ │ +_2_2_4 void _c_l_e_a_r() │ │ │ │ │ +225 { │ │ │ │ │ +226 _data.clear(); │ │ │ │ │ +227 _index.clear(); │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +230 private: │ │ │ │ │ +231 list_type _data; │ │ │ │ │ +232 map_type _index; │ │ │ │ │ +233 │ │ │ │ │ +234 }; │ │ │ │ │ +235 │ │ │ │ │ +236} // namespace Dune │ │ │ │ │ +237 │ │ │ │ │ +238#endif // DUNE_COMMON_LRU_HH │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +Dune namespace. │ │ │ │ │ +DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ +Default exception class for range errors. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u │ │ │ │ │ +LRU Cache Container. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_p_o_p___b_a_c_k │ │ │ │ │ +void pop_back() │ │ │ │ │ +Removes the last element. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_f_i_n_d │ │ │ │ │ +iterator find(const key_type &key) │ │ │ │ │ +Finds the element whose key is k. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_i_n_s_e_r_t │ │ │ │ │ +reference insert(const key_type &key) │ │ │ │ │ +mark data associated with key as most recent │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +list_type::const_iterator const_iterator │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type new_size) │ │ │ │ │ +ensure a maximum size of the container │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:213 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +allocator::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +list_type::iterator iterator │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +allocator::value_type value_type │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_f_r_o_n_t │ │ │ │ │ +const_reference front() const │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ +typename allocator::value_type const * const_pointer │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Retrieve number of entries in the container. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +typename allocator::value_type & reference │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_b_a_c_k │ │ │ │ │ +reference back() │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_p_o_p___f_r_o_n_t │ │ │ │ │ +void pop_front() │ │ │ │ │ +Removes the first element. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_f_r_o_n_t │ │ │ │ │ +reference front() │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_t_o_u_c_h │ │ │ │ │ +reference touch(const key_type &key) │ │ │ │ │ +mark data associated with key as most recent │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_i_n_s_e_r_t │ │ │ │ │ +reference insert(const key_type &key, const_reference data) │ │ │ │ │ +Insert a value into the container. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_p_o_i_n_t_e_r │ │ │ │ │ +typename allocator::value_type * pointer │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_f_i_n_d │ │ │ │ │ +const_iterator find(const key_type &key) const │ │ │ │ │ +Finds the element whose key is k. │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +typename allocator::value_type const & const_reference │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_k_e_y___t_y_p_e │ │ │ │ │ +Traits::key_type key_type │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_l_r_u_:_:_b_a_c_k │ │ │ │ │ +const_reference back(int i) const │ │ │ │ │ +DDeeffiinniittiioonn lru.hh:101 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorrange.hh File Reference │ │ │ │ +dune-common: make_array.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,38 +65,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
iteratorrange.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
make_array.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ +
#include <array>
│ │ │ │ +#include <type_traits>
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::IteratorRange< Iterator >
 Simple range between a begin and an end iterator. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,19 +1,27 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -iteratorrange.hh File Reference │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +make_array.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_<_ _I_t_e_r_a_t_o_r_ _> │ │ │ │ │ -  Simple range between a begin and an end iterator. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::array< typename std::common_type< _D_u_n_e_:_:_S_t_d_:_:_m_a_k_e___a_r_r_a_y (const Args &... │ │ │ │ │ + Args... >::type, sizeof...(Args)>  args) │ │ │ │ │ +  Create and initialize an array. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorrange.hh Source File │ │ │ │ +dune-common: make_array.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,88 +70,64 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
iteratorrange.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
│ │ │ │ -
5#ifndef DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │ -
6#define DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │ -
7
│ │ │ │ -
8namespace Dune {
│ │ │ │ -
9
│ │ │ │ -
11
│ │ │ │ -
20 template<typename Iterator>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
22 {
│ │ │ │ +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#include <array>
│ │ │ │ +
7#include <type_traits>
│ │ │ │ +
8
│ │ │ │ +
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 {
│ │ │ │ +
17namespace Std {
│ │ │ │ +
18
│ │ │ │ +
19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ +
20
│ │ │ │ +
22 using std::experimental::make_array;
│ │ │ │
23
│ │ │ │ -
24 public:
│ │ │ │ +
24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │
25
│ │ │ │ -
27 typedef Iterator iterator;
│ │ │ │ -
28
│ │ │ │ -
30
│ │ │ │ -
33 typedef Iterator const_iterator;
│ │ │ │ -
34
│ │ │ │ -
│ │ │ │ -
36 IteratorRange(const Iterator& begin, const Iterator& end)
│ │ │ │ -
37 : _begin(begin)
│ │ │ │ -
38 , _end(end)
│ │ │ │ -
39 {}
│ │ │ │ -
│ │ │ │ -
40
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
43 {}
│ │ │ │ -
│ │ │ │ -
44
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
47 {
│ │ │ │ -
48 return _begin;
│ │ │ │ -
49 }
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ -
52 iterator end() const
│ │ │ │ -
53 {
│ │ │ │ -
54 return _end;
│ │ │ │ -
55 }
│ │ │ │ -
│ │ │ │ -
56
│ │ │ │ -
57 private:
│ │ │ │ -
58
│ │ │ │ -
59 Iterator _begin;
│ │ │ │ -
60 Iterator _end;
│ │ │ │ -
61
│ │ │ │ -
62 };
│ │ │ │ -
│ │ │ │ -
63
│ │ │ │ -
64}
│ │ │ │ -
65
│ │ │ │ -
66#endif // DUNE_COMMON_ITERATORRANGE_HH
│ │ │ │ +
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
│ │ │ │ -
Simple range between a begin and an end iterator.
Definition iteratorrange.hh:22
│ │ │ │ -
iterator begin() const
Returns an iterator pointing to the begin of the range.
Definition iteratorrange.hh:46
│ │ │ │ -
Iterator const_iterator
The iterator belonging to this range.
Definition iteratorrange.hh:33
│ │ │ │ -
iterator end() const
Returns an iterator pointing past the end of the range.
Definition iteratorrange.hh:52
│ │ │ │ -
IteratorRange()
Default constructor, relies on iterators being default-constructible.
Definition iteratorrange.hh:42
│ │ │ │ -
Iterator iterator
The iterator belonging to this range.
Definition iteratorrange.hh:27
│ │ │ │ -
IteratorRange(const Iterator &begin, const Iterator &end)
Constructs an iterator range on [begin,end).
Definition iteratorrange.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,90 +1,59 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -iteratorrange.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +make_array.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -3// SPDX-FileCopyrightInfo: Copyright (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_ITERATORRANGE_HH │ │ │ │ │ -6#define DUNE_COMMON_ITERATORRANGE_HH │ │ │ │ │ -7 │ │ │ │ │ -8namespace _D_u_n_e { │ │ │ │ │ -9 │ │ │ │ │ -11 │ │ │ │ │ -20 template │ │ │ │ │ -_2_1 class _I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ -22 { │ │ │ │ │ +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#include │ │ │ │ │ +7#include │ │ │ │ │ +8 │ │ │ │ │ +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 _D_u_n_e { │ │ │ │ │ +17namespace Std { │ │ │ │ │ +18 │ │ │ │ │ +19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ +20 │ │ │ │ │ +22 using std::experimental::make_array; │ │ │ │ │ 23 │ │ │ │ │ -24 public: │ │ │ │ │ +24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ 25 │ │ │ │ │ -_2_7 typedef Iterator _i_t_e_r_a_t_o_r; │ │ │ │ │ -28 │ │ │ │ │ -30 │ │ │ │ │ -_3_3 typedef Iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -34 │ │ │ │ │ -_3_6 _I_t_e_r_a_t_o_r_R_a_n_g_e(const Iterator& _b_e_g_i_n, const Iterator& _e_n_d) │ │ │ │ │ -37 : _begin(_b_e_g_i_n) │ │ │ │ │ -38 , _end(_e_n_d) │ │ │ │ │ -39 {} │ │ │ │ │ -40 │ │ │ │ │ -_4_2 _I_t_e_r_a_t_o_r_R_a_n_g_e() │ │ │ │ │ -43 {} │ │ │ │ │ -44 │ │ │ │ │ -_4_6 _i_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ -47 { │ │ │ │ │ -48 return _begin; │ │ │ │ │ -49 } │ │ │ │ │ +27 │ │ │ │ │ +41 template │ │ │ │ │ +42 std::array::type, sizeof...(Args)> │ │ │ │ │ +_4_3 _m_a_k_e___a_r_r_a_y(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 │ │ │ │ │ -_5_2 _i_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ -53 { │ │ │ │ │ -54 return _end; │ │ │ │ │ -55 } │ │ │ │ │ -56 │ │ │ │ │ -57 private: │ │ │ │ │ -58 │ │ │ │ │ -59 Iterator _begin; │ │ │ │ │ -60 Iterator _end; │ │ │ │ │ -61 │ │ │ │ │ -62 }; │ │ │ │ │ -63 │ │ │ │ │ -64} │ │ │ │ │ -65 │ │ │ │ │ -66#endif // DUNE_COMMON_ITERATORRANGE_HH │ │ │ │ │ +51} │ │ │ │ │ +52} │ │ │ │ │ +53 │ │ │ │ │ +54#endif │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_a_k_e___a_r_r_a_y │ │ │ │ │ +std::array< typename std::common_type< Args... >::type, sizeof...(Args)> │ │ │ │ │ +make_array(const Args &... args) │ │ │ │ │ +Create and initialize an array. │ │ │ │ │ +DDeeffiinniittiioonn make_array.hh:43 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ -Simple range between a begin and an end iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() const │ │ │ │ │ -Returns an iterator pointing to the begin of the range. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator const_iterator │ │ │ │ │ -The iterator belonging to this range. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_e_n_d │ │ │ │ │ -iterator end() const │ │ │ │ │ -Returns an iterator pointing past the end of the range. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ -IteratorRange() │ │ │ │ │ -Default constructor, relies on iterators being default-constructible. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator iterator │ │ │ │ │ -The iterator belonging to this range. │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e_:_:_I_t_e_r_a_t_o_r_R_a_n_g_e │ │ │ │ │ -IteratorRange(const Iterator &begin, const Iterator &end) │ │ │ │ │ -Constructs an iterator range on [begin,end). │ │ │ │ │ -DDeeffiinniittiioonn iteratorrange.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: enumset.hh File Reference │ │ │ │ +dune-common: apply.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,77 +65,36 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
enumset.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
apply.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Classes for building sets out of enumeration values. │ │ │ │ -More...

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

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::EmptySet< TA >
 An empty set. More...
 
class  Dune::AllSet< TA >
 A set containing everything. More...
 
class  Dune::EnumItem< TA, item >
 A set consisting only of one item. More...
 
class  Dune::EnumRange< TA, from, end >
 A set representing a range including the borders. More...
 
class  Dune::NegateSet< S >
 The negation of a set. An item is contained in the set if and only if it is not contained in the negated set. More...
 
class  Dune::Combine< TI1, TI2, TA >
 A set combining two other sets. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<typename TA , int i>
std::ostream & Dune::operator<< (std::ostream &os, const EnumItem< TA, i > &)
 
template<typename TA , int from, int to>
std::ostream & Dune::operator<< (std::ostream &os, const EnumRange< TA, from, to > &)
 
template<class TI1 , class TI2 >
Combine< TI1, TI2, typename TI1::Type > Dune::combine (const TI1 &set1, const TI2 &set2)
 
template<class TI1 , class TI2 , class T >
std::ostream & Dune::operator<< (std::ostream &os, const Combine< TI1, TI2, T > &)
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Classes for building sets out of enumeration values.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,58 +1,20 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -enumset.hh File Reference │ │ │ │ │ -Classes for building sets out of enumeration values. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +apply.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_E_m_p_t_y_S_e_t_<_ _T_A_ _> │ │ │ │ │ -  An empty set. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_l_l_S_e_t_<_ _T_A_ _> │ │ │ │ │ -  A set containing everything. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_E_n_u_m_I_t_e_m_<_ _T_A_,_ _i_t_e_m_ _> │ │ │ │ │ -  A set consisting only of one item. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_E_n_u_m_R_a_n_g_e_<_ _T_A_,_ _f_r_o_m_,_ _e_n_d_ _> │ │ │ │ │ -  A set representing a range including the borders. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_N_e_g_a_t_e_S_e_t_<_ _S_ _> │ │ │ │ │ -  The negation of a set. An item is contained in the set if and only if │ │ │ │ │ - it is not contained in the negated set. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_C_o_m_b_i_n_e_<_ _T_I_1_,_ _T_I_2_,_ _T_A_ _> │ │ │ │ │ -  A set combining two other sets. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ - const _E_n_u_m_I_t_e_m< TA, i > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ - const _E_n_u_m_R_a_n_g_e< TA, from, to > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_C_o_m_b_i_n_e< TI1, TI2, typename TI1::Type >  _D_u_n_e_:_:_c_o_m_b_i_n_e (const TI1 &set1, const │ │ │ │ │ - TI2 &set2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, │ │ │ │ │ - const _C_o_m_b_i_n_e< TI1, TI2, T > &) │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Classes for building sets out of enumeration values. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: enumset.hh Source File │ │ │ │ +dune-common: apply.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,194 +70,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
enumset.hh
│ │ │ │ +
apply.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_ENUMSET_HH
│ │ │ │ -
6#define DUNE_ENUMSET_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_STD_APPLY_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_APPLY_HH
│ │ │ │
7
│ │ │ │ -
8#include <iostream>
│ │ │ │ +
8#include <tuple>
│ │ │ │
9
│ │ │ │
10namespace Dune
│ │ │ │
11{
│ │ │ │ -
25 template<typename TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
27 {
│ │ │ │ -
28 public:
│ │ │ │ -
32 typedef TA Type;
│ │ │ │ -
36 static bool contains(const Type& attribute);
│ │ │ │ -
37 };
│ │ │ │ -
│ │ │ │ -
38
│ │ │ │ -
42 template<typename TA>
│ │ │ │ -
│ │ │ │ -
43 class AllSet
│ │ │ │ -
44 {
│ │ │ │ -
45 public:
│ │ │ │ -
49 typedef TA Type;
│ │ │ │ -
53 static bool contains(const Type& attribute);
│ │ │ │ -
54 };
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
59 template<typename TA, int item>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 public:
│ │ │ │ -
66 typedef TA Type;
│ │ │ │ -
67
│ │ │ │ -
72 static bool contains(const Type& attribute);
│ │ │ │ -
73 };
│ │ │ │ -
│ │ │ │ -
74
│ │ │ │ -
78 template<typename TA,int from, int end>
│ │ │ │ -
│ │ │ │ -
79 class EnumRange //: public PODSet<EnumRange<T,from,end>,T>
│ │ │ │ -
80 {
│ │ │ │ -
81 public:
│ │ │ │ -
85 typedef TA Type;
│ │ │ │ -
86 static bool contains(const Type& item);
│ │ │ │ -
87 };
│ │ │ │ -
│ │ │ │ -
88
│ │ │ │ -
94 template<typename S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
96 {
│ │ │ │ -
97 public:
│ │ │ │ -
98 typedef typename S::Type Type;
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
100 static bool contains(const Type& item)
│ │ │ │ -
101 {
│ │ │ │ -
102 return !S::contains(item);
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104 };
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
109 template<class TI1, class TI2, typename TA=typename TI1::Type>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 {
│ │ │ │ -
112 public:
│ │ │ │ -
113 static bool contains(const TA& item);
│ │ │ │ -
114 };
│ │ │ │ -
│ │ │ │ -
115
│ │ │ │ -
116 template<typename TA>
│ │ │ │ -
│ │ │ │ -
117 inline bool EmptySet<TA>::contains([[maybe_unused]] const Type& attribute)
│ │ │ │ -
118 {
│ │ │ │ -
119 return false;
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 template<typename TA>
│ │ │ │ -
│ │ │ │ -
123 inline bool AllSet<TA>::contains([[maybe_unused]] const Type& attribute)
│ │ │ │ -
124 {
│ │ │ │ -
125 return true;
│ │ │ │ -
126 }
│ │ │ │ -
│ │ │ │ -
127
│ │ │ │ -
128 template<typename TA,int i>
│ │ │ │ -
│ │ │ │ -
129 inline bool EnumItem<TA,i>::contains(const Type& item)
│ │ │ │ -
130 {
│ │ │ │ -
131 return item==i;
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
134 template<typename TA,int i>
│ │ │ │ -
│ │ │ │ -
135 inline std::ostream& operator<<(std::ostream& os, const EnumItem<TA,i>&)
│ │ │ │ -
136 {
│ │ │ │ -
137 return os<<i;
│ │ │ │ -
138 }
│ │ │ │ -
│ │ │ │ -
139
│ │ │ │ -
140 template<typename TA, int from, int to>
│ │ │ │ -
│ │ │ │ -
141 inline bool EnumRange<TA,from,to>::contains(const Type& item)
│ │ │ │ -
142 {
│ │ │ │ -
143 return from<=item && item<=to;
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
145
│ │ │ │ -
146 template<typename TA, int from, int to>
│ │ │ │ -
│ │ │ │ -
147 inline std::ostream& operator<<(std::ostream& os, const EnumRange<TA,from,to>&)
│ │ │ │ -
148 {
│ │ │ │ -
149 return os<<"["<<from<<" - "<<to<<"]";
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
152 template<class TI1, class TI2, typename TA>
│ │ │ │ -
│ │ │ │ -
153 inline bool Combine<TI1,TI2,TA>::contains(const TA& item)
│ │ │ │ -
154 {
│ │ │ │ -
155 return TI1::contains(item) ||
│ │ │ │ -
156 TI2::contains(item);
│ │ │ │ -
157 }
│ │ │ │ -
│ │ │ │ -
158
│ │ │ │ -
159 template<class TI1, class TI2>
│ │ │ │ -
│ │ │ │ -
160 inline Combine<TI1,TI2,typename TI1::Type> combine([[maybe_unused]] const TI1& set1,
│ │ │ │ -
161 [[maybe_unused]] const TI2& set2)
│ │ │ │ -
162 {
│ │ │ │ - │ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
166 template<class TI1, class TI2, class T>
│ │ │ │ -
│ │ │ │ -
167 inline std::ostream& operator<<(std::ostream& os, const Combine<TI1,TI2,T>&)
│ │ │ │ -
168 {
│ │ │ │ -
169 return os << TI1()<<" "<<TI2();
│ │ │ │ -
170 }
│ │ │ │ -
│ │ │ │ -
172}
│ │ │ │ -
173
│ │ │ │ -
174#endif
│ │ │ │ -
static bool contains(const Type &attribute)
Always returns true.
Definition enumset.hh:123
│ │ │ │ -
static bool contains(const Type &item)
Definition enumset.hh:141
│ │ │ │ -
static bool contains(const TA &item)
Definition enumset.hh:153
│ │ │ │ -
static bool contains(const Type &attribute)
Always returns false.
Definition enumset.hh:117
│ │ │ │ -
static bool contains(const Type &attribute)
Tests whether an item is in the set.
Definition enumset.hh:129
│ │ │ │ -
Combine< TI1, TI2, typename TI1::Type > combine(const TI1 &set1, const TI2 &set2)
Definition enumset.hh:160
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ +
│ │ │ │ +
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
│ │ │ │ -
An empty set.
Definition enumset.hh:27
│ │ │ │ -
TA Type
The POD type the set holds.
Definition enumset.hh:32
│ │ │ │ -
A set containing everything.
Definition enumset.hh:44
│ │ │ │ -
TA Type
The POD type the set holds.
Definition enumset.hh:49
│ │ │ │ -
A set consisting only of one item.
Definition enumset.hh:61
│ │ │ │ -
TA Type
The type the set holds.
Definition enumset.hh:66
│ │ │ │ -
A set representing a range including the borders.
Definition enumset.hh:80
│ │ │ │ -
TA Type
The type the set holds.
Definition enumset.hh:85
│ │ │ │ -
The negation of a set. An item is contained in the set if and only if it is not contained in the nega...
Definition enumset.hh:96
│ │ │ │ -
S::Type Type
Definition enumset.hh:98
│ │ │ │ -
static bool contains(const Type &item)
Definition enumset.hh:100
│ │ │ │ -
A set combining two other sets.
Definition enumset.hh:111
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,204 +1,35 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -enumset.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +apply.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_ENUMSET_HH │ │ │ │ │ -6#define DUNE_ENUMSET_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ +6#define DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ 10namespace _D_u_n_e │ │ │ │ │ 11{ │ │ │ │ │ -25 template │ │ │ │ │ -_2_6 class _E_m_p_t_y_S_e_t │ │ │ │ │ -27 { │ │ │ │ │ -28 public: │ │ │ │ │ -_3_2 typedef TA _T_y_p_e; │ │ │ │ │ -36 static bool _c_o_n_t_a_i_n_s(const _T_y_p_e& attribute); │ │ │ │ │ -37 }; │ │ │ │ │ -38 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 class _A_l_l_S_e_t │ │ │ │ │ -44 { │ │ │ │ │ -45 public: │ │ │ │ │ -_4_9 typedef TA _T_y_p_e; │ │ │ │ │ -53 static bool _c_o_n_t_a_i_n_s(const _T_y_p_e& attribute); │ │ │ │ │ -54 }; │ │ │ │ │ -55 │ │ │ │ │ -59 template │ │ │ │ │ -_6_0 class _E_n_u_m_I_t_e_m │ │ │ │ │ -61 { │ │ │ │ │ -62 public: │ │ │ │ │ -_6_6 typedef TA _T_y_p_e; │ │ │ │ │ -67 │ │ │ │ │ -72 static bool _c_o_n_t_a_i_n_s(const _T_y_p_e& attribute); │ │ │ │ │ -73 }; │ │ │ │ │ -74 │ │ │ │ │ -78 template │ │ │ │ │ -_7_9 class _E_n_u_m_R_a_n_g_e //: public PODSet,T> │ │ │ │ │ -80 { │ │ │ │ │ -81 public: │ │ │ │ │ -_8_5 typedef TA _T_y_p_e; │ │ │ │ │ -86 static bool _c_o_n_t_a_i_n_s(const _T_y_p_e& item); │ │ │ │ │ -87 }; │ │ │ │ │ -88 │ │ │ │ │ -94 template │ │ │ │ │ -_9_5 class _N_e_g_a_t_e_S_e_t │ │ │ │ │ -96 { │ │ │ │ │ -97 public: │ │ │ │ │ -_9_8 typedef typename S::Type _T_y_p_e; │ │ │ │ │ -99 │ │ │ │ │ -_1_0_0 static bool _c_o_n_t_a_i_n_s(const _T_y_p_e& item) │ │ │ │ │ -101 { │ │ │ │ │ -102 return !S::contains(item); │ │ │ │ │ -103 } │ │ │ │ │ -104 }; │ │ │ │ │ -105 │ │ │ │ │ -109 template │ │ │ │ │ -_1_1_0 class _C_o_m_b_i_n_e │ │ │ │ │ -111 { │ │ │ │ │ -112 public: │ │ │ │ │ -113 static bool _c_o_n_t_a_i_n_s(const TA& item); │ │ │ │ │ -114 }; │ │ │ │ │ -115 │ │ │ │ │ -116 template │ │ │ │ │ -_1_1_7 inline bool _E_m_p_t_y_S_e_t_<_T_A_>_:_:_c_o_n_t_a_i_n_s([[maybe_unused]] const _T_y_p_e& attribute) │ │ │ │ │ -118 { │ │ │ │ │ -119 return false; │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -_1_2_3 inline bool _A_l_l_S_e_t_<_T_A_>_:_:_c_o_n_t_a_i_n_s([[maybe_unused]] const _T_y_p_e& attribute) │ │ │ │ │ -124 { │ │ │ │ │ -125 return true; │ │ │ │ │ -126 } │ │ │ │ │ -127 │ │ │ │ │ -128 template │ │ │ │ │ -_1_2_9 inline bool _E_n_u_m_I_t_e_m_<_T_A_,_i_>_:_:_c_o_n_t_a_i_n_s(const _T_y_p_e& item) │ │ │ │ │ -130 { │ │ │ │ │ -131 return item==i; │ │ │ │ │ -132 } │ │ │ │ │ -133 │ │ │ │ │ -134 template │ │ │ │ │ -_1_3_5 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _E_n_u_m_I_t_e_m_<_T_A_,_i_>&) │ │ │ │ │ -136 { │ │ │ │ │ -137 return os< │ │ │ │ │ -_1_4_1 inline bool _E_n_u_m_R_a_n_g_e_<_T_A_,_f_r_o_m_,_t_o_>_:_:_c_o_n_t_a_i_n_s(const _T_y_p_e& item) │ │ │ │ │ -142 { │ │ │ │ │ -143 return from<=item && item<=to; │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -146 template │ │ │ │ │ -_1_4_7 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const │ │ │ │ │ -_E_n_u_m_R_a_n_g_e_<_T_A_,_f_r_o_m_,_t_o_>&) │ │ │ │ │ -148 { │ │ │ │ │ -149 return os<<"["< │ │ │ │ │ -_1_5_3 inline bool _C_o_m_b_i_n_e_<_T_I_1_,_T_I_2_,_T_A_>_:_:_c_o_n_t_a_i_n_s(const TA& item) │ │ │ │ │ -154 { │ │ │ │ │ -155 return TI1::contains(item) || │ │ │ │ │ -156 TI2::contains(item); │ │ │ │ │ -157 } │ │ │ │ │ -158 │ │ │ │ │ -159 template │ │ │ │ │ -_1_6_0 inline _C_o_m_b_i_n_e_<_T_I_1_,_T_I_2_,_t_y_p_e_n_a_m_e_ _T_I_1_:_:_T_y_p_e_> _c_o_m_b_i_n_e([[maybe_unused]] const │ │ │ │ │ -TI1& set1, │ │ │ │ │ -161 [[maybe_unused]] const TI2& set2) │ │ │ │ │ -162 { │ │ │ │ │ -163 return _C_o_m_b_i_n_e_<_T_I_1_,_T_I_2_,_t_y_p_e_n_a_m_e_ _T_I_1_:_:_T_y_p_e_>(); │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -166 template │ │ │ │ │ -_1_6_7 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const │ │ │ │ │ -_C_o_m_b_i_n_e_<_T_I_1_,_T_I_2_,_T_>&) │ │ │ │ │ -168 { │ │ │ │ │ -169 return os << TI1()<<" "< combine(const TI1 &set1, const TI2 │ │ │ │ │ -&set2) │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +_1_2 namespace Std │ │ │ │ │ +13 { │ │ │ │ │ +14 │ │ │ │ │ +17 using std::apply; │ │ │ │ │ +18 │ │ │ │ │ +19 } // namespace Std │ │ │ │ │ +20} // namespace Dune │ │ │ │ │ +21 │ │ │ │ │ +22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_E_m_p_t_y_S_e_t │ │ │ │ │ -An empty set. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_E_m_p_t_y_S_e_t_:_:_T_y_p_e │ │ │ │ │ -TA Type │ │ │ │ │ -The POD type the set holds. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_A_l_l_S_e_t │ │ │ │ │ -A set containing everything. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_l_l_S_e_t_:_:_T_y_p_e │ │ │ │ │ -TA Type │ │ │ │ │ -The POD type the set holds. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_E_n_u_m_I_t_e_m │ │ │ │ │ -A set consisting only of one item. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_E_n_u_m_I_t_e_m_:_:_T_y_p_e │ │ │ │ │ -TA Type │ │ │ │ │ -The type the set holds. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_E_n_u_m_R_a_n_g_e │ │ │ │ │ -A set representing a range including the borders. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_E_n_u_m_R_a_n_g_e_:_:_T_y_p_e │ │ │ │ │ -TA Type │ │ │ │ │ -The type the set holds. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_N_e_g_a_t_e_S_e_t │ │ │ │ │ -The negation of a set. An item is contained in the set if and only if it is not │ │ │ │ │ -contained in the nega... │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_N_e_g_a_t_e_S_e_t_:_:_T_y_p_e │ │ │ │ │ -S::Type Type │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_N_e_g_a_t_e_S_e_t_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ -static bool contains(const Type &item) │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_b_i_n_e │ │ │ │ │ -A set combining two other sets. │ │ │ │ │ -DDeeffiinniittiioonn enumset.hh:111 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: binaryfunctions.hh File Reference │ │ │ │ +dune-common: utility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,46 +65,36 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces
│ │ │ │ -
binaryfunctions.hh File Reference
│ │ │ │ +
utility.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ -
#include <algorithm>
│ │ │ │ +
#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::Min< Type >
 
struct  Dune::Max< Type >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ -

helper classes to provide unique types for standard functions

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,24 +1,20 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -binaryfunctions.hh File Reference │ │ │ │ │ -helper classes to provide unique types for standard functions _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +utility.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_M_i_n_<_ _T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_x_<_ _T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -helper classes to provide unique types for standard functions │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: binaryfunctions.hh Source File │ │ │ │ +dune-common: utility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,85 +70,49 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
binaryfunctions.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_BINARYFUNCTIONS_HH
│ │ │ │ -
6#define DUNE_BINARYFUNCTIONS_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
│ │ │ │ -
12#include <algorithm>
│ │ │ │ +
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
│ │ │ │ -
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;
│ │ │ │ +
14 namespace Std
│ │ │ │ +
15 {
│ │ │ │ +
16
│ │ │ │ +
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 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
23 } // namespace Std
│ │ │ │
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
│ │ │ │ +
25} // namespace Dune
│ │ │ │ +
26
│ │ │ │ +
27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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 {} │ │ │ │ │ @@ -1,93 +1,43 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -binaryfunctions.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +utility.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -3// SPDX-FileCopyrightInfo: Copyright (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_BINARYFUNCTIONS_HH │ │ │ │ │ -6#define DUNE_BINARYFUNCTIONS_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 │ │ │ │ │ -12#include │ │ │ │ │ +8#warning dune/common/std/utility.hh is deprecated and will be removed after │ │ │ │ │ +Dune 2.8.\ │ │ │ │ │ +9 Include instead │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e │ │ │ │ │ +12{ │ │ │ │ │ 13 │ │ │ │ │ -14namespace _D_u_n_e │ │ │ │ │ -15{ │ │ │ │ │ -16 template │ │ │ │ │ -_1_7 struct _M_i_n │ │ │ │ │ -18 { │ │ │ │ │ -_1_9 using _f_i_r_s_t___a_r_g_u_m_e_n_t___t_y_p_e [[deprecated("This type alias is deprecated │ │ │ │ │ -following similar deprecations in C++17")]] = Type; │ │ │ │ │ -20 │ │ │ │ │ -_2_1 using _s_e_c_o_n_d___a_r_g_u_m_e_n_t___t_y_p_e [[deprecated("This type alias is deprecated │ │ │ │ │ -following similar deprecations in C++17")]] = Type; │ │ │ │ │ +14 namespace Std │ │ │ │ │ +15 { │ │ │ │ │ +16 │ │ │ │ │ +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 │ │ │ │ │ -_2_3 using _r_e_s_u_l_t___t_y_p_e [[deprecated("This type alias is deprecated following │ │ │ │ │ -similar deprecations in C++17")]] = Type; │ │ │ │ │ +23 } // namespace Std │ │ │ │ │ 24 │ │ │ │ │ -_2_5 Type _o_p_e_r_a_t_o_r_(_)(const Type& t1, const Type& t2) const │ │ │ │ │ -26 { │ │ │ │ │ -27 using std::min; │ │ │ │ │ -28 return min(t1,t2); │ │ │ │ │ -29 } │ │ │ │ │ -30 }; │ │ │ │ │ -31 │ │ │ │ │ -32 template │ │ │ │ │ -_3_3 struct _M_a_x │ │ │ │ │ -34 { │ │ │ │ │ -_3_5 using _f_i_r_s_t___a_r_g_u_m_e_n_t___t_y_p_e [[deprecated("This type alias is deprecated │ │ │ │ │ -following similar deprecations in C++17")]] = Type; │ │ │ │ │ -36 │ │ │ │ │ -_3_7 using _s_e_c_o_n_d___a_r_g_u_m_e_n_t___t_y_p_e [[deprecated("This type alias is deprecated │ │ │ │ │ -following similar deprecations in C++17")]] = Type; │ │ │ │ │ -38 │ │ │ │ │ -_3_9 using _r_e_s_u_l_t___t_y_p_e [[deprecated("This type alias is deprecated following │ │ │ │ │ -similar deprecations in C++17")]] = Type; │ │ │ │ │ -40 │ │ │ │ │ -_4_1 Type _o_p_e_r_a_t_o_r_(_)(const Type& t1, const Type& t2) const │ │ │ │ │ -42 { │ │ │ │ │ -43 using std::max; │ │ │ │ │ -44 return max(t1,t2); │ │ │ │ │ -45 } │ │ │ │ │ -46 }; │ │ │ │ │ -47} │ │ │ │ │ -48 │ │ │ │ │ -49#endif │ │ │ │ │ +25} // namespace Dune │ │ │ │ │ +26 │ │ │ │ │ +27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_M_i_n │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_M_i_n_:_:_r_e_s_u_l_t___t_y_p_e │ │ │ │ │ -Type result_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_M_i_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Type operator()(const Type &t1, const Type &t2) const │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_M_i_n_:_:_f_i_r_s_t___a_r_g_u_m_e_n_t___t_y_p_e │ │ │ │ │ -Type first_argument_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_i_n_:_:_s_e_c_o_n_d___a_r_g_u_m_e_n_t___t_y_p_e │ │ │ │ │ -Type second_argument_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_M_a_x │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_M_a_x_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Type operator()(const Type &t1, const Type &t2) const │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_M_a_x_:_:_r_e_s_u_l_t___t_y_p_e │ │ │ │ │ -Type result_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_M_a_x_:_:_f_i_r_s_t___a_r_g_u_m_e_n_t___t_y_p_e │ │ │ │ │ -Type first_argument_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_M_a_x_:_:_s_e_c_o_n_d___a_r_g_u_m_e_n_t___t_y_p_e │ │ │ │ │ -Type second_argument_type │ │ │ │ │ -DDeeffiinniittiioonn binaryfunctions.hh:37 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hybridutilities.hh File Reference │ │ │ │ +dune-common: type_traits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,89 +65,101 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
hybridutilities.hh File Reference
│ │ │ │ +Typedefs | │ │ │ │ +Variables
│ │ │ │ +
type_traits.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>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +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::Hybrid
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ -Functions

template<class T >
constexpr auto Dune::Hybrid::size (const T &t)
 Size query.
 
template<class Container , class Index >
constexpr decltype(auto) Dune::Hybrid::elementAt (Container &&c, Index &&i)
 Get element at given position from container.
 
template<class Begin , class End >
constexpr auto Dune::Hybrid::integralRange (const Begin &begin, const End &end)
 Create an integral range.
 
template<class End >
constexpr auto Dune::Hybrid::integralRange (const End &end)
 Create an integral range starting from 0.
 
template<class Range , class F >
constexpr void Dune::Hybrid::forEach (Range &&range, F &&f)
 Range based for loop.
 
template<class Range , class T , class F >
constexpr T Dune::Hybrid::accumulate (Range &&range, T value, F &&f)
 Accumulate values.
 
template<class Condition , class IfFunc , class ElseFunc >
decltype(auto) Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
 A conditional expression.
 
template<class Condition , class IfFunc >
void Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc)
 A conditional expression.
 
template<class T1 , class T2 >
constexpr auto Dune::Hybrid::equals (T1 &&t1, T2 &&t2)
 Equality comparison.
 
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.
 
template<class Cases , class Value , class Branches >
constexpr void Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches)
 Switch statement.
 

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

│ │ │ │ +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.
 
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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,77 +1,97 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -hybridutilities.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ +type_traits.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_a_s_s_e_r_t_a_n_d_r_e_t_u_r_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_d_:_:_n_o_n_e_s_u_c_h │ │ │ │ │ +  Type representing a lookup failure by std::detected_or and friends. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_d_:_:_c_o_n_j_u_n_c_t_i_o_n_<_ _B_ _> │ │ │ │ │ +  forms the logical conjunction of the type traits B... _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_d_:_:_d_i_s_j_u_n_c_t_i_o_n_<_ _B_ _> │ │ │ │ │ +  forms the logical disjunction of the type traits B... _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_d_:_:_n_e_g_a_t_i_o_n_<_ _B_ _> │ │ │ │ │ +  forms the logical negation of the type traits B... _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_H_y_b_r_i_d │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_s_i_z_e (const T &t) │ │ │ │ │ -  Size query. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto)  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_e_l_e_m_e_n_t_A_t (Container &&c, Index &&i) │ │ │ │ │ -  Get element at given position from container. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_n_t_e_g_r_a_l_R_a_n_g_e (const Begin &begin, │ │ │ │ │ - const End &end) │ │ │ │ │ -  Create an integral range. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_n_t_e_g_r_a_l_R_a_n_g_e (const End &end) │ │ │ │ │ -  Create an integral range starting from 0. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr void  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_f_o_r_E_a_c_h (Range &&_r_a_n_g_e, F &&f) │ │ │ │ │ -  Range based for loop. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr T  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_a_c_c_u_m_u_l_a_t_e (Range &&_r_a_n_g_e, T value, F │ │ │ │ │ - &&f) │ │ │ │ │ -  Accumulate values. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - decltype(auto)  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_f_E_l_s_e (const Condition &condition, │ │ │ │ │ - IfFunc &&ifFunc, ElseFunc &&elseFunc) │ │ │ │ │ -  A conditional expression. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_f_E_l_s_e (const Condition &condition, │ │ │ │ │ - IfFunc &&ifFunc) │ │ │ │ │ -  A conditional expression. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_e_q_u_a_l_s (T1 &&t1, T2 &&t2) │ │ │ │ │ -  Equality comparison. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto)  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_s_w_i_t_c_h_C_a_s_e_s (const Cases &cases, const │ │ │ │ │ - Value &value, Branches &&branches, ElseBranch │ │ │ │ │ - &&elseBranch) │ │ │ │ │ -  Switch statement. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr void  _D_u_n_e_:_:_H_y_b_r_i_d_:_:_s_w_i_t_c_h_C_a_s_e_s (const Cases &cases, const │ │ │ │ │ - Value &value, Branches &&branches) │ │ │ │ │ -  Switch statement. │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r = Impl::detector< Default, void, Op, Args... > │ │ │ │ │ +  Detects whether Op is valid and makes the result available. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d = typename _d_e_t_e_c_t_e_d___o_r< _n_o_n_e_s_u_c_h, Op, Args... >:: │ │ │ │ │ + value_t │ │ │ │ │ +  Detects whether Op is valid. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___t = typename _d_e_t_e_c_t_e_d___o_r< _n_o_n_e_s_u_c_h, Op, Args... >:: │ │ │ │ │ + type │ │ │ │ │ +  Returns Op if that is valid; otherwise returns nonesuch. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t = typename _d_e_t_e_c_t_e_d___o_r< Default, Op, Args... │ │ │ │ │ + >::type │ │ │ │ │ +  Returns Op if that is valid; otherwise returns the fallback │ │ │ │ │ + type Default. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t = std::is_same< Expected, _d_e_t_e_c_t_e_d___t< Op, │ │ │ │ │ + Args... > > │ │ │ │ │ +  Checks whether Op is Expected without causing an error if │ │ │ │ │ + Op is invalid. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e = std::is_convertible< Target, │ │ │ │ │ + _d_e_t_e_c_t_e_d___t< Op, Args... > > │ │ │ │ │ +  Checks whether Op is convertible to Target without causing an │ │ │ │ │ + error if Op is invalid. │ │ │ │ │ +  │ │ │ │ │ +template class Fallback, template< typename... > class │ │ │ │ │ +TargetType, typename... Args> │ │ │ │ │ +using  _D_u_n_e_:_:_d_e_t_e_c_t_e_d___o_r___f_a_l_l_b_a_c_k___t = _S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t< decltype(detail:: │ │ │ │ │ + warningIfNotDefined< _S_t_d_:_:_d_e_t_e_c_t_e_d___t< Fallback, Args... > >(std:: │ │ │ │ │ + declval< const _S_t_d_:_:_d_e_t_e_c_t_e_d___t< TargetType, Args... > * >())), │ │ │ │ │ + TargetType, Args... > │ │ │ │ │ +  This type will be either TargetType if it exists, or the │ │ │ │ │ + Fallback type. │ │ │ │ │ +  │ │ │ │ │ +VVaarriiaabblleess │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___v = _i_s___d_e_t_e_c_t_e_d::value │ │ │ │ │ +  Detects whether Op is valid and makes the result │ │ │ │ │ + available as a value. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t___v = │ │ │ │ │ + _i_s___d_e_t_e_c_t_e_d___e_x_a_c_t::value │ │ │ │ │ +  Convenient access to the result value of is_detected_exact. │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +constexpr bool  _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e___v = │ │ │ │ │ + _i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e::value │ │ │ │ │ +  Convenient access to the result value of │ │ │ │ │ + is_detected_convertible. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hybridutilities.hh Source File │ │ │ │ +dune-common: type_traits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,379 +70,223 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hybridutilities.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_HYBRIDUTILITIES_HH
│ │ │ │ -
6#define DUNE_COMMON_HYBRIDUTILITIES_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_TYPE_TRAITS_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ +
8#include <type_traits>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
12#if __has_include(<experimental/type_traits>)
│ │ │ │ +
13#include <experimental/type_traits>
│ │ │ │ +
14#endif
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
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 }
│ │ │ │ -
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 }
│ │ │ │ +
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 // 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 }
│ │ │ │ +
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
│ │ │ │ +
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}
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
202template<class End>
│ │ │ │ -
│ │ │ │ -
203constexpr auto integralRange(const End& end)
│ │ │ │ -
204{
│ │ │ │ -
205 return Impl::integralRange(Dune::Indices::_0, end, PriorityTag<42>());
│ │ │ │ -
206}
│ │ │ │ -
│ │ │ │ -
207
│ │ │ │ +
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
│ │ │ │ -
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 }
│ │ │ │ +
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
│ │ │ │ -
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 }
│ │ │ │ +
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
│ │ │ │ -
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 {
│ │ │ │ +
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 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
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ -
Utilities for type computations, constraining overloads, ...
│ │ │ │ -
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
│ │ │ │ -
constexpr auto size(const T &t)
Size query.
Definition hybridutilities.hh:82
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,433 +1,279 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -hybridutilities.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +type_traits.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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 │ │ │ │ │ +5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH │ │ │ │ │ +6#define DUNE_COMMON_STD_TYPE_TRAITS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_c_o_m_m_o_n_/_a_s_s_e_r_t_a_n_d_r_e_t_u_r_n_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_c_o_m_m_o_n_/_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -17 │ │ │ │ │ +8#include │ │ │ │ │ +9#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +11 │ │ │ │ │ +12#if __has_include() │ │ │ │ │ +13#include │ │ │ │ │ +14#endif │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ 18 │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ -_2_1namespace Hybrid { │ │ │ │ │ -22 │ │ │ │ │ -23namespace Impl { │ │ │ │ │ -24 │ │ │ │ │ -25 // Try if tuple_size is implemented for class │ │ │ │ │ -26 template │ │ │ │ │ -27 constexpr auto size(const _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _i_>&, const _P_r_i_o_r_i_t_y_T_a_g_<_5_>&) │ │ │ │ │ -28 -> decltype(std::integral_constant()) │ │ │ │ │ -29 { │ │ │ │ │ -30 return {}; │ │ │ │ │ -31 } │ │ │ │ │ -32 │ │ │ │ │ -33 // Try if tuple_size is implemented for class │ │ │ │ │ -34 template │ │ │ │ │ -35 constexpr auto size(const T&, const _P_r_i_o_r_i_t_y_T_a_g_<_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 _P_r_i_o_r_i_t_y_T_a_g_<_1_>&) │ │ │ │ │ -44 -> decltype(std::integral_constant()) │ │ │ │ │ -45 { │ │ │ │ │ -46 return {}; │ │ │ │ │ -47 } │ │ │ │ │ +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 // As a last resort try if there's a static constexpr size() │ │ │ │ │ -50 template │ │ │ │ │ -51 constexpr auto size(const T& t, const _P_r_i_o_r_i_t_y_T_a_g_<_0_>&) │ │ │ │ │ -52 { │ │ │ │ │ -53 return t.size(); │ │ │ │ │ -54 } │ │ │ │ │ +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 │ │ │ │ │ +56 namespace Impl { │ │ │ │ │ 57 │ │ │ │ │ -58 │ │ │ │ │ -59 │ │ │ │ │ -81template │ │ │ │ │ -_8_2constexpr auto _s_i_z_e(const T& t) │ │ │ │ │ -83{ │ │ │ │ │ -84 return Impl::size(t, _P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()); │ │ │ │ │ -85} │ │ │ │ │ -86 │ │ │ │ │ -87 │ │ │ │ │ -88 │ │ │ │ │ -89namespace Impl { │ │ │ │ │ -90 │ │ │ │ │ -91 template>::value, int> = 0> │ │ │ │ │ -93 constexpr decltype(auto) elementAt(Container&& c, Index&&, _P_r_i_o_r_i_t_y_T_a_g_<_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 _D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y(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 │ │ │ │ │ -_1_3_5constexpr decltype(auto) _e_l_e_m_e_n_t_A_t(Container&& c, Index&& i) │ │ │ │ │ -136{ │ │ │ │ │ -137 return Impl::elementAt(std::forward(c), std::forward(i), │ │ │ │ │ -_P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()); │ │ │ │ │ -138} │ │ │ │ │ -139 │ │ │ │ │ -140 │ │ │ │ │ -141 │ │ │ │ │ -142namespace Impl { │ │ │ │ │ -143 │ │ │ │ │ -144 template::value and │ │ │ │ │ -_I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t_<_E_n_d_>_:_:_v_a_l_u_e, int> = 0> │ │ │ │ │ -146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/, │ │ │ │ │ -const _P_r_i_o_r_i_t_y_T_a_g_<_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 _D_U_N_E___A_S_S_E_R_T___A_N_D___R_E_T_U_R_N(begin<=end, _D_u_n_e_:_:_I_n_t_e_g_r_a_l_R_a_n_g_e_<_E_n_d_>(begin, │ │ │ │ │ -end)); │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -162} // namespace Impl │ │ │ │ │ -163 │ │ │ │ │ -164 │ │ │ │ │ -165 │ │ │ │ │ -183template │ │ │ │ │ -_1_8_4constexpr auto _i_n_t_e_g_r_a_l_R_a_n_g_e(const Begin& begin, const End& end) │ │ │ │ │ -185{ │ │ │ │ │ -186 return Impl::integralRange(begin, end, _P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()); │ │ │ │ │ -187} │ │ │ │ │ +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 │ │ │ │ │ +_8_7 struct _n_o_n_e_s_u_c_h │ │ │ │ │ +88 { │ │ │ │ │ +_8_9 _n_o_n_e_s_u_c_h() = delete; │ │ │ │ │ +_9_0 _~_n_o_n_e_s_u_c_h() = delete; │ │ │ │ │ +_9_1 _n_o_n_e_s_u_c_h(const _n_o_n_e_s_u_c_h&) = delete; │ │ │ │ │ +_9_2 void _o_p_e_r_a_t_o_r_=(const _n_o_n_e_s_u_c_h&) = delete; │ │ │ │ │ +93 }; │ │ │ │ │ +94 │ │ │ │ │ +96 │ │ │ │ │ +127 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +_1_2_8 using _d_e_t_e_c_t_e_d___o_r = Impl::detector; │ │ │ │ │ +129 │ │ │ │ │ +131 │ │ │ │ │ +140 template class Op, typename... Args> │ │ │ │ │ +_1_4_1 using _i_s___d_e_t_e_c_t_e_d = typename _d_e_t_e_c_t_e_d___o_r<_n_o_n_e_s_u_c_h,Op,Args...>::value_t; │ │ │ │ │ +142 │ │ │ │ │ +143#ifdef __cpp_variable_templates │ │ │ │ │ +145 │ │ │ │ │ +154 template class Op, typename... Args> │ │ │ │ │ +_1_5_5 constexpr bool _i_s___d_e_t_e_c_t_e_d___v = _i_s___d_e_t_e_c_t_e_d::value; │ │ │ │ │ +156#endif // __cpp_variable_templates │ │ │ │ │ +157 │ │ │ │ │ +159 │ │ │ │ │ +169 template class Op, typename... Args> │ │ │ │ │ +_1_7_0 using _d_e_t_e_c_t_e_d___t = typename _d_e_t_e_c_t_e_d___o_r<_n_o_n_e_s_u_c_h,Op,Args...>::type; │ │ │ │ │ +171 │ │ │ │ │ +172 │ │ │ │ │ +174 │ │ │ │ │ +184 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +_1_8_5 using _d_e_t_e_c_t_e_d___o_r___t = typename _d_e_t_e_c_t_e_d___o_r::type; │ │ │ │ │ +186 │ │ │ │ │ 188 │ │ │ │ │ -202template │ │ │ │ │ -_2_0_3constexpr auto _i_n_t_e_g_r_a_l_R_a_n_g_e(const End& end) │ │ │ │ │ -204{ │ │ │ │ │ -205 return Impl::integralRange(_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___0, end, _P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()); │ │ │ │ │ -206} │ │ │ │ │ -207 │ │ │ │ │ +194 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +_1_9_5 using _i_s___d_e_t_e_c_t_e_d___e_x_a_c_t = std::is_same>; │ │ │ │ │ +196 │ │ │ │ │ +197#ifdef __cpp_variable_templates │ │ │ │ │ +199 │ │ │ │ │ +205 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +_2_0_6 constexpr bool _i_s___d_e_t_e_c_t_e_d___e_x_a_c_t___v = │ │ │ │ │ +_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t::value; │ │ │ │ │ +207#endif // __cpp_variable_templates │ │ │ │ │ 208 │ │ │ │ │ -209 │ │ │ │ │ -210namespace Impl { │ │ │ │ │ -211 │ │ │ │ │ -212 template │ │ │ │ │ -213 constexpr void evaluateFoldExpression(std::initializer_list&&) │ │ │ │ │ -214 {} │ │ │ │ │ -215 │ │ │ │ │ -216 template │ │ │ │ │ -217 constexpr void forEachIndex(Range&& _r_a_n_g_e, F&& f, std:: │ │ │ │ │ -integer_sequence) │ │ │ │ │ -218 { │ │ │ │ │ -219 evaluateFoldExpression({(f(_H_y_b_r_i_d_:_:_e_l_e_m_e_n_t_A_t(_r_a_n_g_e, std:: │ │ │ │ │ -integral_constant())), 0)...}); │ │ │ │ │ -220 } │ │ │ │ │ +210 │ │ │ │ │ +216 template class Op, typename... Args> │ │ │ │ │ +_2_1_7 using _i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e = std:: │ │ │ │ │ +is_convertible>; │ │ │ │ │ +218 │ │ │ │ │ +219#ifdef __cpp_variable_templates │ │ │ │ │ 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&& _r_a_n_g_e, F&& f, PriorityTag<1>) │ │ │ │ │ -232 { │ │ │ │ │ -233 auto size = _H_y_b_r_i_d_:_:_s_i_z_e(_r_a_n_g_e); │ │ │ │ │ -234 auto indices = std::make_index_sequence(); │ │ │ │ │ -235 (forEachIndex)(std::forward(_r_a_n_g_e), std::forward(f), indices); │ │ │ │ │ -236 } │ │ │ │ │ +227 template class Op, typename... Args> │ │ │ │ │ +_2_2_8 constexpr bool _i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e___v = │ │ │ │ │ +_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e::value; │ │ │ │ │ +229#endif // __cpp_variable_templates │ │ │ │ │ +230 │ │ │ │ │ +231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED │ │ │ │ │ +232 │ │ │ │ │ +233 │ │ │ │ │ +234 │ │ │ │ │ +235 // conjunction │ │ │ │ │ +236 // ----------- │ │ │ │ │ 237 │ │ │ │ │ -238 template │ │ │ │ │ -239 constexpr void forEach(Range&& _r_a_n_g_e, F&& f, PriorityTag<0>) │ │ │ │ │ -240 { │ │ │ │ │ -241 for(auto&& e : _r_a_n_g_e) │ │ │ │ │ -242 f(e); │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -245} // namespace Impl │ │ │ │ │ -246 │ │ │ │ │ -247 │ │ │ │ │ -248 │ │ │ │ │ -267template │ │ │ │ │ -_2_6_8constexpr void _f_o_r_E_a_c_h(Range&& _r_a_n_g_e, F&& f) │ │ │ │ │ -269{ │ │ │ │ │ -270 Impl::forEach(std::forward(_r_a_n_g_e), std::forward(f), │ │ │ │ │ -_P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()); │ │ │ │ │ -271} │ │ │ │ │ -272 │ │ │ │ │ -273 │ │ │ │ │ -274 │ │ │ │ │ -290template │ │ │ │ │ -_2_9_1constexpr T _a_c_c_u_m_u_l_a_t_e(Range&& _r_a_n_g_e, T value, F&& f) │ │ │ │ │ -292{ │ │ │ │ │ -293 _f_o_r_E_a_c_h(std::forward(_r_a_n_g_e), [&](auto&& entry) { │ │ │ │ │ -294 value = f(value, entry); │ │ │ │ │ -295 }); │ │ │ │ │ -296 return value; │ │ │ │ │ -297} │ │ │ │ │ -298 │ │ │ │ │ -299 │ │ │ │ │ -300 │ │ │ │ │ -301namespace Impl { │ │ │ │ │ +245 template< class... B > │ │ │ │ │ +_2_4_6 struct [[deprecated("Will be removed after release 2.8. Use std:: │ │ │ │ │ +conjunction instead.")]] _c_o_n_j_u_n_c_t_i_o_n │ │ │ │ │ +247 : std::conjunction │ │ │ │ │ +248 {}; │ │ │ │ │ +249 │ │ │ │ │ +250 │ │ │ │ │ +251 // disjunction │ │ │ │ │ +252 // ----------- │ │ │ │ │ +253 │ │ │ │ │ +261 template< class... B > │ │ │ │ │ +_2_6_2 struct [[deprecated("Will be removed after release 2.8. Use std:: │ │ │ │ │ +disjunction instead.")]] _d_i_s_j_u_n_c_t_i_o_n │ │ │ │ │ +263 : std::disjunction │ │ │ │ │ +264 {}; │ │ │ │ │ +265 │ │ │ │ │ +266 │ │ │ │ │ +267 // negation │ │ │ │ │ +268 // -------- │ │ │ │ │ +269 │ │ │ │ │ +277 template │ │ │ │ │ +_2_7_8 struct [[deprecated("Will be removed after release 2.8. Use std::negation │ │ │ │ │ +instead.")]] _n_e_g_a_t_i_o_n │ │ │ │ │ +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 _S_t_d_:_:_n_o_n_e_s_u_c_h*); │ │ │ │ │ +290 │ │ │ │ │ +291 template │ │ │ │ │ +292 Type warningIfNotDefined(const T*); │ │ │ │ │ +293} │ │ │ │ │ +294 │ │ │ │ │ +296template class Fallback, │ │ │ │ │ +297 template class TargetType, typename... Args> │ │ │ │ │ +_2_9_8using _d_e_t_e_c_t_e_d___o_r___f_a_l_l_b_a_c_k___t = _S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t >(std:: │ │ │ │ │ +declval*>())), │ │ │ │ │ +300 TargetType, Args...>; │ │ │ │ │ +301 │ │ │ │ │ 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 │ │ │ │ │ -_3_5_6decltype(auto) _i_f_E_l_s_e(const Condition& condition, IfFunc&& ifFunc, │ │ │ │ │ -ElseFunc&& elseFunc) │ │ │ │ │ -357{ │ │ │ │ │ -358 return Impl::ifElse(condition, std::forward(ifFunc), std:: │ │ │ │ │ -forward(elseFunc)); │ │ │ │ │ -359} │ │ │ │ │ -360 │ │ │ │ │ -368template │ │ │ │ │ -_3_6_9void _i_f_E_l_s_e(const Condition& condition, IfFunc&& ifFunc) │ │ │ │ │ -370{ │ │ │ │ │ -371 _i_f_E_l_s_e(condition, std::forward(ifFunc), [](auto&&) {}); │ │ │ │ │ -372} │ │ │ │ │ -373 │ │ │ │ │ -374 │ │ │ │ │ -375 │ │ │ │ │ -376namespace Impl { │ │ │ │ │ -377 │ │ │ │ │ -378 template │ │ │ │ │ -379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, _P_r_i_o_r_i_t_y_T_a_g_<_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 │ │ │ │ │ -_4_0_2constexpr auto _e_q_u_a_l_s(T1&& t1, T2&& t2) │ │ │ │ │ -403{ │ │ │ │ │ -404 return Impl::equals(std::forward(t1), std::forward(t2), │ │ │ │ │ -_P_r_i_o_r_i_t_y_T_a_g_<_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 _H_y_b_r_i_d_:_:_e_q_u_a_l_s(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 │ │ │ │ │ -_4_6_1constexpr decltype(auto) _s_w_i_t_c_h_C_a_s_e_s(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 │ │ │ │ │ -_4_8_7constexpr void _s_w_i_t_c_h_C_a_s_e_s(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 │ │ │ │ │ -_i_n_d_i_c_e_s_._h_h │ │ │ │ │ -_a_s_s_e_r_t_a_n_d_r_e_t_u_r_n_._h_h │ │ │ │ │ +303} // namespace Dune │ │ │ │ │ +304 │ │ │ │ │ +305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH │ │ │ │ │ _t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ Traits for type conversions and type information. │ │ │ │ │ -_f_v_e_c_t_o_r_._h_h │ │ │ │ │ -Implements a vector constructed from a given type representing a field and a │ │ │ │ │ -compile-time given size. │ │ │ │ │ _t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ Utilities for type computations, constraining overloads, ... │ │ │ │ │ -_r_a_n_g_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ -Utilities for reduction like operations on ranges. │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___0 │ │ │ │ │ -constexpr index_constant< 0 > _0 │ │ │ │ │ -Compile time index with value 0. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_r_a_n_g_e │ │ │ │ │ -static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ ->, std::integral_constant< T, to >) noexcept │ │ │ │ │ -DDeeffiinniittiioonn rangeutilities.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_s_i_z_e │ │ │ │ │ -constexpr auto size(const T &t) │ │ │ │ │ -Size query. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_e_q_u_a_l_s │ │ │ │ │ -constexpr auto equals(T1 &&t1, T2 &&t2) │ │ │ │ │ -Equality comparison. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:402 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_f_o_r_E_a_c_h │ │ │ │ │ -constexpr void forEach(Range &&range, F &&f) │ │ │ │ │ -Range based for loop. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_s_w_i_t_c_h_C_a_s_e_s │ │ │ │ │ -constexpr decltype(auto) switchCases(const Cases &cases, const Value &value, │ │ │ │ │ -Branches &&branches, ElseBranch &&elseBranch) │ │ │ │ │ -Switch statement. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_f_E_l_s_e │ │ │ │ │ -decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc │ │ │ │ │ -&&elseFunc) │ │ │ │ │ -A conditional expression. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:356 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_i_n_t_e_g_r_a_l_R_a_n_g_e │ │ │ │ │ -constexpr auto integralRange(const Begin &begin, const End &end) │ │ │ │ │ -Create an integral range. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -constexpr decltype(auto) elementAt(Container &&c, Index &&i) │ │ │ │ │ -Get element at given position from container. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_a_c_c_u_m_u_l_a_t_e │ │ │ │ │ -constexpr T accumulate(Range &&range, T value, F &&f) │ │ │ │ │ -Accumulate values. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:291 │ │ │ │ │ -_D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y │ │ │ │ │ -constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std:: │ │ │ │ │ -integral_constant< std::size_t, index > i) │ │ │ │ │ -Get entry of std::integer_sequence. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:462 │ │ │ │ │ -_D_U_N_E___A_S_S_E_R_T___A_N_D___R_E_T_U_R_N │ │ │ │ │ -#define DUNE_ASSERT_AND_RETURN(C, X) │ │ │ │ │ -Asserts a condition and return on success in constexpr context. │ │ │ │ │ -DDeeffiinniittiioonn assertandreturn.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t___v │ │ │ │ │ +constexpr bool is_detected_exact_v │ │ │ │ │ +Convenient access to the result value of is_detected_exact. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e___v │ │ │ │ │ +constexpr bool is_detected_convertible_v │ │ │ │ │ +Convenient access to the result value of is_detected_convertible. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r___t │ │ │ │ │ +typename detected_or< Default, Op, Args... >::type detected_or_t │ │ │ │ │ +Returns Op if that is valid; otherwise returns the fallback type │ │ │ │ │ +Default. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___e_x_a_c_t │ │ │ │ │ +std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact │ │ │ │ │ +Checks whether Op is Expected without causing an error if Op │ │ │ │ │ +is invalid. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___t │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::type detected_t │ │ │ │ │ +Returns Op if that is valid; otherwise returns nonesuch. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_v_o_i_d___t │ │ │ │ │ +typename Impl::voider< Types... >::type void_t │ │ │ │ │ +Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. │ │ │ │ │ +DDeeffiinniittiioonn typetraits.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___v │ │ │ │ │ +constexpr bool is_detected_v │ │ │ │ │ +Detects whether Op is valid and makes the result available as a value. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ +Detects whether Op is valid. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_t_e_c_t_e_d___o_r │ │ │ │ │ +Impl::detector< Default, void, Op, Args... > detected_or │ │ │ │ │ +Detects whether Op is valid and makes the result available. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d___c_o_n_v_e_r_t_i_b_l_e │ │ │ │ │ +std::is_convertible< Target, detected_t< Op, Args... > > │ │ │ │ │ +is_detected_convertible │ │ │ │ │ +Checks whether Op is convertible to Target without causing an error if │ │ │ │ │ +Op │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_d_e_t_e_c_t_e_d___o_r___f_a_l_l_b_a_c_k___t │ │ │ │ │ +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 if it exists, or the │ │ │ │ │ +Fallback │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorfacades.hh File Reference │ │ │ │ +dune-common: functional.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,106 +65,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
iteratorfacades.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
functional.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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

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

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ForwardIteratorFacade< T, V, R, D >
 Base class for stl conformant forward iterators. More...
 
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::Std::identity
 A function object type whose operator() returns its argument unchanged. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ 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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ -

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.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,145 +1,25 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -iteratorfacades.hh File Reference │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_t_y_p_e_t_r_a_i_t_s_._h_h" │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +functional.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_ _T_,_ _V_,_ _R_,_ _D_ _> │ │ │ │ │ -  Base class for stl conformant forward iterators. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_ _T_,_ _V_,_ _R_,_ _D_ _> │ │ │ │ │ -  Facade class for stl conformant bidirectional iterators. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_ _T_,_ _V_,_ _R_,_ _D_ _> │ │ │ │ │ -  Base class for stl conformant forward iterators. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y │ │ │ │ │ +  A function object type whose operator() returns its argument │ │ │ │ │ + unchanged. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const │ │ │ │ │ - type  _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, D > │ │ │ │ │ - &lhs, const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, │ │ │ │ │ - V2, R2, D > &rhs) │ │ │ │ │ -  Checks for equality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const │ │ │ │ │ - type  _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, D > │ │ │ │ │ - &lhs, const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, │ │ │ │ │ - V2, R2, D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if< std::is_convertible< _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const │ │ │ │ │ - T2, T1 >::value, bool >::type  _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, │ │ │ │ │ - R1, D > &lhs, const │ │ │ │ │ - _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, │ │ │ │ │ - R2, D > &rhs) │ │ │ │ │ -  Checks for equality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if< std::is_convertible< _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const │ │ │ │ │ -T1, T2 >::value &&!std::is_convertible< _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, │ │ │ │ │ - T2, T1 >::value, bool >::type  R1, D > &lhs, const │ │ │ │ │ - _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, │ │ │ │ │ - R2, D > &rhs) │ │ │ │ │ -  Checks for equality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const │ │ │ │ │ - type  _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, │ │ │ │ │ - R1, D > &lhs, const │ │ │ │ │ - _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, │ │ │ │ │ - R2, D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Checks for equality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Comparison operator. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Comparison operator. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_> (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Comparison operator. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, bool >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Comparison operator. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - _E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e< T1, T2, D >:: _D_u_n_e_:_:_o_p_e_r_a_t_o_r_- (const │ │ │ │ │ - type  _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T1, V1, R1, │ │ │ │ │ - D > &lhs, const │ │ │ │ │ - _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, V2, R2, │ │ │ │ │ - D > &rhs) │ │ │ │ │ -  Calculates the difference between two │ │ │ │ │ - pointers. │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -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. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorfacades.hh Source File │ │ │ │ +dune-common: functional.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,511 +70,54 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
iteratorfacades.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_ITERATORFACADES_HH
│ │ │ │ -
6#define DUNE_ITERATORFACADES_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │
7
│ │ │ │ -
8#include <iterator>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ -
10
│ │ │ │ -
11#include "typetraits.hh"
│ │ │ │ +
8#include <functional>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │
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
│ │ │ │ +
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
│ │ │ │ -
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
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,614 +1,49 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -iteratorfacades.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +functional.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +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_ITERATORFACADES_HH │ │ │ │ │ -6#define DUNE_ITERATORFACADES_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ +6#define DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include "_t_y_p_e_t_r_a_i_t_s_._h_h" │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e │ │ │ │ │ +11{ │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e │ │ │ │ │ -14{ │ │ │ │ │ -139 template │ │ │ │ │ -_1_4_0 class _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -141 { │ │ │ │ │ -142 │ │ │ │ │ -143 public: │ │ │ │ │ -144 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_1_4_5 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::forward_iterator_tag; │ │ │ │ │ -_1_4_6 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_1_4_7 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_1_4_8 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_1_4_9 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -150 │ │ │ │ │ -_1_7_5 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -176 │ │ │ │ │ -_1_8_0 typedef V _V_a_l_u_e; │ │ │ │ │ -181 │ │ │ │ │ -_1_8_5 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -186 │ │ │ │ │ -_1_9_0 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -191 │ │ │ │ │ -_1_9_5 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -196 │ │ │ │ │ -_1_9_8 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ -199 { │ │ │ │ │ -200 return static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ -201 } │ │ │ │ │ -202 │ │ │ │ │ -_2_0_3 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -204 { │ │ │ │ │ -205 return &(static_cast(this)->dereference()); │ │ │ │ │ -206 } │ │ │ │ │ -207 │ │ │ │ │ -_2_0_9 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -210 { │ │ │ │ │ -211 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -212 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -_2_1_6 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -217 { │ │ │ │ │ -218 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -219 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -220 return tmp; │ │ │ │ │ -221 } │ │ │ │ │ -222 }; │ │ │ │ │ -223 │ │ │ │ │ -234 template │ │ │ │ │ -236 inline typename EnableIfInterOperable::type │ │ │ │ │ -_2_3_7 _o_p_e_r_a_t_o_r_=_=(const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -238 const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_2_5_9 _o_p_e_r_a_t_o_r_!_=(const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -260 const _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_2_7_3 class _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -274 { │ │ │ │ │ -275 │ │ │ │ │ -276 public: │ │ │ │ │ -277 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_2_7_8 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::bidirectional_iterator_tag; │ │ │ │ │ -_2_7_9 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_2_8_0 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_2_8_1 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_2_8_2 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -283 │ │ │ │ │ -_3_0_9 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -310 │ │ │ │ │ -_3_1_4 typedef V _V_a_l_u_e; │ │ │ │ │ -315 │ │ │ │ │ -_3_1_9 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -320 │ │ │ │ │ -_3_2_4 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -325 │ │ │ │ │ -_3_2_9 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -330 │ │ │ │ │ -_3_3_2 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ -333 { │ │ │ │ │ -334 return static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ -335 } │ │ │ │ │ -336 │ │ │ │ │ -_3_3_7 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -338 { │ │ │ │ │ -339 return &(static_cast(this)->dereference()); │ │ │ │ │ -340 } │ │ │ │ │ -341 │ │ │ │ │ -_3_4_3 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -344 { │ │ │ │ │ -345 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -346 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -347 } │ │ │ │ │ -348 │ │ │ │ │ -_3_5_0 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -351 { │ │ │ │ │ -352 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -353 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -354 return tmp; │ │ │ │ │ -355 } │ │ │ │ │ -356 │ │ │ │ │ -357 │ │ │ │ │ -_3_5_9 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -360 { │ │ │ │ │ -361 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->decrement(); │ │ │ │ │ -362 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -363 } │ │ │ │ │ -364 │ │ │ │ │ -_3_6_6 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_-_-(int) │ │ │ │ │ -367 { │ │ │ │ │ -368 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -369 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ -370 return tmp; │ │ │ │ │ -371 } │ │ │ │ │ -372 }; │ │ │ │ │ -373 │ │ │ │ │ -381 template │ │ │ │ │ -383 inline typename std::enable_if::value,bool>:: │ │ │ │ │ -type │ │ │ │ │ -_3_8_4 _o_p_e_r_a_t_o_r_=_=(const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -385 const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_4_0_3 _o_p_e_r_a_t_o_r_=_=(const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -404 const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& rhs) │ │ │ │ │ -405 { │ │ │ │ │ -406 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -407 } │ │ │ │ │ -408 │ │ │ │ │ -419 template │ │ │ │ │ -421 inline typename EnableIfInterOperable::type │ │ │ │ │ -_4_2_2 _o_p_e_r_a_t_o_r_!_=(const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -423 const _B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& rhs) │ │ │ │ │ -424 { │ │ │ │ │ -425 return !(lhs == rhs); │ │ │ │ │ -426 } │ │ │ │ │ -427 │ │ │ │ │ -432 template │ │ │ │ │ -_4_3_3 class _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -434 { │ │ │ │ │ -435 │ │ │ │ │ -436 public: │ │ │ │ │ -437 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_4_3_8 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::random_access_iterator_tag; │ │ │ │ │ -_4_3_9 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_4_4_0 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_4_4_1 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_4_4_2 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -443 │ │ │ │ │ -_4_7_7 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -478 │ │ │ │ │ -_4_8_2 typedef V _V_a_l_u_e; │ │ │ │ │ -483 │ │ │ │ │ -_4_8_7 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -488 │ │ │ │ │ -_4_9_2 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -493 │ │ │ │ │ -_4_9_7 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -498 │ │ │ │ │ -_5_0_0 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ -501 { │ │ │ │ │ -502 return static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ -503 } │ │ │ │ │ -504 │ │ │ │ │ -_5_0_5 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -506 { │ │ │ │ │ -507 return &(static_cast(this)->dereference()); │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -_5_1_5 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](_D_i_f_f_e_r_e_n_c_e_T_y_p_e n) const │ │ │ │ │ -516 { │ │ │ │ │ -517 return static_cast(this)->elementAt(n); │ │ │ │ │ -518 } │ │ │ │ │ -519 │ │ │ │ │ -_5_2_1 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -522 { │ │ │ │ │ -523 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -524 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -525 } │ │ │ │ │ -526 │ │ │ │ │ -_5_2_8 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -529 { │ │ │ │ │ -530 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -531 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -532 return tmp; │ │ │ │ │ -533 } │ │ │ │ │ -534 │ │ │ │ │ -_5_3_5 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_=(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n) │ │ │ │ │ -536 { │ │ │ │ │ -537 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->advance(n); │ │ │ │ │ -538 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -539 } │ │ │ │ │ -540 │ │ │ │ │ -_5_4_1 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n) const │ │ │ │ │ -542 { │ │ │ │ │ -543 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -544 tmp.advance(n); │ │ │ │ │ -545 return tmp; │ │ │ │ │ -546 } │ │ │ │ │ -547 │ │ │ │ │ -548 │ │ │ │ │ -_5_5_0 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -551 { │ │ │ │ │ -552 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->decrement(); │ │ │ │ │ -553 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -554 } │ │ │ │ │ -555 │ │ │ │ │ -_5_5_7 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_-_-(int) │ │ │ │ │ -558 { │ │ │ │ │ -559 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -560 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ -561 return tmp; │ │ │ │ │ -562 } │ │ │ │ │ -563 │ │ │ │ │ -_5_6_4 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_-_=(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n) │ │ │ │ │ -565 { │ │ │ │ │ -566 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->advance(-n); │ │ │ │ │ -567 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -568 } │ │ │ │ │ -569 │ │ │ │ │ -_5_7_0 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_-(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n) const │ │ │ │ │ -571 { │ │ │ │ │ -572 _D_e_r_i_v_e_d_T_y_p_e tmp(static_cast<_D_e_r_i_v_e_d_T_y_p_e const&>(*this)); │ │ │ │ │ -573 tmp.advance(-n); │ │ │ │ │ -574 return tmp; │ │ │ │ │ -575 } │ │ │ │ │ -576 │ │ │ │ │ -577 │ │ │ │ │ -578 }; │ │ │ │ │ -579 │ │ │ │ │ -590 template │ │ │ │ │ -592 inline typename EnableIfInterOperable::type │ │ │ │ │ -_5_9_3 _o_p_e_r_a_t_o_r_=_=(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -594 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_6_1_5 _o_p_e_r_a_t_o_r_!_=(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -616 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_6_3_6 inline typename _E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e_<_T_1_,_T_2_,_b_o_o_l_>_:_:_t_y_p_e │ │ │ │ │ -637 _o_p_e_r_a_t_o_r_<(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -638 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_6_5_9 inline typename _E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e_<_T_1_,_T_2_,_b_o_o_l_>_:_:_t_y_p_e │ │ │ │ │ -660 _o_p_e_r_a_t_o_r_<_=(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -661 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_6_8_3 _o_p_e_r_a_t_o_r_>(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -684 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_7_0_5 _o_p_e_r_a_t_o_r_>_=(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -706 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_7_2_7 _o_p_e_r_a_t_o_r_-(const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_V_1_,_R_1_,_D_>& lhs, │ │ │ │ │ -728 const _R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_V_2_,_R_2_,_D_>& 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 │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:542 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:637 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_> │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:683 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:660 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:237 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:705 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:259 │ │ │ │ │ +13 namespace Std │ │ │ │ │ +14 { │ │ │ │ │ +15 │ │ │ │ │ +22#if DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ +23 using std::identity; │ │ │ │ │ +24#else //DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ +_2_5 struct _i_d_e_n_t_i_t_y { │ │ │ │ │ +26 template │ │ │ │ │ +_2_7 constexpr T&& _o_p_e_r_a_t_o_r_(_)(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 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y │ │ │ │ │ -std::forward_iterator_tag iterator_category │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_p_o_i_n_t_e_r │ │ │ │ │ -V * pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:209 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_i_f_f_e_r_e_n_c_e_T_y_p_e │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:195 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_e_r_i_v_e_d_T_y_p_e │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_V_a_l_u_e │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_P_o_i_n_t_e_r │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -D difference_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -R reference │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -Facade class for stl conformant bidirectional iterators. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:274 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_p_o_i_n_t_e_r │ │ │ │ │ -V * pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -D difference_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:280 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_e_r_i_v_e_d_T_y_p_e │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:309 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -DerivedType & operator--() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:337 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:343 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_P_o_i_n_t_e_r │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y │ │ │ │ │ -std::bidirectional_iterator_tag iterator_category │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_i_f_f_e_r_e_n_c_e_T_y_p_e │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -DerivedType operator--(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -R reference │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_B_i_d_i_r_e_c_t_i_o_n_a_l_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_V_a_l_u_e │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:434 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:439 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -D difference_type │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:440 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -DerivedType operator--(int) │ │ │ │ │ -Postdecrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:557 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_p_o_i_n_t_e_r │ │ │ │ │ -V * pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:441 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y │ │ │ │ │ -std::random_access_iterator_tag iterator_category │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:438 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -R reference │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:442 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_i_f_f_e_r_e_n_c_e_T_y_p_e │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:492 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -DerivedType & operator--() │ │ │ │ │ -Predecrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:550 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -DerivedType & operator-=(DifferenceType n) │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:564 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ -DerivedType operator+(DifferenceType n) const │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Reference operator[](DifferenceType n) const │ │ │ │ │ -Get the element n positions from the current one. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:515 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_e_r_i_v_e_d_T_y_p_e │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:477 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_P_o_i_n_t_e_r │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -DerivedType operator-(DifferenceType n) const │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:570 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:528 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_V_a_l_u_e │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:482 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -DerivedType & operator+=(DifferenceType n) │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:535 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_d_o_m_A_c_c_e_s_s_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:497 │ │ │ │ │ -_D_u_n_e_:_:_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e │ │ │ │ │ -Enable typedef if two types are interoperable. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y │ │ │ │ │ +A function object type whose operator() returns its argument unchanged. │ │ │ │ │ +DDeeffiinniittiioonn functional.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_i_d_e_n_t_i_t_y_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +constexpr T && operator()(T &&t) const noexcept │ │ │ │ │ +DDeeffiinniittiioonn functional.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typetraits.hh File Reference │ │ │ │ +dune-common: variant.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,141 +65,36 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
typetraits.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
variant.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ -
#include <complex>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ +
#include <variant>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::Empty
 Just an empty class. More...
 
struct  Dune::IsInteroperable< T1, T2 >
 Checks whether two types are interoperable. More...
 
struct  Dune::EnableIfInterOperable< T1, T2, Type >
 Enable typedef if two types are interoperable. More...
 
struct  Dune::AlwaysFalse< T >
 template which always yields a false value More...
 
struct  Dune::AlwaysTrue< T >
 template which always yields a true value More...
 
struct  Dune::IsCallable< F(Args...), R >
 Check if a type is callable with ()-operator and given arguments. More...
 
struct  Dune::IsNumber< T >
 Whether this type acts as a scalar in the context of (hierarchically blocked) containers. More...
 
struct  Dune::HasNaN< T >
 Whether this type has a value of NaN. More...
 
struct  Dune::IsIndexable< T, I >
 Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed with an index of type I. More...
 
struct  Dune::IsIterable< T, typename >
 typetrait to check that a class has begin() and end() members More...
 
struct  Dune::IsTuple< T >
 Check if T is a std::tuple<...> More...
 
struct  Dune::IsTupleOrDerived< T >
 Check if T derived from a std::tuple<...> More...
 
struct  Dune::IsIntegralConstant< T >
 Check if T is an std::integral_constant<I, i> More...
 
struct  Dune::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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

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

│ │ │ │ -Functions

template<class T , T... t, std::size_t index>
constexpr auto Dune::integerSequenceEntry (std::integer_sequence< T, t... >, std::integral_constant< std::size_t, index > i)
 Get entry of std::integer_sequence.
 
template<class T >
constexpr AutonomousValue< T > Dune::autoCopy (T &&v)
 Autonomous copy of an expression's value for use in auto type deduction.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Traits for type conversions and type information.

│ │ │ │ -
Author
Markus Blatt, Christian Engwer
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,121 +1,20 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -typetraits.hh File Reference │ │ │ │ │ -Traits for type conversions and type information. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _s_t_d │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +variant.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_E_m_p_t_y │ │ │ │ │ -  Just an empty class. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -  Checks whether two types are interoperable. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e_<_ _T_1_,_ _T_2_,_ _T_y_p_e_ _> │ │ │ │ │ -  Enable typedef if two types are interoperable. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_l_w_a_y_s_F_a_l_s_e_<_ _T_ _> │ │ │ │ │ -  template which always yields a false value _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_l_w_a_y_s_T_r_u_e_<_ _T_ _> │ │ │ │ │ -  template which always yields a true value _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_C_a_l_l_a_b_l_e_<_ _F_(_A_r_g_s_._._._)_,_ _R_ _> │ │ │ │ │ -  Check if a type is callable with ()-operator and given arguments. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_N_u_m_b_e_r_<_ _T_ _> │ │ │ │ │ -  Whether this type acts as a scalar in the context of (hierarchically │ │ │ │ │ - blocked) containers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_H_a_s_N_a_N_<_ _T_ _> │ │ │ │ │ -  Whether this type has a value of NaN. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_d_e_x_a_b_l_e_<_ _T_,_ _I_ _> │ │ │ │ │ -  Type trait to determine whether an instance of T has an operator[](I), │ │ │ │ │ - i.e. whether it can be indexed with an index of type I. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_t_e_r_a_b_l_e_<_ _T_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ -  typetrait to check that a class has begin() and end() members _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_u_p_l_e_<_ _T_ _> │ │ │ │ │ -  Check if T is a std::tuple<...> _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d_<_ _T_ _> │ │ │ │ │ -  Check if T derived from a std::tuple<...> _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t_<_ _T_ _> │ │ │ │ │ -  Check if T is an std::integral_constant _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_z_e_O_f_<_ _T_ _> │ │ │ │ │ -  Compute size of variadic type list. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  Type free of internal references that T can be converted to. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _&_ _> │ │ │ │ │ -  Specialization to remove lvalue references. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _&_&_ _> │ │ │ │ │ -  Specialization to remove rvalue references. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _c_o_n_s_t_ _T_ _> │ │ │ │ │ -  Specialization to remove const qualifiers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _v_o_l_a_t_i_l_e_ _T_ _> │ │ │ │ │ -  Specialization to remove volatile qualifiers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _b_o_o_l_ _>_:_:_r_e_f_e_r_e_n_c_e_ _> │ │ │ │ │ -  Specialization for the proxies of vector _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _v_o_l_a_t_i_l_e_ _c_o_n_s_t_ _T_ _> │ │ │ │ │ -  Specialization to remove both const and volatile qualifiers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_v_o_i_d___t = typename Impl::voider< Types... >::type │ │ │ │ │ -  Is void for all valid input types. The workhorse for C++11 SFINAE- │ │ │ │ │ - techniques. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_f_i_e_l_d___t = typename _F_i_e_l_d_T_r_a_i_t_s< Type >::field_type │ │ │ │ │ -  Convenient access to _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_f_i_e_l_d___t_y_p_e. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_r_e_a_l___t = typename _F_i_e_l_d_T_r_a_i_t_s< Type >::real_type │ │ │ │ │ -  Convenient access to _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_r_e_a_l___t_y_p_e. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e = typename _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e< T >::type │ │ │ │ │ -  Type free of internal references that T can be converted to. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y (std:: │ │ │ │ │ - integer_sequence< T, t... >, std:: │ │ │ │ │ - integral_constant< std::size_t, index > i) │ │ │ │ │ -  Get entry of std::integer_sequence. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e< T >  _D_u_n_e_:_:_a_u_t_o_C_o_p_y (T &&v) │ │ │ │ │ -  Autonomous copy of an expression's value for │ │ │ │ │ - use in auto type deduction. │ │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt, Christian Engwer │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typetraits.hh Source File │ │ │ │ +dune-common: variant.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,415 +70,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
typetraits.hh
│ │ │ │ +
variant.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_TYPETRAITS_HH
│ │ │ │ -
6#define DUNE_TYPETRAITS_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_STD_VARIANT_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_VARIANT_HH
│ │ │ │
7
│ │ │ │ -
8#include <complex>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11#include <vector>
│ │ │ │ +
8#warning dune/common/std/variant.hh is deprecated and will be removed after Dune 2.8.\
│ │ │ │ +
9 Include <variant> instead
│ │ │ │ +
10
│ │ │ │ +
11#include <variant>
│ │ │ │
12
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
15
│ │ │ │ -
16 namespace Impl
│ │ │ │ -
17 {
│ │ │ │ -
19
│ │ │ │ -
23 template <class...>
│ │ │ │ -
24 struct voider
│ │ │ │ -
25 {
│ │ │ │ -
26 using type = void;
│ │ │ │ -
27 };
│ │ │ │ -
28 }
│ │ │ │ -
29
│ │ │ │ -
31
│ │ │ │ -
39 template <class... Types>
│ │ │ │ -
40 using void_t = typename Impl::voider<Types...>::type;
│ │ │ │ -
41
│ │ │ │ -
55 struct Empty {};
│ │ │ │ -
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#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 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#ifndef DOXYGEN
│ │ │ │ -
253
│ │ │ │ -
254 namespace Impl {
│ │ │ │ -
255 // This function does nothing.
│ │ │ │ -
256 // By passing expressions to this function one can avoid
│ │ │ │ -
257 // "value computed is not used" warnings that may show up
│ │ │ │ -
258 // in a comma expression.
│ │ │ │ -
259 template<class...T>
│ │ │ │ -
260 void ignore(T&&... /*t*/)
│ │ │ │ -
261 {}
│ │ │ │ -
262 }
│ │ │ │ -
263
│ │ │ │ -
264#endif // DOXYGEN
│ │ │ │ -
265
│ │ │ │ -
269 // default version, gets picked if SFINAE fails
│ │ │ │ -
270 template<typename T, typename = void>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
272 : public std::false_type
│ │ │ │ -
273 {};
│ │ │ │ -
│ │ │ │ -
274
│ │ │ │ -
275#ifndef DOXYGEN
│ │ │ │ -
276 // version for types with begin() and end()
│ │ │ │ -
277 template<typename T>
│ │ │ │ -
278 struct IsIterable<T, decltype(Impl::ignore(
│ │ │ │ -
279 std::declval<T>().begin(),
│ │ │ │ -
280 std::declval<T>().end(),
│ │ │ │ -
281 std::declval<T>().begin() != std::declval<T>().end(),
│ │ │ │ -
282 decltype(std::declval<T>().begin()){std::declval<T>().end()},
│ │ │ │ -
283 ++(std::declval<std::add_lvalue_reference_t<decltype(std::declval<T>().begin())>>()),
│ │ │ │ -
284 *(std::declval<T>().begin())
│ │ │ │ -
285 ))>
│ │ │ │ -
286 : public std::true_type
│ │ │ │ -
287 {};
│ │ │ │ -
288#endif
│ │ │ │ -
289
│ │ │ │ -
290#ifndef DOXYGEN
│ │ │ │ -
291 // this is just a forward declaration
│ │ │ │ -
292 template <class> struct FieldTraits;
│ │ │ │ -
293#endif
│ │ │ │ -
294
│ │ │ │ -
296 template <class Type>
│ │ │ │ - │ │ │ │ -
298
│ │ │ │ -
300 template <class Type>
│ │ │ │ - │ │ │ │ -
302
│ │ │ │ -
303
│ │ │ │ -
304#ifndef DOXYGEN
│ │ │ │ -
305
│ │ │ │ -
306 // Implementation of IsTuple
│ │ │ │ -
307 namespace Impl {
│ │ │ │ -
308
│ │ │ │ -
309 template<class T>
│ │ │ │ -
310 struct IsTuple : public std::false_type
│ │ │ │ -
311 {};
│ │ │ │ -
312
│ │ │ │ -
313 template<class... T>
│ │ │ │ -
314 struct IsTuple<std::tuple<T...>> : public std::true_type
│ │ │ │ -
315 {};
│ │ │ │ -
316
│ │ │ │ -
317 } // namespace Impl
│ │ │ │ -
318
│ │ │ │ -
319#endif // DOXYGEN
│ │ │ │ -
320
│ │ │ │ -
326 template<class T>
│ │ │ │ -
│ │ │ │ -
327 struct IsTuple :
│ │ │ │ -
328 public Impl::IsTuple<T>
│ │ │ │ -
329 {};
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
331
│ │ │ │ -
332#ifndef DOXYGEN
│ │ │ │ -
333
│ │ │ │ -
334 // Implementation of IsTupleOrDerived
│ │ │ │ -
335 namespace Impl {
│ │ │ │ -
336
│ │ │ │ -
337 template<class... T, class Dummy>
│ │ │ │ -
338 std::true_type isTupleOrDerived(const std::tuple<T...>*, Dummy)
│ │ │ │ -
339 { return {}; }
│ │ │ │ -
340
│ │ │ │ -
341 template<class Dummy>
│ │ │ │ -
342 std::false_type isTupleOrDerived(const void*, Dummy)
│ │ │ │ -
343 { return {}; }
│ │ │ │ -
344
│ │ │ │ -
345 } // namespace Impl
│ │ │ │ -
346
│ │ │ │ -
347#endif // DOXYGEN
│ │ │ │ -
348
│ │ │ │ -
354 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
356 public decltype(Impl::isTupleOrDerived(std::declval<T*>(), true))
│ │ │ │ -
357 {};
│ │ │ │ -
│ │ │ │ -
358
│ │ │ │ -
359
│ │ │ │ -
360#ifndef DOXYGEN
│ │ │ │ -
361
│ │ │ │ -
362 // Implementation of is IsIntegralConstant
│ │ │ │ -
363 namespace Impl {
│ │ │ │ -
364
│ │ │ │ -
365 template<class T>
│ │ │ │ -
366 struct IsIntegralConstant : public std::false_type
│ │ │ │ -
367 {};
│ │ │ │ -
368
│ │ │ │ -
369 template<class T, T t>
│ │ │ │ -
370 struct IsIntegralConstant<std::integral_constant<T, t>> : public std::true_type
│ │ │ │ -
371 {};
│ │ │ │ -
372
│ │ │ │ -
373 } // namespace Impl
│ │ │ │ -
374
│ │ │ │ -
375#endif // DOXYGEN
│ │ │ │ -
376
│ │ │ │ -
382 template<class T>
│ │ │ │ -
│ │ │ │ -
383 struct IsIntegralConstant : public Impl::IsIntegralConstant<std::decay_t<T>>
│ │ │ │ -
384 {};
│ │ │ │ -
│ │ │ │ -
385
│ │ │ │ -
386
│ │ │ │ -
387
│ │ │ │ -
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");
│ │ │ │ -
465 return Impl::IntegerSequenceHelper<T, t...>::get(i);
│ │ │ │ -
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.
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Std {
│ │ │ │ +
15 using std::variant;
│ │ │ │ +
16 using std::visit;
│ │ │ │ +
17 using std::variant_size;
│ │ │ │ +
18 using std::variant_size_v;
│ │ │ │ +
19 using std::get;
│ │ │ │ +
20 using std::get_if;
│ │ │ │ +
21 using std::holds_alternative;
│ │ │ │ +
22 using std::monostate;
│ │ │ │ +
23}
│ │ │ │ +
24}
│ │ │ │ +
25
│ │ │ │ +
26#endif
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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 {} │ │ │ │ │ @@ -1,462 +1,42 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -typetraits.hh │ │ │ │ │ + * _s_t_d │ │ │ │ │ +variant.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_TYPETRAITS_HH │ │ │ │ │ -6#define DUNE_TYPETRAITS_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_STD_VARIANT_HH │ │ │ │ │ +6#define DUNE_COMMON_STD_VARIANT_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +8#warning dune/common/std/variant.hh is deprecated and will be removed after │ │ │ │ │ +Dune 2.8.\ │ │ │ │ │ +9 Include instead │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e │ │ │ │ │ -14{ │ │ │ │ │ -15 │ │ │ │ │ -16 namespace Impl │ │ │ │ │ -17 { │ │ │ │ │ -19 │ │ │ │ │ -23 template │ │ │ │ │ -24 struct voider │ │ │ │ │ -25 { │ │ │ │ │ -26 using type = void; │ │ │ │ │ -27 }; │ │ │ │ │ -28 } │ │ │ │ │ -29 │ │ │ │ │ -31 │ │ │ │ │ -39 template │ │ │ │ │ -_4_0 using _v_o_i_d___t = typename Impl::voider::type; │ │ │ │ │ -41 │ │ │ │ │ -_5_5 struct _E_m_p_t_y {}; │ │ │ │ │ -56 │ │ │ │ │ -63 template │ │ │ │ │ -_6_4 struct _I_s_I_n_t_e_r_o_p_e_r_a_b_l_e │ │ │ │ │ -65 { │ │ │ │ │ -_7_0 constexpr static bool _v_a_l_u_e = std::is_convertible::value || std:: │ │ │ │ │ -is_convertible::value; │ │ │ │ │ -71 }; │ │ │ │ │ -72 │ │ │ │ │ -78 template │ │ │ │ │ -_7_9 struct _E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e │ │ │ │ │ -80 : public std::enable_if::value, Type> │ │ │ │ │ -81 {}; │ │ │ │ │ -82 │ │ │ │ │ -100 │ │ │ │ │ -116 │ │ │ │ │ -123 template │ │ │ │ │ -_1_2_4 struct _A_l_w_a_y_s_F_a_l_s_e : public std::false_type {}; │ │ │ │ │ -125 │ │ │ │ │ -133 template │ │ │ │ │ -_1_3_4 struct _A_l_w_a_y_s_T_r_u_e : public std::true_type {}; │ │ │ │ │ -135 │ │ │ │ │ -161 template │ │ │ │ │ -_1_6_2 struct _I_s_C_a_l_l_a_b_l_e; │ │ │ │ │ -163 │ │ │ │ │ -168 template │ │ │ │ │ -_1_6_9 struct _I_s_C_a_l_l_a_b_l_e │ │ │ │ │ -170 : public std::bool_constant< │ │ │ │ │ -171 std::is_invocable_r_v │ │ │ │ │ -172 && !std::is_member_pointer_v> │ │ │ │ │ -173 > {}; │ │ │ │ │ -174 │ │ │ │ │ -177 │ │ │ │ │ -192 template │ │ │ │ │ -_1_9_3 struct _I_s_N_u_m_b_e_r │ │ │ │ │ -194 : public std::integral_constant::value> { │ │ │ │ │ -195 }; │ │ │ │ │ -196 │ │ │ │ │ -197#ifndef DOXYGEN │ │ │ │ │ -198 │ │ │ │ │ -199 template │ │ │ │ │ -200 struct _I_s_N_u_m_b_e_r<_s_t_d::complex> │ │ │ │ │ -201 : public std::integral_constant::value> { │ │ │ │ │ -202 }; │ │ │ │ │ -203 │ │ │ │ │ -204#endif // DOXYGEN │ │ │ │ │ -205 │ │ │ │ │ -207 │ │ │ │ │ -210 template │ │ │ │ │ -_2_1_1 struct _H_a_s_N_a_N │ │ │ │ │ -212 : public std::integral_constant::value> { │ │ │ │ │ -213 }; │ │ │ │ │ -214 │ │ │ │ │ -215#ifndef DOXYGEN │ │ │ │ │ -216 │ │ │ │ │ -217 template │ │ │ │ │ -218 struct _H_a_s_N_a_N<_s_t_d::complex> │ │ │ │ │ -219 : public std::integral_constant::value> { │ │ │ │ │ -220 }; │ │ │ │ │ -221 │ │ │ │ │ -222#endif // DOXYGEN │ │ │ │ │ -223 │ │ │ │ │ -224#ifndef DOXYGEN │ │ │ │ │ -225 │ │ │ │ │ -226 namespace Impl { │ │ │ │ │ -227 │ │ │ │ │ -228 template │ │ │ │ │ -229 struct IsIndexable │ │ │ │ │ -230 : public std::false_type │ │ │ │ │ -231 {}; │ │ │ │ │ -232 │ │ │ │ │ -233 template │ │ │ │ │ -234 struct IsIndexable() │ │ │ │ │ -[std::declval()]) > 0),int>::type> │ │ │ │ │ -235 : public std::true_type │ │ │ │ │ -236 {}; │ │ │ │ │ -237 │ │ │ │ │ -238 } │ │ │ │ │ -239 │ │ │ │ │ -240#endif // DOXYGEN │ │ │ │ │ -241 │ │ │ │ │ -243 │ │ │ │ │ -247 template │ │ │ │ │ -_2_4_8 struct _I_s_I_n_d_e_x_a_b_l_e │ │ │ │ │ -249 : public Impl::IsIndexable │ │ │ │ │ -250 {}; │ │ │ │ │ -251 │ │ │ │ │ -252#ifndef DOXYGEN │ │ │ │ │ -253 │ │ │ │ │ -254 namespace Impl { │ │ │ │ │ -255 // This function does nothing. │ │ │ │ │ -256 // By passing expressions to this function one can avoid │ │ │ │ │ -257 // "value computed is not used" warnings that may show up │ │ │ │ │ -258 // in a comma expression. │ │ │ │ │ -259 template │ │ │ │ │ -260 void ignore(T&&... /*t*/) │ │ │ │ │ -261 {} │ │ │ │ │ -262 } │ │ │ │ │ -263 │ │ │ │ │ -264#endif // DOXYGEN │ │ │ │ │ -265 │ │ │ │ │ -269 // default version, gets picked if SFINAE fails │ │ │ │ │ -270 template │ │ │ │ │ -_2_7_1 struct _I_s_I_t_e_r_a_b_l_e │ │ │ │ │ -272 : public std::false_type │ │ │ │ │ -273 {}; │ │ │ │ │ -274 │ │ │ │ │ -275#ifndef DOXYGEN │ │ │ │ │ -276 // version for types with begin() and end() │ │ │ │ │ -277 template │ │ │ │ │ -278 struct _I_s_I_t_e_r_a_b_l_e().begin(), │ │ │ │ │ -280 std::declval().end(), │ │ │ │ │ -281 std::declval().begin() != std::declval().end(), │ │ │ │ │ -282 decltype(std::declval().begin()){std::declval().end()}, │ │ │ │ │ -283 ++(std::declval │ │ │ │ │ -().begin())>>()), │ │ │ │ │ -284 *(std::declval().begin()) │ │ │ │ │ -285 ))> │ │ │ │ │ -286 : public std::true_type │ │ │ │ │ -287 {}; │ │ │ │ │ -288#endif │ │ │ │ │ -289 │ │ │ │ │ -290#ifndef DOXYGEN │ │ │ │ │ -291 // this is just a forward declaration │ │ │ │ │ -292 template struct FieldTraits; │ │ │ │ │ -293#endif │ │ │ │ │ -294 │ │ │ │ │ -296 template │ │ │ │ │ -_2_9_7 using _f_i_e_l_d___t = typename _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -298 │ │ │ │ │ -300 template │ │ │ │ │ -_3_0_1 using _r_e_a_l___t = typename _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -302 │ │ │ │ │ -303 │ │ │ │ │ -304#ifndef DOXYGEN │ │ │ │ │ -305 │ │ │ │ │ -306 // Implementation of IsTuple │ │ │ │ │ -307 namespace Impl { │ │ │ │ │ -308 │ │ │ │ │ -309 template │ │ │ │ │ -310 struct _I_s_T_u_p_l_e : public std::false_type │ │ │ │ │ -311 {}; │ │ │ │ │ -312 │ │ │ │ │ -313 template │ │ │ │ │ -314 struct _I_s_T_u_p_l_e<_s_t_d::tuple> : public std::true_type │ │ │ │ │ -315 {}; │ │ │ │ │ -316 │ │ │ │ │ -317 } // namespace Impl │ │ │ │ │ -318 │ │ │ │ │ -319#endif // DOXYGEN │ │ │ │ │ -320 │ │ │ │ │ -326 template │ │ │ │ │ -_3_2_7 struct _I_s_T_u_p_l_e : │ │ │ │ │ -328 public Impl::IsTuple │ │ │ │ │ -329 {}; │ │ │ │ │ -330 │ │ │ │ │ -331 │ │ │ │ │ -332#ifndef DOXYGEN │ │ │ │ │ -333 │ │ │ │ │ -334 // Implementation of IsTupleOrDerived │ │ │ │ │ -335 namespace Impl { │ │ │ │ │ -336 │ │ │ │ │ -337 template │ │ │ │ │ -338 std::true_type isTupleOrDerived(const std::tuple*, Dummy) │ │ │ │ │ -339 { return {}; } │ │ │ │ │ -340 │ │ │ │ │ -341 template │ │ │ │ │ -342 std::false_type isTupleOrDerived(const void*, Dummy) │ │ │ │ │ -343 { return {}; } │ │ │ │ │ -344 │ │ │ │ │ -345 } // namespace Impl │ │ │ │ │ -346 │ │ │ │ │ -347#endif // DOXYGEN │ │ │ │ │ -348 │ │ │ │ │ -354 template │ │ │ │ │ -_3_5_5 struct _I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d : │ │ │ │ │ -356 public decltype(Impl::isTupleOrDerived(std::declval(), true)) │ │ │ │ │ -357 {}; │ │ │ │ │ -358 │ │ │ │ │ -359 │ │ │ │ │ -360#ifndef DOXYGEN │ │ │ │ │ -361 │ │ │ │ │ -362 // Implementation of is IsIntegralConstant │ │ │ │ │ -363 namespace Impl { │ │ │ │ │ -364 │ │ │ │ │ -365 template │ │ │ │ │ -366 struct _I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t : public std::false_type │ │ │ │ │ -367 {}; │ │ │ │ │ -368 │ │ │ │ │ -369 template │ │ │ │ │ -370 struct IsIntegralConstant<_s_t_d::integral_constant> : public std:: │ │ │ │ │ -true_type │ │ │ │ │ -371 {}; │ │ │ │ │ -372 │ │ │ │ │ -373 } // namespace Impl │ │ │ │ │ -374 │ │ │ │ │ -375#endif // DOXYGEN │ │ │ │ │ -376 │ │ │ │ │ -382 template │ │ │ │ │ -_3_8_3 struct _I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t : public Impl::IsIntegralConstant> │ │ │ │ │ -384 {}; │ │ │ │ │ -385 │ │ │ │ │ -386 │ │ │ │ │ -387 │ │ │ │ │ -401 template │ │ │ │ │ -_4_0_2 struct _S_i_z_e_O_f │ │ │ │ │ -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 _g_e_t(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 _g_e_t(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 │ │ │ │ │ -_4_6_2 constexpr auto _i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y(std::integer_sequence /*seq*/, │ │ │ │ │ -std::integral_constant i) │ │ │ │ │ -463 { │ │ │ │ │ -464 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry │ │ │ │ │ -exceed size"); │ │ │ │ │ -465 return Impl::IntegerSequenceHelper::get(i); │ │ │ │ │ -466 } │ │ │ │ │ -467 │ │ │ │ │ -468 │ │ │ │ │ -475 template │ │ │ │ │ -_4_7_6 struct _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y; │ │ │ │ │ -477 │ │ │ │ │ -478#ifndef DOXYGEN │ │ │ │ │ -479 │ │ │ │ │ -480 template │ │ │ │ │ -481 struct _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y<_s_t_d::integer_sequence, i> │ │ │ │ │ -482 : public decltype(Impl::IntegerSequenceHelper::get(std:: │ │ │ │ │ -integral_constant())) │ │ │ │ │ -483 {}; │ │ │ │ │ -484 │ │ │ │ │ -485#endif // DOXYGEN │ │ │ │ │ -486 │ │ │ │ │ -500 template │ │ │ │ │ -_5_0_1 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e { using _t_y_p_e = T; }; │ │ │ │ │ -502 │ │ │ │ │ -504 template │ │ │ │ │ -_5_0_5 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_> {}; │ │ │ │ │ -506 │ │ │ │ │ -508 template │ │ │ │ │ -_5_0_9 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_> {}; │ │ │ │ │ -510 │ │ │ │ │ -512 template │ │ │ │ │ -_5_1_3 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ │ -514 │ │ │ │ │ -516 template │ │ │ │ │ -_5_1_7 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ │ -518 │ │ │ │ │ -520 template<> │ │ │ │ │ -_5_2_1 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e<_s_t_d::vector::reference> │ │ │ │ │ -522 { │ │ │ │ │ -_5_2_3 using _t_y_p_e = bool; │ │ │ │ │ -524 }; │ │ │ │ │ -525 │ │ │ │ │ -527 template │ │ │ │ │ -_5_2_8 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ │ -529 │ │ │ │ │ -557 template │ │ │ │ │ -_5_5_8 using _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e = typename _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ │ -559 │ │ │ │ │ -641 template │ │ │ │ │ -_6_4_2 constexpr _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_<_T_> _a_u_t_o_C_o_p_y(T &&v) │ │ │ │ │ -643 { │ │ │ │ │ -644 return v; │ │ │ │ │ -645 } │ │ │ │ │ -646 │ │ │ │ │ -648} │ │ │ │ │ -649#endif │ │ │ │ │ -_D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y │ │ │ │ │ -constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std:: │ │ │ │ │ -integral_constant< std::size_t, index > i) │ │ │ │ │ -Get entry of std::integer_sequence. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:462 │ │ │ │ │ -_D_u_n_e_:_:_r_e_a_l___t │ │ │ │ │ -typename FieldTraits< Type >::real_type real_t │ │ │ │ │ -Convenient access to FieldTraits::real_type. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_a_u_t_o_C_o_p_y │ │ │ │ │ -constexpr AutonomousValue< T > autoCopy(T &&v) │ │ │ │ │ -Autonomous copy of an expression's value for use in auto type deduction. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:642 │ │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e │ │ │ │ │ -typename AutonomousValueType< T >::type AutonomousValue │ │ │ │ │ -Type free of internal references that T can be converted to. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:558 │ │ │ │ │ -_D_u_n_e_:_:_v_o_i_d___t │ │ │ │ │ -typename Impl::voider< Types... >::type void_t │ │ │ │ │ -Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_f_i_e_l_d___t │ │ │ │ │ -typename FieldTraits< Type >::field_type field_t │ │ │ │ │ -Convenient access to FieldTraits::field_type. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:297 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14namespace Std { │ │ │ │ │ +15 using std::variant; │ │ │ │ │ +16 using std::visit; │ │ │ │ │ +17 using std::variant_size; │ │ │ │ │ +18 using std::variant_size_v; │ │ │ │ │ +19 using std::get; │ │ │ │ │ +20 using std::get_if; │ │ │ │ │ +21 using std::holds_alternative; │ │ │ │ │ +22 using std::monostate; │ │ │ │ │ +23} │ │ │ │ │ +24} │ │ │ │ │ +25 │ │ │ │ │ +26#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ -Key &key) │ │ │ │ │ -DDeeffiinniittiioonn propertymap.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_I_s_N_u_m_b_e_r │ │ │ │ │ -Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ -containers. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -T field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_E_m_p_t_y │ │ │ │ │ -Just an empty class. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e │ │ │ │ │ -Checks whether two types are interoperable. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e_:_:_v_a_l_u_e │ │ │ │ │ -static constexpr bool value │ │ │ │ │ -True if either a conversion from T1 to T2 or vice versa exists. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e │ │ │ │ │ -Enable typedef if two types are interoperable. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_l_w_a_y_s_F_a_l_s_e │ │ │ │ │ -template which always yields a false value │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_A_l_w_a_y_s_T_r_u_e │ │ │ │ │ -template which always yields a true value │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_I_s_C_a_l_l_a_b_l_e │ │ │ │ │ -Check if a type is callable with ()-operator and given arguments. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_H_a_s_N_a_N │ │ │ │ │ -Whether this type has a value of NaN. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_d_e_x_a_b_l_e │ │ │ │ │ -Type trait to determine whether an instance of T has an operator[](I), i.e. │ │ │ │ │ -whether it can be indexed... │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:250 │ │ │ │ │ -_D_u_n_e_:_:_I_s_I_t_e_r_a_b_l_e │ │ │ │ │ -typetrait to check that a class has begin() and end() members │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:273 │ │ │ │ │ -_D_u_n_e_:_:_I_s_T_u_p_l_e │ │ │ │ │ -Check if T is a std::tuple<...> │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d │ │ │ │ │ -Check if T derived from a std::tuple<...> │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:357 │ │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t │ │ │ │ │ -Check if T is an std::integral_constant │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_S_i_z_e_O_f │ │ │ │ │ -Compute size of variadic type list. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y │ │ │ │ │ -Get entry of std::integer_sequence. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:476 │ │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e │ │ │ │ │ -Type free of internal references that T can be converted to. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:501 │ │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ -T type │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:501 │ │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _b_o_o_l_ _>_:_:_r_e_f_e_r_e_n_c_e_ _>_:_:_t_y_p_e │ │ │ │ │ -bool type │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:523 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parametertreeparser.hh File Reference │ │ │ │ +dune-common: indent.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,49 +71,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
parametertreeparser.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
indent.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

Utility class for handling nested indentation in output. │ │ │ │ More...

│ │ │ │ -
#include <istream>
│ │ │ │ +
#include <ostream>
│ │ │ │ #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...
class  Dune::Indent
 Utility class for handling nested indentation in output. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

std::ostream & Dune::operator<< (std::ostream &s, const Indent &indent)
 write indentation to a stream
 
│ │ │ │

Detailed Description

│ │ │ │ -

Various parser methods to get data into a ParameterTree object.

│ │ │ │ +

Utility class for handling nested indentation in output.

│ │ │ │ +
Author
Jö Fahlke
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,31 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -parametertreeparser.hh File Reference │ │ │ │ │ -Various parser methods to get data into a ParameterTree object. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +indent.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n │ │ │ │ │ +Utility class for handling nested indentation in output. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_m_e_t_e_r_t_r_e_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_E_r_r_o_r │ │ │ │ │ -  report parser error while reading _P_a_r_a_m_e_t_e_r_T_r_e_e _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_H_e_l_p_R_e_q_u_e_s_t │ │ │ │ │ -  exception thrown if the user wants to see help string _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r │ │ │ │ │ -  Parsers to set up a _P_a_r_a_m_e_t_e_r_T_r_e_e from various input sources. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_n_d_e_n_t │ │ │ │ │ +  Utility class for handling nested indentation in output. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _I_n_d_e_n_t &indent) │ │ │ │ │ +  write indentation to a stream │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Various parser methods to get data into a ParameterTree object. │ │ │ │ │ +Utility class for handling nested indentation in output. │ │ │ │ │ + Author │ │ │ │ │ + Jö Fahlke │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parametertreeparser.hh Source File │ │ │ │ +dune-common: indent.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,92 +74,107 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
parametertreeparser.hh
│ │ │ │ +
indent.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_PARAMETER_PARSER_HH
│ │ │ │ -
6#define DUNE_PARAMETER_PARSER_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_INDENT_HH
│ │ │ │ +
6#define DUNE_COMMON_INDENT_HH
│ │ │ │
7
│ │ │ │ -
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
│ │ │ │ +
8#include <ostream>
│ │ │ │ +
9#include <string>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
22
│ │ │ │ +
│ │ │ │ +
52 class Indent
│ │ │ │ +
53 {
│ │ │ │ +
54 const Indent* parent;
│ │ │ │ +
55 std::string basic_indent;
│ │ │ │ +
56 unsigned level;
│ │ │ │ +
57
│ │ │ │ +
58 public:
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ +
63 inline Indent(const std::string& basic_indent_ = " ", unsigned level_ = 0)
│ │ │ │ +
64 : parent(0), basic_indent(basic_indent_), level(level_)
│ │ │ │ +
65 { }
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
│ │ │ │ +
68 inline Indent(unsigned level_)
│ │ │ │ +
69 : parent(0), basic_indent(" "), level(level_)
│ │ │ │ +
70 { }
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
73
│ │ │ │ +
│ │ │ │ +
76 inline Indent(const Indent* parent_,
│ │ │ │ +
77 const std::string& basic_indent_ = " ", unsigned level_ = 1)
│ │ │ │ +
78 : parent(parent_), basic_indent(basic_indent_), level(level_)
│ │ │ │ +
79 { }
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ +
82 inline Indent(const Indent* parent_, unsigned level_)
│ │ │ │ +
83 : parent(parent_), basic_indent(" "), level(level_)
│ │ │ │ +
84 { }
│ │ │ │ +
│ │ │ │
85
│ │ │ │ -
96 static void readINITree(std::istream& in, ParameterTree& pt,
│ │ │ │ -
97 bool overwrite);
│ │ │ │ +
│ │ │ │ +
87 inline Indent operator+(const std::string& newindent) const {
│ │ │ │ +
88 return Indent(this, newindent);
│ │ │ │ +
89 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
91 inline Indent operator+(unsigned morelevel) const {
│ │ │ │ +
92 return Indent(parent, basic_indent, level+morelevel);
│ │ │ │ +
93 }
│ │ │ │ +
│ │ │ │ +
95 inline Indent& operator++() { ++level; return *this; }
│ │ │ │ +
97 inline Indent& operator--() { if ( level > 0 ) --level; return *this; }
│ │ │ │
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
│ │ │ │ -
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} // end namespace Dune
│ │ │ │ -
190
│ │ │ │ -
191#endif // DUNE_PARAMETER_PARSER_HH
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
A hierarchical structure of string parameters.
│ │ │ │ +
100 friend inline std::ostream& operator<<(std::ostream& s,
│ │ │ │ +
101 const Indent& indent);
│ │ │ │ +
102 };
│ │ │ │ +
│ │ │ │ +
103
│ │ │ │ +
│ │ │ │ +
105 inline std::ostream& operator<<(std::ostream& s, const Indent& indent) {
│ │ │ │ +
106 if(indent.parent)
│ │ │ │ +
107 s << *indent.parent;
│ │ │ │ +
108 for(unsigned i = 0; i < indent.level; ++i)
│ │ │ │ +
109 s << indent.basic_indent;
│ │ │ │ +
110 return s;
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
115} // namespace Dune
│ │ │ │ +
116
│ │ │ │ +
117#endif // DUNE_COMMON_INDENT_HH
│ │ │ │ +
Indent operator+(const std::string &newindent) const
create new indentation object with this one as parent
Definition indent.hh:87
│ │ │ │ +
Indent(unsigned level_)
setup without parent and basic_indentation of two spaces
Definition indent.hh:68
│ │ │ │ +
Indent operator+(unsigned morelevel) const
create a copy of this indentation object with raised level
Definition indent.hh:91
│ │ │ │ +
Indent(const Indent *parent_, unsigned level_)
setup with parent
Definition indent.hh:82
│ │ │ │ +
Indent & operator++()
raise indentation level
Definition indent.hh:95
│ │ │ │ +
Indent(const std::string &basic_indent_=" ", unsigned level_=0)
setup without parent
Definition indent.hh:63
│ │ │ │ +
Indent & operator--()
lower indentation level
Definition indent.hh:97
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const Indent &indent)
write indentation to a stream
Definition indent.hh:105
│ │ │ │ +
Indent(const Indent *parent_, const std::string &basic_indent_=" ", unsigned level_=1)
setup with parent
Definition indent.hh:76
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │ +
Utility class for handling nested indentation in output.
Definition indent.hh:53
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,116 +1,119 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -parametertreeparser.hh │ │ │ │ │ +indent.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_PARAMETER_PARSER_HH │ │ │ │ │ -6#define DUNE_PARAMETER_PARSER_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_INDENT_HH │ │ │ │ │ +6#define DUNE_COMMON_INDENT_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_a_r_a_m_e_t_e_r_t_r_e_e_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e { │ │ │ │ │ -20 │ │ │ │ │ -_2_2 class _P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_E_r_r_o_r : public _R_a_n_g_e_E_r_r_o_r {}; │ │ │ │ │ -_2_8 class _H_e_l_p_R_e_q_u_e_s_t : public _E_x_c_e_p_t_i_o_n {}; │ │ │ │ │ -29 │ │ │ │ │ -_3_4 class _P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r │ │ │ │ │ -35 { │ │ │ │ │ -36 │ │ │ │ │ -37 static std::string ltrim(const std::string& s); │ │ │ │ │ -38 static std::string rtrim(const std::string& s); │ │ │ │ │ -39 │ │ │ │ │ -40 public: │ │ │ │ │ -41 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e { │ │ │ │ │ +22 │ │ │ │ │ +_5_2 class _I_n_d_e_n_t │ │ │ │ │ +53 { │ │ │ │ │ +54 const _I_n_d_e_n_t* parent; │ │ │ │ │ +55 std::string basic_indent; │ │ │ │ │ +56 unsigned level; │ │ │ │ │ +57 │ │ │ │ │ +58 public: │ │ │ │ │ +60 │ │ │ │ │ +_6_3 inline _I_n_d_e_n_t(const std::string& basic_indent_ = " ", unsigned level_ = 0) │ │ │ │ │ +64 : parent(0), basic_indent(basic_indent_), level(level_) │ │ │ │ │ +65 { } │ │ │ │ │ +66 │ │ │ │ │ +_6_8 inline _I_n_d_e_n_t(unsigned level_) │ │ │ │ │ +69 : parent(0), basic_indent(" "), level(level_) │ │ │ │ │ +70 { } │ │ │ │ │ +71 │ │ │ │ │ +73 │ │ │ │ │ +_7_6 inline _I_n_d_e_n_t(const _I_n_d_e_n_t* parent_, │ │ │ │ │ +77 const std::string& basic_indent_ = " ", unsigned level_ = 1) │ │ │ │ │ +78 : parent(parent_), basic_indent(basic_indent_), level(level_) │ │ │ │ │ +79 { } │ │ │ │ │ +80 │ │ │ │ │ +_8_2 inline _I_n_d_e_n_t(const _I_n_d_e_n_t* parent_, unsigned level_) │ │ │ │ │ +83 : parent(parent_), basic_indent(" "), level(level_) │ │ │ │ │ +84 { } │ │ │ │ │ 85 │ │ │ │ │ -96 static void _r_e_a_d_I_N_I_T_r_e_e(std::istream& in, _P_a_r_a_m_e_t_e_r_T_r_e_e& pt, │ │ │ │ │ -97 bool overwrite); │ │ │ │ │ +_8_7 inline _I_n_d_e_n_t _o_p_e_r_a_t_o_r_+(const std::string& newindent) const { │ │ │ │ │ +88 return _I_n_d_e_n_t(this, newindent); │ │ │ │ │ +89 } │ │ │ │ │ +_9_1 inline _I_n_d_e_n_t _o_p_e_r_a_t_o_r_+(unsigned morelevel) const { │ │ │ │ │ +92 return _I_n_d_e_n_t(parent, basic_indent, level+morelevel); │ │ │ │ │ +93 } │ │ │ │ │ +_9_5 inline _I_n_d_e_n_t& _o_p_e_r_a_t_o_r_+_+() { ++level; return *this; } │ │ │ │ │ +_9_7 inline _I_n_d_e_n_t& _o_p_e_r_a_t_o_r_-_-() { if ( level > 0 ) --level; return *this; } │ │ │ │ │ 98 │ │ │ │ │ -105 static _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e _r_e_a_d_I_N_I_T_r_e_e(std::istream& in); │ │ │ │ │ -106 │ │ │ │ │ -107 │ │ │ │ │ -120 static void _r_e_a_d_I_N_I_T_r_e_e(std::istream& in, _P_a_r_a_m_e_t_e_r_T_r_e_e& pt, │ │ │ │ │ -121 const std::string srcname = "stream", │ │ │ │ │ -122 bool overwrite = true); │ │ │ │ │ -123 │ │ │ │ │ -124 │ │ │ │ │ -135 static void _r_e_a_d_I_N_I_T_r_e_e(std::string file, _P_a_r_a_m_e_t_e_r_T_r_e_e& pt, bool overwrite │ │ │ │ │ -= true); │ │ │ │ │ -136 │ │ │ │ │ -143 static _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e _r_e_a_d_I_N_I_T_r_e_e(const std::string& file); │ │ │ │ │ -144 │ │ │ │ │ -146 │ │ │ │ │ -158 static void _r_e_a_d_O_p_t_i_o_n_s(int argc, char* argv [], _P_a_r_a_m_e_t_e_r_T_r_e_e& pt); │ │ │ │ │ -159 │ │ │ │ │ -177 static void _r_e_a_d_N_a_m_e_d_O_p_t_i_o_n_s(int argc, char* argv[], │ │ │ │ │ -178 _P_a_r_a_m_e_t_e_r_T_r_e_e& 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} // end namespace Dune │ │ │ │ │ -190 │ │ │ │ │ -191#endif // DUNE_PARAMETER_PARSER_HH │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_p_a_r_a_m_e_t_e_r_t_r_e_e_._h_h │ │ │ │ │ -A hierarchical structure of string parameters. │ │ │ │ │ +100 friend inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& s, │ │ │ │ │ +101 const _I_n_d_e_n_t& indent); │ │ │ │ │ +102 }; │ │ │ │ │ +103 │ │ │ │ │ +_1_0_5 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& s, const _I_n_d_e_n_t& indent) { │ │ │ │ │ +106 if(indent.parent) │ │ │ │ │ +107 s << *indent.parent; │ │ │ │ │ +108 for(unsigned i = 0; i < indent.level; ++i) │ │ │ │ │ +109 s << indent.basic_indent; │ │ │ │ │ +110 return s; │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +115} // namespace Dune │ │ │ │ │ +116 │ │ │ │ │ +117#endif // DUNE_COMMON_INDENT_HH │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ +Indent operator+(const std::string &newindent) const │ │ │ │ │ +create new indentation object with this one as parent │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_I_n_d_e_n_t │ │ │ │ │ +Indent(unsigned level_) │ │ │ │ │ +setup without parent and basic_indentation of two spaces │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ +Indent operator+(unsigned morelevel) const │ │ │ │ │ +create a copy of this indentation object with raised level │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_I_n_d_e_n_t │ │ │ │ │ +Indent(const Indent *parent_, unsigned level_) │ │ │ │ │ +setup with parent │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +Indent & operator++() │ │ │ │ │ +raise indentation level │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_I_n_d_e_n_t │ │ │ │ │ +Indent(const std::string &basic_indent_=" ", unsigned level_=0) │ │ │ │ │ +setup without parent │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ +Indent & operator--() │ │ │ │ │ +lower indentation level │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const Indent &indent) │ │ │ │ │ +write indentation to a stream │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t_:_:_I_n_d_e_n_t │ │ │ │ │ +Indent(const Indent *parent_, const std::string &basic_indent_=" ", unsigned │ │ │ │ │ +level_=1) │ │ │ │ │ +setup with parent │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_E_x_c_e_p_t_i_o_n │ │ │ │ │ -Base class for Dune-Exceptions. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e │ │ │ │ │ -Hierarchical structure of string parameters. │ │ │ │ │ -DDeeffiinniittiioonn parametertree.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_E_r_r_o_r │ │ │ │ │ -report parser error while reading ParameterTree │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_H_e_l_p_R_e_q_u_e_s_t │ │ │ │ │ -exception thrown if the user wants to see help string │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r │ │ │ │ │ -Parsers to set up a ParameterTree from various input sources. │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_:_:_r_e_a_d_O_p_t_i_o_n_s │ │ │ │ │ -static void readOptions(int argc, char *argv[], ParameterTree &pt) │ │ │ │ │ -parse command line options and build hierarchical ParameterTree structure │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.cc:159 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_:_:_r_e_a_d_I_N_I_T_r_e_e │ │ │ │ │ -static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite) │ │ │ │ │ -parse C++ stream │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.cc:74 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_T_r_e_e_P_a_r_s_e_r_:_:_r_e_a_d_N_a_m_e_d_O_p_t_i_o_n_s │ │ │ │ │ -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 │ │ │ │ │ -DDeeffiinniittiioonn parametertreeparser.cc:175 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_n_t │ │ │ │ │ +Utility class for handling nested indentation in output. │ │ │ │ │ +DDeeffiinniittiioonn indent.hh:53 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: gmpfield.hh File Reference │ │ │ │ +dune-common: parameterizedobject.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,53 +72,36 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
gmpfield.hh File Reference
│ │ │ │ +
parameterizedobject.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Wrapper for the GNU multiprecision (GMP) library. │ │ │ │ -More...

│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <string>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <gmpxx.h>
│ │ │ │ -#include <dune/common/promotiontraits.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

class  Dune::GMPField< precision >
 Number class for high precision floating point number using the GMP library mpf_class implementation. More...
 
struct  Dune::IsNumber< GMPField< precision > >
 
struct  Dune::PromotionTraits< GMPField< precision1 >, GMPField< precision2 > >
 
struct  Dune::PromotionTraits< GMPField< precision >, GMPField< precision > >
 
struct  Dune::PromotionTraits< GMPField< precision >, T >
 
struct  Dune::PromotionTraits< T, GMPField< precision > >
class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Wrapper for the GNU multiprecision (GMP) library.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,40 +1,23 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -gmpfield.hh File Reference │ │ │ │ │ -Wrapper for the GNU multiprecision (GMP) library. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_r_o_m_o_t_i_o_n_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +parameterizedobject.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _> │ │ │ │ │ -  Number class for high precision floating point number using the GMP │ │ │ │ │ - library mpf_class implementation. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_N_u_m_b_e_r_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_1_ _>_,_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_2_ _> │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_,_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _T_,_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Wrapper for the GNU multiprecision (GMP) library. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: gmpfield.hh Source File │ │ │ │ +dune-common: parameterizedobject.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,141 +74,178 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gmpfield.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_GMPFIELD_HH
│ │ │ │ -
6#define DUNE_GMPFIELD_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │ +
6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │
7
│ │ │ │ -
12#include <iostream>
│ │ │ │ -
13#include <string>
│ │ │ │ -
14#include <type_traits>
│ │ │ │ -
15
│ │ │ │ -
16#if HAVE_GMP || DOXYGEN
│ │ │ │ -
17
│ │ │ │ -
18#include <gmpxx.h>
│ │ │ │ -
19
│ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23namespace Dune
│ │ │ │ -
24{
│ │ │ │ -
25
│ │ │ │ -
30 template< unsigned int precision >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32 : public mpf_class
│ │ │ │ -
33 {
│ │ │ │ -
34 typedef mpf_class Base;
│ │ │ │ -
35
│ │ │ │ -
36 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
39 : Base(0,precision)
│ │ │ │ -
40 {}
│ │ │ │ -
│ │ │ │ -
41
│ │ │ │ -
│ │ │ │ -
45 GMPField ( const char* str )
│ │ │ │ -
46 : Base(str,precision)
│ │ │ │ -
47 {}
│ │ │ │ -
│ │ │ │ -
48
│ │ │ │ -
│ │ │ │ -
52 GMPField ( const std::string& str )
│ │ │ │ -
53 : Base(str,precision)
│ │ │ │ -
54 {}
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
58 template< class T,
│ │ │ │ -
59 typename EnableIf = typename std::enable_if<
│ │ │ │ -
60 std::is_convertible<T, mpf_class>::value>::type
│ │ │ │ -
61 >
│ │ │ │ -
│ │ │ │ -
62 GMPField ( const T &v )
│ │ │ │ -
63 : Base( v,precision )
│ │ │ │ -
64 {}
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
66 // type conversion operators
│ │ │ │ -
│ │ │ │ -
67 operator double () const
│ │ │ │ -
68 {
│ │ │ │ -
69 return this->get_d();
│ │ │ │ -
70 }
│ │ │ │ -
│ │ │ │ -
71
│ │ │ │ -
72 };
│ │ │ │ -
│ │ │ │ -
73
│ │ │ │ -
74 template <unsigned int precision>
│ │ │ │ -
│ │ │ │ -
75 struct IsNumber<GMPField<precision>>
│ │ │ │ -
76 : public std::integral_constant<bool, true> {
│ │ │ │ -
77 };
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
79 template< unsigned int precision1, unsigned int precision2 >
│ │ │ │ -
│ │ │ │ -
80 struct PromotionTraits<GMPField<precision1>, GMPField<precision2>>
│ │ │ │ -
81 {
│ │ │ │ -
82 typedef GMPField<(precision1 > precision2 ? precision1 : precision2)> PromotedType;
│ │ │ │ -
83 };
│ │ │ │ -
│ │ │ │ -
84
│ │ │ │ -
85 template< unsigned int precision >
│ │ │ │ -
│ │ │ │ -
86 struct PromotionTraits<GMPField<precision>,GMPField<precision>>
│ │ │ │ -
87 {
│ │ │ │ - │ │ │ │ -
89 };
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
91 template< unsigned int precision, class T >
│ │ │ │ -
│ │ │ │ -
92 struct PromotionTraits<GMPField<precision>, T>
│ │ │ │ -
93 {
│ │ │ │ - │ │ │ │ -
95 };
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
97 template< class T, unsigned int precision >
│ │ │ │ -
│ │ │ │ -
98 struct PromotionTraits<T, GMPField<precision>>
│ │ │ │ -
99 {
│ │ │ │ - │ │ │ │ -
101 };
│ │ │ │ -
│ │ │ │ -
102}
│ │ │ │ -
103
│ │ │ │ -
104#endif // HAVE_GMP
│ │ │ │ +
8#include <functional>
│ │ │ │ +
9#include <map>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16
│ │ │ │ +
34template<typename Signature,
│ │ │ │ +
35 typename KeyT = std::string>
│ │ │ │ + │ │ │ │ +
37
│ │ │ │ +
38template<typename TypeT,
│ │ │ │ +
39 typename KeyT,
│ │ │ │ +
40 typename... Args>
│ │ │ │ +
│ │ │ │ +
41class ParameterizedObjectFactory<TypeT(Args...), KeyT>
│ │ │ │ +
42{
│ │ │ │ +
43 public:
│ │ │ │ +
44
│ │ │ │ +
46 typedef KeyT Key;
│ │ │ │ +
47
│ │ │ │ +
49 using Type = TypeT;
│ │ │ │ +
50
│ │ │ │ +
51 protected:
│ │ │ │ +
52
│ │ │ │ +
53 using Creator = std::function<Type(Args...)>;
│ │ │ │ +
54
│ │ │ │ +
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
│ │ │ │ -
106#endif // #ifndef DUNE_GMPFIELD_HH
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition typetraits.hh:194
│ │ │ │ -
Number class for high precision floating point number using the GMP library mpf_class implementation.
Definition gmpfield.hh:33
│ │ │ │ -
GMPField(const T &v)
initialize from a compatible scalar type
Definition gmpfield.hh:62
│ │ │ │ -
GMPField()
Definition gmpfield.hh:38
│ │ │ │ -
GMPField(const std::string &str)
initialize from a string
Definition gmpfield.hh:52
│ │ │ │ -
GMPField(const char *str)
initialize from a string
Definition gmpfield.hh:45
│ │ │ │ -
GMPField< precision > PromotedType
Definition gmpfield.hh:88
│ │ │ │ -
GMPField< precision > PromotedType
Definition gmpfield.hh:94
│ │ │ │ -
GMPField< precision > PromotedType
Definition gmpfield.hh:100
│ │ │ │ -
Compute type of the result of an arithmetic operation involving two different number types.
Definition promotiontraits.hh:27
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,146 +1,200 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -gmpfield.hh │ │ │ │ │ +parameterizedobject.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +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_GMPFIELD_HH │ │ │ │ │ -6#define DUNE_GMPFIELD_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ +6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#if HAVE_GMP || DOXYGEN │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_r_o_m_o_t_i_o_n_t_r_a_i_t_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e │ │ │ │ │ -24{ │ │ │ │ │ -25 │ │ │ │ │ -30 template< unsigned int precision > │ │ │ │ │ -_3_1 class _G_M_P_F_i_e_l_d │ │ │ │ │ -32 : public mpf_class │ │ │ │ │ -33 { │ │ │ │ │ -34 typedef mpf_class Base; │ │ │ │ │ -35 │ │ │ │ │ -36 public: │ │ │ │ │ -_3_8 _G_M_P_F_i_e_l_d () │ │ │ │ │ -39 : Base(0,precision) │ │ │ │ │ -40 {} │ │ │ │ │ -41 │ │ │ │ │ -_4_5 _G_M_P_F_i_e_l_d ( const char* str ) │ │ │ │ │ -46 : Base(str,precision) │ │ │ │ │ -47 {} │ │ │ │ │ -48 │ │ │ │ │ -_5_2 _G_M_P_F_i_e_l_d ( const std::string& str ) │ │ │ │ │ -53 : Base(str,precision) │ │ │ │ │ -54 {} │ │ │ │ │ -55 │ │ │ │ │ -58 template< class T, │ │ │ │ │ -59 typename EnableIf = typename std::enable_if< │ │ │ │ │ -60 std::is_convertible::value>::type │ │ │ │ │ -61 > │ │ │ │ │ -_6_2 _G_M_P_F_i_e_l_d ( const T &v ) │ │ │ │ │ -63 : Base( v,precision ) │ │ │ │ │ -64 {} │ │ │ │ │ -65 │ │ │ │ │ -66 // type conversion operators │ │ │ │ │ -_6_7 operator double () const │ │ │ │ │ -68 { │ │ │ │ │ -69 return this->get_d(); │ │ │ │ │ -70 } │ │ │ │ │ -71 │ │ │ │ │ -72 }; │ │ │ │ │ -73 │ │ │ │ │ -74 template │ │ │ │ │ -_7_5 struct _I_s_N_u_m_b_e_r<_G_M_P_F_i_e_l_d> │ │ │ │ │ -76 : public std::integral_constant { │ │ │ │ │ -77 }; │ │ │ │ │ -78 │ │ │ │ │ -79 template< unsigned int precision1, unsigned int precision2 > │ │ │ │ │ -_8_0 struct _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s<_G_M_P_F_i_e_l_d, _G_M_P_F_i_e_l_d> │ │ │ │ │ -81 { │ │ │ │ │ -_8_2 typedef _G_M_P_F_i_e_l_d<(precision1 > precision2 ? precision1 : precision2)> │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -83 }; │ │ │ │ │ -84 │ │ │ │ │ -85 template< unsigned int precision > │ │ │ │ │ -_8_6 struct _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s<_G_M_P_F_i_e_l_d,_G_M_P_F_i_e_l_d> │ │ │ │ │ -87 { │ │ │ │ │ -_8_8 typedef _G_M_P_F_i_e_l_d_<_p_r_e_c_i_s_i_o_n_> _P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -89 }; │ │ │ │ │ -90 │ │ │ │ │ -91 template< unsigned int precision, class T > │ │ │ │ │ -_9_2 struct _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s<_G_M_P_F_i_e_l_d, T> │ │ │ │ │ -93 { │ │ │ │ │ -_9_4 typedef _G_M_P_F_i_e_l_d_<_p_r_e_c_i_s_i_o_n_> _P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -95 }; │ │ │ │ │ -96 │ │ │ │ │ -97 template< class T, unsigned int precision > │ │ │ │ │ -_9_8 struct _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s> │ │ │ │ │ -99 { │ │ │ │ │ -_1_0_0 typedef _G_M_P_F_i_e_l_d_<_p_r_e_c_i_s_i_o_n_> _P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -101 }; │ │ │ │ │ -102} │ │ │ │ │ -103 │ │ │ │ │ -104#endif // HAVE_GMP │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +13#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16 │ │ │ │ │ +34template │ │ │ │ │ +_3_6class _P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y; │ │ │ │ │ +37 │ │ │ │ │ +38template │ │ │ │ │ +_4_1class _P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y │ │ │ │ │ +42{ │ │ │ │ │ +43 public: │ │ │ │ │ +44 │ │ │ │ │ +_4_6 typedef KeyT _K_e_y; │ │ │ │ │ +47 │ │ │ │ │ +_4_9 using _T_y_p_e = TypeT; │ │ │ │ │ +50 │ │ │ │ │ +51 protected: │ │ │ │ │ +52 │ │ │ │ │ +_5_3 using _C_r_e_a_t_o_r = std::function<_T_y_p_e(Args...)>; │ │ │ │ │ +54 │ │ │ │ │ +55 template │ │ │ │ │ +_5_6 static constexpr auto _h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e(_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_1_>) │ │ │ │ │ +57 -> decltype( std::declval()(std::declval()...), std::true_type()) │ │ │ │ │ +58 { │ │ │ │ │ +59 return {}; │ │ │ │ │ +60 } │ │ │ │ │ +61 │ │ │ │ │ +62 template │ │ │ │ │ +_6_3 static constexpr std::false_type _h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e(_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_0_>) │ │ │ │ │ +64 { │ │ │ │ │ +65 return {}; │ │ │ │ │ +66 } │ │ │ │ │ +67 │ │ │ │ │ +68 public: │ │ │ │ │ +69 │ │ │ │ │ +_7_7 _T_y_p_e _c_r_e_a_t_e(_K_e_y const& key, Args ... args) const { │ │ │ │ │ +78 typename Registry::const_iterator i = registry_.find(key); │ │ │ │ │ +79 if (i == registry_.end()) { │ │ │ │ │ +80 _D_U_N_E___T_H_R_O_W(_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n, │ │ │ │ │ +81 "ParametrizedObjectFactory: key ``" << │ │ │ │ │ +82 key << "'' not registered"); │ │ │ │ │ +83 } │ │ │ │ │ +84 else return i->second(args...); │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +100 template │ │ │ │ │ +_1_0_1 void _d_e_f_i_n_e(_K_e_y const& key) │ │ │ │ │ +102 { │ │ │ │ │ +103 registry_[key] = DefaultCreator(); │ │ │ │ │ +104 } │ │ │ │ │ 105 │ │ │ │ │ -106#endif // #ifndef DUNE_GMPFIELD_HH │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_p_r_o_m_o_t_i_o_n_t_r_a_i_t_s_._h_h │ │ │ │ │ -Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ -number types. │ │ │ │ │ +119 template(_P_r_i_o_r_i_t_y_T_a_g_<_4_2_>()), int>:: │ │ │ │ │ +type = 0> │ │ │ │ │ +_1_2_1 void _d_e_f_i_n_e(_K_e_y 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> │ │ │ │ │ +_1_4_5 void _d_e_f_i_n_e(_K_e_y const& key, Impl&& t) │ │ │ │ │ +146 { │ │ │ │ │ +147 registry_[key] = [=](Args...) { return t;}; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 bool _c_o_n_t_a_i_n_s(_K_e_y const& key) const │ │ │ │ │ +151 { │ │ │ │ │ +152 return registry_.count(key); │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +155 private: │ │ │ │ │ +156 │ │ │ │ │ +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 │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_I_s_N_u_m_b_e_r │ │ │ │ │ -Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ -containers. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_G_M_P_F_i_e_l_d │ │ │ │ │ -Number class for high precision floating point number using the GMP library │ │ │ │ │ -mpf_class implementation. │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_G_M_P_F_i_e_l_d_:_:_G_M_P_F_i_e_l_d │ │ │ │ │ -GMPField(const T &v) │ │ │ │ │ -initialize from a compatible scalar type │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_G_M_P_F_i_e_l_d_:_:_G_M_P_F_i_e_l_d │ │ │ │ │ -GMPField() │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_G_M_P_F_i_e_l_d_:_:_G_M_P_F_i_e_l_d │ │ │ │ │ -GMPField(const std::string &str) │ │ │ │ │ -initialize from a string │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_G_M_P_F_i_e_l_d_:_:_G_M_P_F_i_e_l_d │ │ │ │ │ -GMPField(const char *str) │ │ │ │ │ -initialize from a string │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_,_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_ _>_:_: │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e │ │ │ │ │ -GMPField< precision > PromotedType │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_,_ _T_ _>_:_:_P_r_o_m_o_t_e_d_T_y_p_e │ │ │ │ │ -GMPField< precision > PromotedType │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_ _T_,_ _G_M_P_F_i_e_l_d_<_ _p_r_e_c_i_s_i_o_n_ _>_ _>_:_:_P_r_o_m_o_t_e_d_T_y_p_e │ │ │ │ │ -GMPField< precision > PromotedType │ │ │ │ │ -DDeeffiinniittiioonn gmpfield.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s │ │ │ │ │ -Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ -number types. │ │ │ │ │ -DDeeffiinniittiioonn promotiontraits.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_S_t_a_t_e_E_x_c_e_p_t_i_o_n │ │ │ │ │ +Default exception if a function was called while the object is not in a valid │ │ │ │ │ +state for that function... │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y │ │ │ │ │ +A factory class for parameterized objects. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_C_r_e_a_t_o_r │ │ │ │ │ +std::function< Type(Args...)> Creator │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e │ │ │ │ │ +static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype │ │ │ │ │ +(std::declval< F >()(std::declval< Args >()...), std::true_type()) │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_T_y_p_e │ │ │ │ │ +TypeT Type │ │ │ │ │ +The type of objects created by the factory. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ +void define(Key const &key, Impl &&t) │ │ │ │ │ +Registers a new type with a key. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_K_e_y │ │ │ │ │ +KeyT Key │ │ │ │ │ +The typ of the keys. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ +Type create(Key const &key, Args ... args) const │ │ │ │ │ +Creates an object identified by a key from given parameters. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ +void define(Key const &key) │ │ │ │ │ +Registers a new type with a key. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_d_e_f_i_n_e │ │ │ │ │ +void define(Key const &key, F &&f) │ │ │ │ │ +Registers a new creator with a key. │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_h_a_s___p_r_o_p_e_r___s_i_g_n_a_t_u_r_e │ │ │ │ │ +static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >) │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_m_e_t_e_r_i_z_e_d_O_b_j_e_c_t_F_a_c_t_o_r_y_<_ _T_y_p_e_T_(_A_r_g_s_._._._)_,_ _K_e_y_T_ _>_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ +bool contains(Key const &key) const │ │ │ │ │ +DDeeffiinniittiioonn parameterizedobject.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: streamoperators.hh File Reference │ │ │ │ +dune-common: debugstream.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,52 +70,64 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
streamoperators.hh File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
debugstream.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <array>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ +
#include <iostream>
│ │ │ │ +#include <stack>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
 
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
 
class  Dune::DebugStreamError
 standard exception for the debugstream More...
 
class  Dune::StreamWrap
 
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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

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

│ │ │ │ +Typedefs

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

Detailed Description

│ │ │ │ -

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

│ │ │ │ +

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 {} │ │ │ │ │ @@ -1,35 +1,47 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -streamoperators.hh File Reference │ │ │ │ │ -Implementation of stream operators for std::array and std::tuple. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ │ +debugstream.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _D_e_b_u_g_ _o_u_t_p_u_t │ │ │ │ │ +Defines several output streams for messages of different importance. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l_<_ _c_u_r_r_e_n_t_,_ _t_h_r_e_s_h_o_l_d_ _> │ │ │ │ │ +  Greater or equal template test. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s_<_ _c_u_r_r_e_n_t_,_ _m_a_s_k_ _> │ │ │ │ │ +  activate if current and mask have common bits switched on. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r │ │ │ │ │ +  standard exception for the debugstream _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e │ │ │ │ │ +  Intermediate class to implement tie-operation of _D_e_b_u_g_S_t_r_e_a_m. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_<_ _t_h_i_s_l_e_v_e_l_,_ _d_l_e_v_e_l_,_ _a_l_e_v_e_l_,_ _a_c_t_i_v_a_t_o_r_ _> │ │ │ │ │ +  Generic class to implement debug output streams. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -Stream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (Stream &stream, const std::tuple< Ts... > &t) │ │ │ │ │ -  Print a std::tuple. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -Stream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_> (Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ -  Read a std::tuple. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -Stream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (Stream &stream, const std::array< T, N > &a) │ │ │ │ │ -  Print a std::array. │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +typedef unsigned int  _D_u_n_e_:_:_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ +  Type for debug levels. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implementation of stream operators for std::array and std::tuple. │ │ │ │ │ +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 _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: streamoperators.hh Source File │ │ │ │ +dune-common: debugstream.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,83 +74,333 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
streamoperators.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_STREAMOPERATORS_HH
│ │ │ │ -
7#define DUNE_STREAMOPERATORS_HH
│ │ │ │ +
6#ifndef DUNE_DEBUGSTREAM_HH
│ │ │ │ +
7#define DUNE_DEBUGSTREAM_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
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,81 +1,375 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -streamoperators.hh │ │ │ │ │ +debugstream.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_STREAMOPERATORS_HH │ │ │ │ │ -7#define DUNE_STREAMOPERATORS_HH │ │ │ │ │ +6#ifndef DUNE_DEBUGSTREAM_HH │ │ │ │ │ +7#define DUNE_DEBUGSTREAM_HH │ │ │ │ │ 8 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e │ │ │ │ │ -20{ │ │ │ │ │ -27 template │ │ │ │ │ -_2_8 inline Stream& _o_p_e_r_a_t_o_r_<_<(Stream& stream, const std::tuple& t) │ │ │ │ │ -29 { │ │ │ │ │ -30 stream<<"["; │ │ │ │ │ -31 if(sizeof...(Ts)>0) │ │ │ │ │ -32 { │ │ │ │ │ -33 _H_y_b_r_i_d_:_:_f_o_r_E_a_c_h(std::make_index_sequence{}, │ │ │ │ │ -34 [&](auto i){stream<(t)<<",";}); │ │ │ │ │ -35 stream<(t); │ │ │ │ │ -36 } │ │ │ │ │ -37 stream<<"]"; │ │ │ │ │ -38 return stream; │ │ │ │ │ -39 } │ │ │ │ │ -40 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 inline Stream& _o_p_e_r_a_t_o_r_>_>(Stream& stream, std::tuple& t) │ │ │ │ │ -44 { │ │ │ │ │ -45 _H_y_b_r_i_d_:_:_f_o_r_E_a_c_h(std::make_index_sequence{}, │ │ │ │ │ -46 [&](auto i){stream>>std::get(t);}); │ │ │ │ │ -47 return stream; │ │ │ │ │ -48 } │ │ │ │ │ -49 │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 inline Stream& _o_p_e_r_a_t_o_r_<_<(Stream& stream, const std::array& a) │ │ │ │ │ -53 { │ │ │ │ │ -54 stream<<"["; │ │ │ │ │ -55 if(N>0) │ │ │ │ │ -56 { │ │ │ │ │ -57 for(std::size_t i=0; i_> │ │ │ │ │ -Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ -Read a std::tuple. │ │ │ │ │ -DDeeffiinniittiioonn streamoperators.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_H_y_b_r_i_d_:_:_f_o_r_E_a_c_h │ │ │ │ │ -constexpr void forEach(Range &&range, F &&f) │ │ │ │ │ -Range based for loop. │ │ │ │ │ -DDeeffiinniittiioonn hybridutilities.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +17 │ │ │ │ │ +18namespace _D_u_n_e { │ │ │ │ │ +19 │ │ │ │ │ +_1_1_8 typedef unsigned int _D_e_b_u_g_L_e_v_e_l; │ │ │ │ │ +119 │ │ │ │ │ +129 template │ │ │ │ │ +_1_3_0 struct _g_r_e_a_t_e_r___o_r___e_q_u_a_l { │ │ │ │ │ +_1_3_1 constexpr static bool _v_a_l_u_e = (current >= threshold); │ │ │ │ │ +132 }; │ │ │ │ │ +133 │ │ │ │ │ +134 │ │ │ │ │ +141 template │ │ │ │ │ +_1_4_2 struct _c_o_m_m_o_n___b_i_t_s { │ │ │ │ │ +_1_4_3 constexpr static bool _v_a_l_u_e = ((current & mask) != 0); │ │ │ │ │ +144 }; │ │ │ │ │ +145 │ │ │ │ │ +146 │ │ │ │ │ +_1_4_8 class _D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r : public _I_O_E_r_r_o_r {}; │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 class _S_t_r_e_a_m_W_r_a_p { │ │ │ │ │ +151 public: │ │ │ │ │ +_1_5_2 _S_t_r_e_a_m_W_r_a_p(std::ostream& _out) : _o_u_t(_out) { } │ │ │ │ │ +_1_5_3 std::ostream& _o_u_t; │ │ │ │ │ +_1_5_4 _S_t_r_e_a_m_W_r_a_p *_n_e_x_t; │ │ │ │ │ +155 }; │ │ │ │ │ +156 │ │ │ │ │ +_1_5_8 class _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e { │ │ │ │ │ +159 // !!! should be protected somehow but that won't be easy │ │ │ │ │ +160 public: │ │ │ │ │ +_1_6_2 _S_t_r_e_a_m_W_r_a_p* _c_u_r_r_e_n_t; │ │ │ │ │ +163 │ │ │ │ │ +_1_6_5 bool ___a_c_t_i_v_e; │ │ │ │ │ +166 │ │ │ │ │ +_1_6_8 bool ___t_i_e_d; │ │ │ │ │ +169 │ │ │ │ │ +_1_7_1 unsigned int ___t_i_e_d___s_t_r_e_a_m_s; │ │ │ │ │ +172 }; │ │ │ │ │ +173 │ │ │ │ │ +188 template <_D_e_b_u_g_L_e_v_e_l thislevel = 1, │ │ │ │ │ +189 _D_e_b_u_g_L_e_v_e_l dlevel = 1, │ │ │ │ │ +190 _D_e_b_u_g_L_e_v_e_l alevel = 1, │ │ │ │ │ +191 template class activator = _g_r_e_a_t_e_r___o_r___e_q_u_a_l> │ │ │ │ │ +_1_9_2 class _D_e_b_u_g_S_t_r_e_a_m : public _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e { │ │ │ │ │ +193 public: │ │ │ │ │ +_1_9_9 _D_e_b_u_g_S_t_r_e_a_m(std::ostream& out = std::cerr) { │ │ │ │ │ +200 // start a new list of streams │ │ │ │ │ +201 _c_u_r_r_e_n_t = new _S_t_r_e_a_m_W_r_a_p(out); │ │ │ │ │ +202 _c_u_r_r_e_n_t->_n_e_x_t = 0; │ │ │ │ │ +203 │ │ │ │ │ +204 // check if we are above the default activation level │ │ │ │ │ +205 ___a_c_t_i_v_e = activator::value; │ │ │ │ │ +206 │ │ │ │ │ +207 // we're not tied to another DebugStream │ │ │ │ │ +208 ___t_i_e_d = false; │ │ │ │ │ +209 │ │ │ │ │ +210 // no child streams yet │ │ │ │ │ +211 ___t_i_e_d___s_t_r_e_a_m_s = 0; │ │ │ │ │ +212 } │ │ │ │ │ +213 │ │ │ │ │ +_2_1_9 _D_e_b_u_g_S_t_r_e_a_m (_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e& master, │ │ │ │ │ +220 std::ostream& fallback = std::cerr) │ │ │ │ │ +221 { │ │ │ │ │ +222 // start a new list of streams │ │ │ │ │ +223 _c_u_r_r_e_n_t = new _S_t_r_e_a_m_W_r_a_p(fallback); │ │ │ │ │ +224 _c_u_r_r_e_n_t->_n_e_x_t = 0; │ │ │ │ │ +225 │ │ │ │ │ +226 // check if we are above the default activation level │ │ │ │ │ +227 ___a_c_t_i_v_e = activator::value; │ │ │ │ │ +228 ___t_i_e_d___s_t_r_e_a_m_s = 0; │ │ │ │ │ +229 │ │ │ │ │ +230 // tie to the provided stream │ │ │ │ │ +231 ___t_i_e_d = true; │ │ │ │ │ +232 tiedstate = &master; │ │ │ │ │ +233 tiedstate->___t_i_e_d___s_t_r_e_a_m_s++; │ │ │ │ │ +234 } │ │ │ │ │ +235 │ │ │ │ │ +_2_4_3 _~_D_e_b_u_g_S_t_r_e_a_m() │ │ │ │ │ +244 { │ │ │ │ │ +245 // untie │ │ │ │ │ +246 if (___t_i_e_d) │ │ │ │ │ +247 tiedstate->___t_i_e_d___s_t_r_e_a_m_s--; │ │ │ │ │ +248 else { │ │ │ │ │ +249 // check if somebody still ties to us... │ │ │ │ │ +250 if (___t_i_e_d___s_t_r_e_a_m_s != 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 (_c_u_r_r_e_n_t != 0) { │ │ │ │ │ +259 _S_t_r_e_a_m_W_r_a_p *s = _c_u_r_r_e_n_t; │ │ │ │ │ +260 _c_u_r_r_e_n_t = _c_u_r_r_e_n_t->_n_e_x_t; │ │ │ │ │ +261 delete s; │ │ │ │ │ +262 } │ │ │ │ │ +263 } │ │ │ │ │ +264 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(const T data) { │ │ │ │ │ +268 // remove the following code if stream wasn't compiled active │ │ │ │ │ +269 if (activator::value) { │ │ │ │ │ +270 if (! ___t_i_e_d) { │ │ │ │ │ +271 if (___a_c_t_i_v_e) │ │ │ │ │ +272 _c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ +273 } else { │ │ │ │ │ +274 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ +275 tiedstate->_c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ +276 } │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +279 return *this; │ │ │ │ │ +280 } │ │ │ │ │ +281 │ │ │ │ │ +_2_8_9 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(const int data) { │ │ │ │ │ +290 // remove the following code if stream wasn't compiled active │ │ │ │ │ +291 if (activator::value) { │ │ │ │ │ +292 if (! ___t_i_e_d) { │ │ │ │ │ +293 if (___a_c_t_i_v_e) │ │ │ │ │ +294 _c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ +295 } else { │ │ │ │ │ +296 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ +297 tiedstate->_c_u_r_r_e_n_t->_o_u_t << data; │ │ │ │ │ +298 } │ │ │ │ │ +299 } │ │ │ │ │ +300 │ │ │ │ │ +301 return *this; │ │ │ │ │ +302 } │ │ │ │ │ +303 │ │ │ │ │ +_3_0_5 _D_e_b_u_g_S_t_r_e_a_m& _o_p_e_r_a_t_o_r_<_<(std::ostream& (*f)(std::ostream&)) { │ │ │ │ │ +306 if (activator::value) { │ │ │ │ │ +307 if (! ___t_i_e_d) { │ │ │ │ │ +308 if (___a_c_t_i_v_e) │ │ │ │ │ +309 f(_c_u_r_r_e_n_t->_o_u_t); │ │ │ │ │ +310 } else { │ │ │ │ │ +311 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ +312 f(tiedstate->_c_u_r_r_e_n_t->_o_u_t); │ │ │ │ │ +313 } │ │ │ │ │ +314 } │ │ │ │ │ +315 │ │ │ │ │ +316 return *this; │ │ │ │ │ +317 } │ │ │ │ │ +318 │ │ │ │ │ +_3_2_0 _D_e_b_u_g_S_t_r_e_a_m& _f_l_u_s_h() { │ │ │ │ │ +321 if (activator::value) { │ │ │ │ │ +322 if (! ___t_i_e_d) { │ │ │ │ │ +323 if (___a_c_t_i_v_e) │ │ │ │ │ +324 _c_u_r_r_e_n_t->_o_u_t.flush(); │ │ │ │ │ +325 } else { │ │ │ │ │ +326 if (___a_c_t_i_v_e && tiedstate->___a_c_t_i_v_e) │ │ │ │ │ +327 tiedstate->_c_u_r_r_e_n_t->_o_u_t.flush(); │ │ │ │ │ +328 } │ │ │ │ │ +329 } │ │ │ │ │ +330 │ │ │ │ │ +331 return *this; │ │ │ │ │ +332 } │ │ │ │ │ +333 │ │ │ │ │ +_3_3_5 void _p_u_s_h(bool b) { │ │ │ │ │ +336 // are we at all active? │ │ │ │ │ +337 if (activator::value) { │ │ │ │ │ +338 _actstack.push(___a_c_t_i_v_e); │ │ │ │ │ +339 ___a_c_t_i_v_e = b; │ │ │ │ │ +340 } else { │ │ │ │ │ +341 // stay off │ │ │ │ │ +342 _actstack.push(false); │ │ │ │ │ +343 } │ │ │ │ │ +344 } │ │ │ │ │ +345 │ │ │ │ │ +_3_4_9 void _p_o_p() { │ │ │ │ │ +350 if (_actstack.empty()) │ │ │ │ │ +351 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "No previous activation setting!"); │ │ │ │ │ +352 │ │ │ │ │ +353 ___a_c_t_i_v_e = _actstack.top(); │ │ │ │ │ +354 _actstack.pop(); │ │ │ │ │ +355 } │ │ │ │ │ +356 │ │ │ │ │ +_3_6_3 bool _a_c_t_i_v_e() const { │ │ │ │ │ +364 return activator::value && ___a_c_t_i_v_e; │ │ │ │ │ +365 } │ │ │ │ │ +366 │ │ │ │ │ +_3_7_1 void _a_t_t_a_c_h(std::ostream& stream) { │ │ │ │ │ +372 if (___t_i_e_d) │ │ │ │ │ +373 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot attach to a tied stream!"); │ │ │ │ │ +374 │ │ │ │ │ +375 _S_t_r_e_a_m_W_r_a_p* newcurr = new _S_t_r_e_a_m_W_r_a_p(stream); │ │ │ │ │ +376 newcurr->_n_e_x_t = _c_u_r_r_e_n_t; │ │ │ │ │ +377 _c_u_r_r_e_n_t = newcurr; │ │ │ │ │ +378 } │ │ │ │ │ +379 │ │ │ │ │ +_3_8_3 void _d_e_t_a_c_h() { │ │ │ │ │ +384 if (_c_u_r_r_e_n_t->_n_e_x_t == 0) │ │ │ │ │ +385 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot detach initial stream!"); │ │ │ │ │ +386 if (___t_i_e_d) │ │ │ │ │ +387 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot detach a tied stream!"); │ │ │ │ │ +388 │ │ │ │ │ +389 _S_t_r_e_a_m_W_r_a_p* old = _c_u_r_r_e_n_t; │ │ │ │ │ +390 _c_u_r_r_e_n_t = _c_u_r_r_e_n_t->_n_e_x_t; │ │ │ │ │ +391 delete old; │ │ │ │ │ +392 } │ │ │ │ │ +393 │ │ │ │ │ +_3_9_7 void _t_i_e(_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e& to) { │ │ │ │ │ +398 if (to.___t_i_e_d) │ │ │ │ │ +399 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot tie to an already tied stream!"); │ │ │ │ │ +400 if (___t_i_e_d) │ │ │ │ │ +401 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Stream already tied: untie first!"); │ │ │ │ │ +402 │ │ │ │ │ +403 ___t_i_e_d = true; │ │ │ │ │ +404 tiedstate = &to; │ │ │ │ │ +405 │ │ │ │ │ +406 // tell master class │ │ │ │ │ +407 tiedstate->___t_i_e_d___s_t_r_e_a_m_s++; │ │ │ │ │ +408 } │ │ │ │ │ +409 │ │ │ │ │ +_4_1_3 void _u_n_t_i_e() { │ │ │ │ │ +414 if(! ___t_i_e_d) │ │ │ │ │ +415 _D_U_N_E___T_H_R_O_W(_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r, "Cannot untie, stream is not tied!"); │ │ │ │ │ +416 │ │ │ │ │ +417 tiedstate->___t_i_e_d___s_t_r_e_a_m_s--; │ │ │ │ │ +418 ___t_i_e_d = false; │ │ │ │ │ +419 tiedstate = 0; │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +422 private: │ │ │ │ │ +424 _D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e* tiedstate; │ │ │ │ │ +425 │ │ │ │ │ +430 std::stack _actstack; │ │ │ │ │ +431 }; │ │ │ │ │ +432 │ │ │ │ │ +434} │ │ │ │ │ +435 │ │ │ │ │ +436 │ │ │ │ │ +437#endif │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ +StreamWrap(std::ostream &_out) │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ +DebugStream(std::ostream &out=std::cerr) │ │ │ │ │ +Create a DebugStream and set initial output stream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_u_n_t_i_e │ │ │ │ │ +void untie() │ │ │ │ │ +Untie stream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:413 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_f_l_u_s_h │ │ │ │ │ +DebugStream & flush() │ │ │ │ │ +pass on flush to underlying output stream │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:320 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_a_t_t_a_c_h │ │ │ │ │ +void attach(std::ostream &stream) │ │ │ │ │ +set output to a different stream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_d_e_t_a_c_h │ │ │ │ │ +void detach() │ │ │ │ │ +detach current output stream and restore to previous stream │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:383 │ │ │ │ │ +_D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s_:_:_v_a_l_u_e │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_o_u_t │ │ │ │ │ +std::ostream & out │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_p_o_p │ │ │ │ │ +void pop() │ │ │ │ │ +restore previously set activation flag │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:349 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_a_c_t_i_v_e │ │ │ │ │ +bool active() const │ │ │ │ │ +reports if this stream will produce output │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:363 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___a_c_t_i_v_e │ │ │ │ │ +bool _active │ │ │ │ │ +flag to switch output during runtime │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___t_i_e_d___s_t_r_e_a_m_s │ │ │ │ │ +unsigned int _tied_streams │ │ │ │ │ +how many streams are tied to this state │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_t_i_e │ │ │ │ │ +void tie(DebugStreamState &to) │ │ │ │ │ +Tie a stream to this one. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:397 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_p_u_s_h │ │ │ │ │ +void push(bool b) │ │ │ │ │ +set activation flag and store old value │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:335 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ +unsigned int DebugLevel │ │ │ │ │ +Type for debug levels. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:___t_i_e_d │ │ │ │ │ +bool _tied │ │ │ │ │ +are we tied to another DebugStream? │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e_:_:_c_u_r_r_e_n_t │ │ │ │ │ +StreamWrap * current │ │ │ │ │ +current output stream and link to possibly pushed old output streams │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +DebugStream & operator<<(const T data) │ │ │ │ │ +Generic types are passed on to current output stream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l_:_:_v_a_l_u_e │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_~_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ +~DebugStream() │ │ │ │ │ +Destroy stream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:243 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ +DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr) │ │ │ │ │ +Create a DebugStream and directly tie to another DebugStream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +DebugStream & operator<<(const int data) │ │ │ │ │ +explicit specialization so that enums can be printed │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +DebugStream & operator<<(std::ostream &(*f)(std::ostream &)) │ │ │ │ │ +pass on manipulators to underlying output stream │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:305 │ │ │ │ │ +_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p_:_:_n_e_x_t │ │ │ │ │ +StreamWrap * next │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:154 │ │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_g_r_e_a_t_e_r___o_r___e_q_u_a_l │ │ │ │ │ +Greater or equal template test. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_c_o_m_m_o_n___b_i_t_s │ │ │ │ │ +activate if current and mask have common bits switched on. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_E_r_r_o_r │ │ │ │ │ +standard exception for the debugstream │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m_S_t_a_t_e │ │ │ │ │ +Intermediate class to implement tie-operation of DebugStream. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_D_e_b_u_g_S_t_r_e_a_m │ │ │ │ │ +Generic class to implement debug output streams. │ │ │ │ │ +DDeeffiinniittiioonn debugstream.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_I_O_E_r_r_o_r │ │ │ │ │ +Default exception class for I/O errors. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:231 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: proxymemberaccess.hh File Reference │ │ │ │ +dune-common: hash.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,42 +70,180 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ +Macros | │ │ │ │ Functions
│ │ │ │ -
proxymemberaccess.hh File Reference
│ │ │ │ +
hash.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

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

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::hash< T >
 Functor for hashing objects of type T. 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.
 
#define DUNE_HASH_TEMPLATE_ARGS(...)
 Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
 
#define DUNE_HASH_TYPE(...)
 Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

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

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
│ │ │ │ +

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.

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,28 +1,129 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -proxymemberaccess.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _C_+_+_ _u_t_i_l_i_t_i_e_s_ _a_n_d_ _b_a_c_k_p_o_r_t_s │ │ │ │ │ -infrastructure for supporting operator->() on both references and proxies │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +hash.hh File Reference │ │ │ │ │ +Support for calculating hash values of objects. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_h_a_s_h_<_ _T_ _> │ │ │ │ │ +  Functor for hashing objects of type T. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___D_E_F_I_N_E___H_A_S_H(template_args, type) │ │ │ │ │ +  Defines the required struct specialization to make type hashable via │ │ │ │ │ + _D_u_n_e_:_:_h_a_s_h. │ │ │ │ │ +  │ │ │ │ │ +#define  _D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S(...) │ │ │ │ │ +  Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ +  │ │ │ │ │ +#define  _D_U_N_E___H_A_S_H___T_Y_P_E(...) │ │ │ │ │ +  Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ template │ │ │ │ │ -pointer_or_proxy_holder  _D_u_n_e_:_:_h_a_n_d_l_e___p_r_o_x_y___m_e_m_b_e_r___a_c_c_e_s_s (T &&t) │ │ │ │ │ -  Transparent support for providing member access to │ │ │ │ │ - both lvalues and rvalues (temporary proxies). │ │ │ │ │ + void  _D_u_n_e_:_:_h_a_s_h___c_o_m_b_i_n_e (std::size_t &seed, const T &arg) │ │ │ │ │ +  Calculates the hash value of arg and combines it in-place with │ │ │ │ │ + seed. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::size_t  _D_u_n_e_:_:_h_a_s_h___r_a_n_g_e (It first, It last) │ │ │ │ │ +  Hashes all elements in the range [first,last) and returns the │ │ │ │ │ + combined hash. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_h_a_s_h___r_a_n_g_e (std::size_t &seed, It first, It last) │ │ │ │ │ +  Hashes all elements in the range [first,last) and combines the │ │ │ │ │ + hashes in-place with seed. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -infrastructure for supporting operator->() on both references and proxies │ │ │ │ │ +Support for calculating hash values of objects. │ │ │ │ │ +This file provides the functor _D_u_n_e_:_:_h_a_s_h to calculate hash values and some │ │ │ │ │ +infrastructure to simplify extending _D_u_n_e_:_:_h_a_s_h for user-defined types, │ │ │ │ │ +independent of the actual underlying implementation. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__DDEEFFIINNEE__HHAASSHH ********** │ │ │ │ │ +#define DUNE_DEFINE_HASH (   template_args, │ │ │ │ │ +   type  │ │ │ │ │ + ) │ │ │ │ │ +Defines the required struct specialization to make type hashable via _D_u_n_e_:_: │ │ │ │ │ +_h_a_s_h. │ │ │ │ │ +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 _D_u_n_e_:_:_h_a_s_h, 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 │ │ │ │ │ +_D_U_N_E___D_E_F_I_N_E___H_A_S_H(_D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S(typename A, int i),_D_U_N_E___H_A_S_H___T_Y_P_E │ │ │ │ │ +(Foo)) │ │ │ │ │ +_D_U_N_E___D_E_F_I_N_E___H_A_S_H │ │ │ │ │ +#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ +Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ +hash. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:100 │ │ │ │ │ +_D_U_N_E___H_A_S_H___T_Y_P_E │ │ │ │ │ +#define DUNE_HASH_TYPE(...) │ │ │ │ │ +Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:117 │ │ │ │ │ +_D_U_N_E___H_A_S_H___T_E_M_P_L_A_T_E___A_R_G_S │ │ │ │ │ +#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ +Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:109 │ │ │ │ │ + Warning │ │ │ │ │ + As the specialization has to be placed in the original namespace of the │ │ │ │ │ + hash struct (e.g. std), this macro mmuusstt 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. │ │ │ │ │ +********** _?◆_? DDUUNNEE__HHAASSHH__TTEEMMPPLLAATTEE__AARRGGSS ********** │ │ │ │ │ +#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. │ │ │ │ │ +********** _?◆_? DDUUNNEE__HHAASSHH__TTYYPPEE ********** │ │ │ │ │ +#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 _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: proxymemberaccess.hh Source File │ │ │ │ +dune-common: hash.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,107 +74,289 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
proxymemberaccess.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_COMMON_PROXYMEMBERACCESS_HH
│ │ │ │ -
6#define DUNE_COMMON_PROXYMEMBERACCESS_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_HASH_HH
│ │ │ │ +
6#define DUNE_COMMON_HASH_HH
│ │ │ │
7
│ │ │ │ -
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 {}
│ │ │ │ +
8#include <functional>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
24// ********************************************************************************
│ │ │ │ +
25// Doxygen documentation
│ │ │ │ +
26// ********************************************************************************
│ │ │ │ +
27
│ │ │ │ +
28#ifdef DOXYGEN
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune {
│ │ │ │
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
│ │ │ │ +
33
│ │ │ │ +
38 template<typename T>
│ │ │ │ +
│ │ │ │ +
39 struct hash
│ │ │ │ +
40 {
│ │ │ │ +
41
│ │ │ │ +
│ │ │ │ +
43 std::size_t operator()(const T& t) const
│ │ │ │ +
44 {
│ │ │ │ +
45 return hash(t);
│ │ │ │ +
46 }
│ │ │ │ +
│ │ │ │
47
│ │ │ │ +
48 };
│ │ │ │ +
│ │ │ │
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 }
│ │ │ │ +
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#endif // DOXYGEN
│ │ │ │ +
119#else // DOXYGEN - hide all the ugly implementation
│ │ │ │
120
│ │ │ │ -
121} // namespace Dune
│ │ │ │ +
121
│ │ │ │
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.
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,110 +1,329 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -proxymemberaccess.hh │ │ │ │ │ +hash.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_PROXYMEMBERACCESS_HH │ │ │ │ │ -6#define DUNE_COMMON_PROXYMEMBERACCESS_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_HASH_HH │ │ │ │ │ +6#define DUNE_COMMON_HASH_HH │ │ │ │ │ 7 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ │ -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(_s_t_d::move(t)) │ │ │ │ │ -30 {} │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +11 │ │ │ │ │ +24/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +25// Doxygen documentation │ │ │ │ │ +26/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +27 │ │ │ │ │ +28#ifdef DOXYGEN │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e { │ │ │ │ │ 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 │ │ │ │ │ +33 │ │ │ │ │ +38 template │ │ │ │ │ +_3_9 struct _h_a_s_h │ │ │ │ │ +40 { │ │ │ │ │ +41 │ │ │ │ │ +_4_3 std::size_t _o_p_e_r_a_t_o_r_(_)(const T& t) const │ │ │ │ │ +44 { │ │ │ │ │ +45 return _h_a_s_h(t); │ │ │ │ │ +46 } │ │ │ │ │ 47 │ │ │ │ │ +48 }; │ │ │ │ │ 49 │ │ │ │ │ -79 template │ │ │ │ │ -80 pointer_or_proxy_holder │ │ │ │ │ -_8_1 _h_a_n_d_l_e___p_r_o_x_y___m_e_m_b_e_r___a_c_c_e_s_s(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 _h_a_n_d_l_e___p_r_o_x_y___m_e_m_b_e_r___a_c_c_e_s_s(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 _h_a_n_d_l_e___p_r_o_x_y___m_e_m_b_e_r___a_c_c_e_s_s(T&& target) │ │ │ │ │ -115 { │ │ │ │ │ -116 return {std::forward(target)}; │ │ │ │ │ -117 } │ │ │ │ │ +50} │ │ │ │ │ +51 │ │ │ │ │ +53 │ │ │ │ │ +_1_0_0#define DUNE_DEFINE_HASH(template_args,type) │ │ │ │ │ +101 │ │ │ │ │ +102 │ │ │ │ │ +104 │ │ │ │ │ +_1_0_9#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ +110 │ │ │ │ │ +112 │ │ │ │ │ +_1_1_7#define DUNE_HASH_TYPE(...) │ │ │ │ │ 118 │ │ │ │ │ -119#endif // DOXYGEN │ │ │ │ │ +119#else // DOXYGEN - hide all the ugly implementation │ │ │ │ │ 120 │ │ │ │ │ -121} // namespace Dune │ │ │ │ │ +121 │ │ │ │ │ 122 │ │ │ │ │ -123#endif // DUNE_COMMON_PROXYMEMBERACCESS_HH │ │ │ │ │ -_D_u_n_e_:_:_h_a_n_d_l_e___p_r_o_x_y___m_e_m_b_e_r___a_c_c_e_s_s │ │ │ │ │ -pointer_or_proxy_holder handle_proxy_member_access(T &&t) │ │ │ │ │ -Transparent support for providing member access to both lvalues and rvalues │ │ │ │ │ -(temporary proxies). │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +123/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +124// C++11 support │ │ │ │ │ +125/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +126 │ │ │ │ │ +127// import std::hash into Dune namespace │ │ │ │ │ +128namespace _D_u_n_e { │ │ │ │ │ +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 │ │ │ │ │ +196 │ │ │ │ │ +197/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +198// Some utility functions for combining hashes of member variables. │ │ │ │ │ +199/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ +200 │ │ │ │ │ +201namespace _D_u_n_e { │ │ │ │ │ +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 _D_u_n_e_:_:_h_a_s_h_<_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 │ │ │ │ │ +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 _D_u_n_e_:_:_h_a_s_h_<_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 │ │ │ │ │ +_3_0_7 inline void _h_a_s_h___c_o_m_b_i_n_e(std::size_t& seed, const T& arg) │ │ │ │ │ +308 { │ │ │ │ │ +309 hash_combiner()(seed,arg); │ │ │ │ │ +310 } │ │ │ │ │ +311 │ │ │ │ │ +313 │ │ │ │ │ +321 template │ │ │ │ │ +_3_2_2 inline std::size_t _h_a_s_h___r_a_n_g_e(It first, It last) │ │ │ │ │ +323 { │ │ │ │ │ +324 std::size_t seed = 0; │ │ │ │ │ +325 for (; first != last; ++first) │ │ │ │ │ +326 { │ │ │ │ │ +327 _h_a_s_h___c_o_m_b_i_n_e(seed,*first); │ │ │ │ │ +328 } │ │ │ │ │ +329 return seed; │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +333 │ │ │ │ │ +340 template │ │ │ │ │ +_3_4_1 inline void _h_a_s_h___r_a_n_g_e(std::size_t& seed, It first, It last) │ │ │ │ │ +342 { │ │ │ │ │ +343 for (; first != last; ++first) │ │ │ │ │ +344 { │ │ │ │ │ +345 _h_a_s_h___c_o_m_b_i_n_e(seed,*first); │ │ │ │ │ +346 } │ │ │ │ │ +347 } │ │ │ │ │ +348 │ │ │ │ │ +349} // end namespace Dune │ │ │ │ │ +350 │ │ │ │ │ +351#endif // DUNE_COMMON_HASH_HH │ │ │ │ │ +_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_h_a_s_h___r_a_n_g_e │ │ │ │ │ +std::size_t hash_range(It first, It last) │ │ │ │ │ +Hashes all elements in the range [first,last) and returns the combined hash. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_h_a_s_h___c_o_m_b_i_n_e │ │ │ │ │ +void hash_combine(std::size_t &seed, const T &arg) │ │ │ │ │ +Calculates the hash value of arg and combines it in-place with seed. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_h_a_s_h │ │ │ │ │ +Functor for hashing objects of type T. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_h_a_s_h_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::size_t operator()(const T &t) const │ │ │ │ │ +Calculates the hash of t. │ │ │ │ │ +DDeeffiinniittiioonn hash.hh:43 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.hh File Reference │ │ │ │ +dune-common: interfaces.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,379 +71,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
debugalign.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
interfaces.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>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Provides interfaces for detection of specific behavior. │ │ │ │ +More...

│ │ │ │ + │ │ │ │

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::Cloneable
 An interface class for cloneable objects. 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()
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

ViolatedAlignmentHandlerDune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment()
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected
 
bool Dune::isAligned (const void *p, std::size_t align)
 check whether an address conforms to the given alignment
 
template<std::size_t align = debugAlignment, class T >
AlignedNumber< T, align > Dune::aligned (T value)
 align a value to a certain alignment
 
 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
 
│ │ │ │ -

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")
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

◆ 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")
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Provides interfaces for detection of specific behavior.

│ │ │ │ +
Author
Robert Kloefkorn
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,388 +1,24 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -debugalign.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_l_a_s_s_n_a_m_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_b_a_s_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_d_e_f_a_u_l_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +interfaces.hh File Reference │ │ │ │ │ +Provides interfaces for detection of specific behavior. _M_o_r_e_._._. │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_<_ _a_l_i_g_n_,_ _I_m_p_l_ _> │ │ │ │ │ -  CRTP base mixin class to check alignment. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_N_u_m_b_e_r_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _> │ │ │ │ │ -  aligned wrappers for arithmetic types _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_S_c_a_l_a_r_T_y_p_e_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_R_e_b_i_n_d_T_y_p_e_<_ _U_,_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_L_a_n_e_C_o_u_n_t_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_C_l_o_n_e_a_b_l_e │ │ │ │ │ +  An interface class for cloneable objects. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_i_m_d │ │ │ │ │ -  Namespace for vectorization interface functions used by library │ │ │ │ │ - developers. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s │ │ │ │ │ -  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ - implementation. │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___A_S_S_I_G_N___O_P(OP) │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___B_I_N_A_R_Y___O_P(OP) │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___U_N_A_R_Y___F_U_N_C(name) │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -using  _D_u_n_e_:_:_V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r = std::function< void(const char *, std:: │ │ │ │ │ - size_t, const void *)> │ │ │ │ │ -  type of the handler called by _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_(_) │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ - _V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r &  _D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r () │ │ │ │ │ -  access the handler called by │ │ │ │ │ - _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_(_) │ │ │ │ │ -  │ │ │ │ │ - void  _D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t (const char │ │ │ │ │ - *_c_l_a_s_s_N_a_m_e, std::size_t expectedAlignment, │ │ │ │ │ - const void *address) │ │ │ │ │ -  called when an alignment violation is │ │ │ │ │ - detected │ │ │ │ │ -  │ │ │ │ │ - bool  _D_u_n_e_:_:_i_s_A_l_i_g_n_e_d (const void *p, std::size_t │ │ │ │ │ - align) │ │ │ │ │ -  check whether an address conforms to the │ │ │ │ │ - given alignment │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align >  _D_u_n_e_:_:_a_l_i_g_n_e_d (T value) │ │ │ │ │ -  align a value to a certain alignment │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (+) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (-) │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP *  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (/ │ │ │ │ │ - );DUNE_BINARY_OP(% │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP^  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ - (&);DUNE_BINARY_OP(| │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (<<) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (> │ │ │ │ │ - >) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (==) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (!=) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (<=) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P (>=) │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP &&  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ - (||);#define _D_U_N_E___U_N_A_R_Y___F_U_N_C(name) │ │ │ │ │ - _D_U_N_E___U_N_A_R_Y___F_U_N_C(abs │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (acos) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (acosh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (asin) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (asinh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (atan) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (atanh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (cbrt) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (ceil) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (cos) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (cosh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (erf) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (erfc) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (exp) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (exp2) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (expm1) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (fabs) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (floor) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (ilogb) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (lgamma) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (llrint) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (llround) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (log) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (log10) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (log1p) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (log2) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (logb) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (lrint) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (lround) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (nearbyint) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (rint) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (round) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (sin) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (sinh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (sqrt) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (tan) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (tanh) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (tgamma) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (trunc) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (isfinite) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (isinf) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (isnan) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (isnormal) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (signbit) │ │ │ │ │ -  │ │ │ │ │ -   _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ - (real) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_a_x (const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &a, const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_a_x (const T &a, │ │ │ │ │ - const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_a_x (const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &a, const T &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_i_n (const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &a, const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_i_n (const T &a, │ │ │ │ │ - const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_i_n (const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &a, const T &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align >  _D_u_n_e_:_:_c_o_n_d (const _A_l_i_g_n_e_d_N_u_m_b_e_r< bool, align │ │ │ │ │ - > &b, const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &v1, │ │ │ │ │ - const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &v2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T  _D_u_n_e_:_:_m_a_x___v_a_l_u_e (const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T  _D_u_n_e_:_:_m_i_n___v_a_l_u_e (const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool  _D_u_n_e_:_:_a_n_y___t_r_u_e (const _A_l_i_g_n_e_d_N_u_m_b_e_r< bool, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool  _D_u_n_e_:_:_a_l_l___t_r_u_e (const _A_l_i_g_n_e_d_N_u_m_b_e_r< bool, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T &  _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_l_a_n_e (_A_D_L_T_a_g< 5 >, │ │ │ │ │ - std::size_t l, _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &v) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T  _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_l_a_n_e (_A_D_L_T_a_g< 5 >, │ │ │ │ │ - std::size_t l, const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align │ │ │ │ │ - > &v) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -const _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &  _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_c_o_n_d (_A_D_L_T_a_g< 5 >, │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< bool, align > _m_a_s_k, const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &ifTrue, const │ │ │ │ │ - _A_l_i_g_n_e_d_N_u_m_b_e_r< T, align > &ifFalse) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool  _D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_a_n_y_T_r_u_e (_A_D_L_T_a_g< 5 >, │ │ │ │ │ - const _A_l_i_g_n_e_d_N_u_m_b_e_r< bool, align > &_m_a_s_k) │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_d_e_b_u_g_A_l_i_g_n_m_e_n_t = 2*alignof(std::max_align_t) │ │ │ │ │ -  an alignment large enough to trigger alignment errors │ │ │ │ │ -  │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__AASSSSIIGGNN__OOPP ********** │ │ │ │ │ -#define DUNE_ASSIGN_OP (   OP ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -template() OP std::declval()) ) \ │ │ │ │ │ -> > \ │ │ │ │ │ -AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -value_ OP U(u); \ │ │ │ │ │ -return *this; \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -template() OP \ │ │ │ │ │ -_s_t_d::declval())> > \ │ │ │ │ │ -AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -value_ OP u; \ │ │ │ │ │ -return *this; \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ -********** _?◆_? DDUUNNEE__BBIINNAARRYY__OOPP ********** │ │ │ │ │ -#define DUNE_BINARY_OP (   OP ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -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") │ │ │ │ │ -********** _?◆_? DDUUNNEE__UUNNAARRYY__FFUUNNCC ********** │ │ │ │ │ -#define DUNE_UNARY_FUNC (   name ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -template \ │ │ │ │ │ -decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -using std::name; \ │ │ │ │ │ -return aligned(name(T(u))); \ │ │ │ │ │ -} \ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides interfaces for detection of specific behavior. │ │ │ │ │ + Author │ │ │ │ │ + Robert Kloefkorn │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.hh Source File │ │ │ │ +dune-common: interfaces.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,664 +74,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
debugalign.hh
│ │ │ │ +
interfaces.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_INTERFACES_HH
│ │ │ │ +
6#define DUNE_INTERFACES_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
│ │ │ │ - │ │ │ │ -
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) }; }
│ │ │ │ -
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 }
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14
│ │ │ │ +
│ │ │ │ +
16 struct Cloneable {
│ │ │ │ +
17
│ │ │ │ +
23 virtual Cloneable* clone() const = 0;
│ │ │ │ +
24
│ │ │ │ +
│ │ │ │ +
26 virtual ~Cloneable()
│ │ │ │ +
27 {}
│ │ │ │
│ │ │ │ -
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
│ │ │ │ +
28
│ │ │ │ +
29 };
│ │ │ │
│ │ │ │ -
551
│ │ │ │ -
552} // namespace Dune
│ │ │ │ -
553
│ │ │ │ -
554#endif // DUNE_DEBUGALIGN_HH
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ -
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ │ -
Basic definitions for SIMD Implementations.
│ │ │ │ -
Default implementations for SIMD Implementations.
│ │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition indices.hh:30
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ -
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition defaults.hh:153
│ │ │ │ -
STL namespace.
│ │ │ │ +
30
│ │ │ │ +
31} // end namespace Dune
│ │ │ │ +
32#endif
│ │ │ │
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
│ │ │ │ -
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 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
│ │ │ │ -
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition debugalign.hh:520
│ │ │ │ -
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
│ │ │ │ +
An interface class for cloneable objects.
Definition interfaces.hh:16
│ │ │ │ +
virtual ~Cloneable()
Destructor.
Definition interfaces.hh:26
│ │ │ │ +
virtual Cloneable * clone() const =0
Clones the object clone needs to be redefined by an implementation class, with the return type covari...
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,728 +1,45 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -debugalign.hh │ │ │ │ │ +interfaces.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_INTERFACES_HH │ │ │ │ │ +6#define DUNE_INTERFACES_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 <_d_u_n_e_/_c_o_m_m_o_n_/_c_l_a_s_s_n_a_m_e_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_b_a_s_e_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_d_e_f_a_u_l_t_s_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -26 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14 │ │ │ │ │ +_1_6 struct _C_l_o_n_e_a_b_l_e { │ │ │ │ │ +17 │ │ │ │ │ +_2_3 virtual _C_l_o_n_e_a_b_l_e* _c_l_o_n_e() const = 0; │ │ │ │ │ +24 │ │ │ │ │ +_2_6 virtual _~_C_l_o_n_e_a_b_l_e() │ │ │ │ │ +27 {} │ │ │ │ │ 28 │ │ │ │ │ -_3_0 using _V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r = │ │ │ │ │ -31 std::function; │ │ │ │ │ -32 │ │ │ │ │ -34 │ │ │ │ │ -40 _V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r &_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r(); │ │ │ │ │ -41 │ │ │ │ │ -43 │ │ │ │ │ -52 void _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t(const char *_c_l_a_s_s_N_a_m_e, std::size_t expectedAlignment, │ │ │ │ │ -53 const void *address); │ │ │ │ │ -54 │ │ │ │ │ -_5_6 inline bool _i_s_A_l_i_g_n_e_d(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 │ │ │ │ │ -_6_5 class alignas(align) _A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -66 { │ │ │ │ │ -67 void checkAlignment() const │ │ │ │ │ -68 { │ │ │ │ │ -69 auto pimpl = static_cast(this); │ │ │ │ │ -70 if(!_i_s_A_l_i_g_n_e_d(pimpl, align)) │ │ │ │ │ -71 _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t(className().c_str(), align, pimpl); │ │ │ │ │ -72 } │ │ │ │ │ -73 public: │ │ │ │ │ -_7_4 _A_l_i_g_n_e_d_B_a_s_e() { checkAlignment(); } │ │ │ │ │ -_7_5 _A_l_i_g_n_e_d_B_a_s_e(const _A_l_i_g_n_e_d_B_a_s_e &) { checkAlignment(); } │ │ │ │ │ -_7_6 _A_l_i_g_n_e_d_B_a_s_e(_A_l_i_g_n_e_d_B_a_s_e &&) { checkAlignment(); } │ │ │ │ │ -_7_7 _~_A_l_i_g_n_e_d_B_a_s_e() { checkAlignment(); } │ │ │ │ │ -78 │ │ │ │ │ -_7_9 _A_l_i_g_n_e_d_B_a_s_e& _o_p_e_r_a_t_o_r_=(const _A_l_i_g_n_e_d_B_a_s_e &) = default; │ │ │ │ │ -_8_0 _A_l_i_g_n_e_d_B_a_s_e& _o_p_e_r_a_t_o_r_=(_A_l_i_g_n_e_d_B_a_s_e &&) = default; │ │ │ │ │ -81 }; │ │ │ │ │ -82 │ │ │ │ │ -_8_4 static constexpr auto _d_e_b_u_g_A_l_i_g_n_m_e_n_t = 2*alignof(std::max_align_t); │ │ │ │ │ -85 │ │ │ │ │ -_8_6 namespace AlignedNumberImpl { │ │ │ │ │ -87 │ │ │ │ │ -88 template │ │ │ │ │ -89 class _A_l_i_g_n_e_d_N_u_m_b_e_r; │ │ │ │ │ -90 │ │ │ │ │ -91 } // namespace AlignedNumberImpl │ │ │ │ │ -92 │ │ │ │ │ -93 using _A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r; │ │ │ │ │ -94 │ │ │ │ │ -95 template │ │ │ │ │ -_9_6 struct _I_s_N_u_m_b_e_r> │ │ │ │ │ -97 : public std::true_type {}; │ │ │ │ │ -98 │ │ │ │ │ -100 template │ │ │ │ │ -_1_0_1 _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> _a_l_i_g_n_e_d(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 │ │ │ │ │ -_1_1_3 class _A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -114 : public _A_l_i_g_n_e_d_B_a_s_e > │ │ │ │ │ -115 { │ │ │ │ │ -116 T value_; │ │ │ │ │ -117 │ │ │ │ │ -118 public: │ │ │ │ │ -_1_1_9 _A_l_i_g_n_e_d_N_u_m_b_e_r() = default; │ │ │ │ │ -_1_2_0 _A_l_i_g_n_e_d_N_u_m_b_e_r(T value) : value_(_s_t_d::move(value)) {} │ │ │ │ │ -121 template= uAlign) && │ │ │ │ │ -123 std::is_convertible::value> > │ │ │ │ │ -_1_2_4 _A_l_i_g_n_e_d_N_u_m_b_e_r(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_U_,_ _u_A_l_i_g_n_> &o) : value_(U(o)) {} │ │ │ │ │ -125 │ │ │ │ │ -126 // accessors │ │ │ │ │ -127 template::value> > │ │ │ │ │ -_1_2_9 explicit operator U() const { return value_; } │ │ │ │ │ -130 │ │ │ │ │ -_1_3_1 const T &_v_a_l_u_e() const { return value_; } │ │ │ │ │ -_1_3_2 T &_v_a_l_u_e() { return value_; } │ │ │ │ │ -133 │ │ │ │ │ -134 // I/O │ │ │ │ │ -135 template │ │ │ │ │ -136 friend std::basic_istream& │ │ │ │ │ -_1_3_7 _o_p_e_r_a_t_o_r_>_>(std::basic_istream& str, _A_l_i_g_n_e_d_N_u_m_b_e_r &u) │ │ │ │ │ -138 { │ │ │ │ │ -139 return str >> u.value_; │ │ │ │ │ -140 } │ │ │ │ │ -141 │ │ │ │ │ -142 template │ │ │ │ │ -_1_4_3 friend std::basic_ostream& │ │ │ │ │ -144 _o_p_e_r_a_t_o_r_<_<(std::basic_ostream& str, │ │ │ │ │ -145 const _A_l_i_g_n_e_d_N_u_m_b_e_r &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())> > │ │ │ │ │ -_1_6_0 _A_l_i_g_n_e_d_N_u_m_b_e_r &operator++() { ++value_; return *this; } │ │ │ │ │ -161 │ │ │ │ │ -162 template())> > │ │ │ │ │ -_1_6_3 _A_l_i_g_n_e_d_N_u_m_b_e_r &operator--() { --value_; return *this; } │ │ │ │ │ -164 │ │ │ │ │ -165 template()++)> > │ │ │ │ │ -_1_6_6 decltype(auto) _o_p_e_r_a_t_o_r_+_+(int) { return aligned(value_++); } │ │ │ │ │ -167 │ │ │ │ │ -168 template()--)> > │ │ │ │ │ -_1_6_9 decltype(auto) _o_p_e_r_a_t_o_r_-_-(int) { return aligned(value_--); } │ │ │ │ │ -170 │ │ │ │ │ -171 // unary operators │ │ │ │ │ -172 template())> > │ │ │ │ │ -_1_7_4 decltype(auto) _o_p_e_r_a_t_o_r_+() const { return aligned(+value_); } │ │ │ │ │ -175 │ │ │ │ │ -176 template())> > │ │ │ │ │ -_1_7_8 decltype(auto) _o_p_e_r_a_t_o_r_-() 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())> > │ │ │ │ │ -_1_9_4 decltype(auto) _o_p_e_r_a_t_o_r_~() 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())> > │ │ │ │ │ -_2_0_4 decltype(auto) _o_p_e_r_a_t_o_r_!() const { return aligned(!value_); } │ │ │ │ │ -205 │ │ │ │ │ -206 // assignment operators │ │ │ │ │ -_2_0_7#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 │ │ │ │ │ -_2_3_0 _D_U_N_E___A_S_S_I_G_N___O_P(+=); │ │ │ │ │ -_2_3_1 _D_U_N_E___A_S_S_I_G_N___O_P(-=); │ │ │ │ │ -232 │ │ │ │ │ -_2_3_3 _D_U_N_E___A_S_S_I_G_N___O_P(*=); │ │ │ │ │ -234 _D_U_N_E___A_S_S_I_G_N___O_P(/=); │ │ │ │ │ -235 _D_U_N_E___A_S_S_I_G_N___O_P(%=); │ │ │ │ │ -236 │ │ │ │ │ -_2_3_7 _D_U_N_E___A_S_S_I_G_N___O_P(^=); │ │ │ │ │ -238 _D_U_N_E___A_S_S_I_G_N___O_P(&=); │ │ │ │ │ -239 _D_U_N_E___A_S_S_I_G_N___O_P(|=); │ │ │ │ │ -240 │ │ │ │ │ -_2_4_1 _D_U_N_E___A_S_S_I_G_N___O_P(<<=); │ │ │ │ │ -_2_4_2 _D_U_N_E___A_S_S_I_G_N___O_P(>>=); │ │ │ │ │ -243 │ │ │ │ │ -244#undef DUNE_ASSIGN_OP │ │ │ │ │ -245 }; │ │ │ │ │ -246 │ │ │ │ │ -247 // binary operators │ │ │ │ │ -_2_4_8#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 │ │ │ │ │ -_2_8_0 _D_U_N_E___B_I_N_A_R_Y___O_P(+); │ │ │ │ │ -_2_8_1 _D_U_N_E___B_I_N_A_R_Y___O_P(-); │ │ │ │ │ -282 │ │ │ │ │ -_2_8_3 _D_U_N_E___B_I_N_A_R_Y___O_P(*); │ │ │ │ │ -284 _D_U_N_E___B_I_N_A_R_Y___O_P(/); │ │ │ │ │ -285 _D_U_N_E___B_I_N_A_R_Y___O_P(%); │ │ │ │ │ -286 │ │ │ │ │ -_2_8_7 _D_U_N_E___B_I_N_A_R_Y___O_P(^); │ │ │ │ │ -288 _D_U_N_E___B_I_N_A_R_Y___O_P(&); │ │ │ │ │ -289 _D_U_N_E___B_I_N_A_R_Y___O_P(|); │ │ │ │ │ -290 │ │ │ │ │ -_2_9_1 _D_U_N_E___B_I_N_A_R_Y___O_P(<<); │ │ │ │ │ -_2_9_2 _D_U_N_E___B_I_N_A_R_Y___O_P(>>); │ │ │ │ │ -293 │ │ │ │ │ -_2_9_4 _D_U_N_E___B_I_N_A_R_Y___O_P(==); │ │ │ │ │ -_2_9_5 _D_U_N_E___B_I_N_A_R_Y___O_P(!=); │ │ │ │ │ -296 _D_U_N_E___B_I_N_A_R_Y___O_P(<); │ │ │ │ │ -297 _D_U_N_E___B_I_N_A_R_Y___O_P(>); │ │ │ │ │ -_2_9_8 _D_U_N_E___B_I_N_A_R_Y___O_P(<=); │ │ │ │ │ -_2_9_9 _D_U_N_E___B_I_N_A_R_Y___O_P(>=); │ │ │ │ │ -300 │ │ │ │ │ -_3_0_1 _D_U_N_E___B_I_N_A_R_Y___O_P(&&); │ │ │ │ │ -302 _D_U_N_E___B_I_N_A_R_Y___O_P(||); │ │ │ │ │ -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 _D_U_N_E___U_N_A_R_Y___F_U_N_C(abs); │ │ │ │ │ -_3_3_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acos); │ │ │ │ │ -_3_3_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acosh); │ │ │ │ │ -_3_3_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asin); │ │ │ │ │ -_3_3_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asinh); │ │ │ │ │ -_3_3_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atan); │ │ │ │ │ -337 // atan2 │ │ │ │ │ -_3_3_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atanh); │ │ │ │ │ -_3_3_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cbrt); │ │ │ │ │ -_3_4_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(ceil); │ │ │ │ │ -341 // copysign │ │ │ │ │ -_3_4_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cos); │ │ │ │ │ -_3_4_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cosh); │ │ │ │ │ -_3_4_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erf); │ │ │ │ │ -_3_4_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erfc); │ │ │ │ │ -_3_4_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(exp); │ │ │ │ │ -_3_4_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(exp2); │ │ │ │ │ -_3_4_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(expm1); │ │ │ │ │ -_3_4_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(fabs); │ │ │ │ │ -350 // fdim │ │ │ │ │ -_3_5_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(floor); │ │ │ │ │ -352 // fma │ │ │ │ │ -353 // fmax │ │ │ │ │ -354 // fmin │ │ │ │ │ -355 // fmod │ │ │ │ │ -356 // frexp │ │ │ │ │ -357 // hypos │ │ │ │ │ -_3_5_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(ilogb); │ │ │ │ │ -359 // ldexp │ │ │ │ │ -_3_6_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lgamma); │ │ │ │ │ -_3_6_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(llrint); │ │ │ │ │ -_3_6_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(llround); │ │ │ │ │ -_3_6_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log); │ │ │ │ │ -_3_6_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log10); │ │ │ │ │ -_3_6_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log1p); │ │ │ │ │ -_3_6_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log2); │ │ │ │ │ -_3_6_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(logb); │ │ │ │ │ -_3_6_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lrint); │ │ │ │ │ -_3_6_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lround); │ │ │ │ │ -370 // modf │ │ │ │ │ -_3_7_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(nearbyint); │ │ │ │ │ -372 // nextafter │ │ │ │ │ -373 // nexttoward │ │ │ │ │ -374 // pow │ │ │ │ │ -375 // remainder │ │ │ │ │ -376 // remquo │ │ │ │ │ -_3_7_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(rint); │ │ │ │ │ -_3_7_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(round); │ │ │ │ │ -379 // scalbln │ │ │ │ │ -380 // scalbn │ │ │ │ │ -_3_8_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sin); │ │ │ │ │ -_3_8_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sinh); │ │ │ │ │ -_3_8_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sqrt); │ │ │ │ │ -_3_8_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tan); │ │ │ │ │ -_3_8_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tanh); │ │ │ │ │ -_3_8_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tgamma); │ │ │ │ │ -_3_8_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(trunc); │ │ │ │ │ -388 │ │ │ │ │ -_3_8_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isfinite); │ │ │ │ │ -_3_9_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isinf); │ │ │ │ │ -_3_9_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isnan); │ │ │ │ │ -_3_9_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isnormal); │ │ │ │ │ -_3_9_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(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 │ │ │ │ │ -_4_0_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(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 │ │ │ │ │ -_4_2_5 auto _m_a_x(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, │ │ │ │ │ -426 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -427 { │ │ │ │ │ -428 using std::max; │ │ │ │ │ -429 return aligned(_m_a_x(T(a), T(b))); │ │ │ │ │ -430 } │ │ │ │ │ -431 │ │ │ │ │ -432 template │ │ │ │ │ -_4_3_3 auto _m_a_x(const T &a, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -434 { │ │ │ │ │ -435 using std::max; │ │ │ │ │ -436 return aligned(_m_a_x(a, T(b))); │ │ │ │ │ -437 } │ │ │ │ │ -438 │ │ │ │ │ -439 template │ │ │ │ │ -_4_4_0 auto _m_a_x(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, const T &b) │ │ │ │ │ -441 { │ │ │ │ │ -442 using std::max; │ │ │ │ │ -443 return aligned(_m_a_x(T(a), b)); │ │ │ │ │ -444 } │ │ │ │ │ -445 │ │ │ │ │ -446 template │ │ │ │ │ -_4_4_7 auto _m_i_n(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, │ │ │ │ │ -448 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -449 { │ │ │ │ │ -450 using std::min; │ │ │ │ │ -451 return aligned(_m_i_n(T(a), T(b))); │ │ │ │ │ -452 } │ │ │ │ │ -453 │ │ │ │ │ -454 template │ │ │ │ │ -_4_5_5 auto _m_i_n(const T &a, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -456 { │ │ │ │ │ -457 using std::min; │ │ │ │ │ -458 return aligned(_m_i_n(a, T(b))); │ │ │ │ │ -459 } │ │ │ │ │ -460 │ │ │ │ │ -461 template │ │ │ │ │ -_4_6_2 auto _m_i_n(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, const T &b) │ │ │ │ │ -463 { │ │ │ │ │ -464 using std::min; │ │ │ │ │ -465 return aligned(_m_i_n(T(a), b)); │ │ │ │ │ -466 } │ │ │ │ │ -467 │ │ │ │ │ -468 } // namespace AlignedNumberImpl │ │ │ │ │ -469 │ │ │ │ │ -470 // SIMD-like functions from "conditional.hh" │ │ │ │ │ -471 template │ │ │ │ │ -472 AlignedNumber │ │ │ │ │ -_4_7_3 _c_o_n_d(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_b_o_o_l_,_ _a_l_i_g_n_> &b, │ │ │ │ │ -474 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &v1, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &v2) │ │ │ │ │ -475 { │ │ │ │ │ -476 return b ? v1 : v2; │ │ │ │ │ -477 } │ │ │ │ │ -478 │ │ │ │ │ -479 // SIMD-like functions from "rangeutilities.hh" │ │ │ │ │ -480 template │ │ │ │ │ -_4_8_1 T _m_a_x___v_a_l_u_e(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_>& val) │ │ │ │ │ -482 { │ │ │ │ │ -483 return T(val); │ │ │ │ │ -484 } │ │ │ │ │ -485 │ │ │ │ │ -486 template │ │ │ │ │ -_4_8_7 T _m_i_n___v_a_l_u_e(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_>& val) │ │ │ │ │ -488 { │ │ │ │ │ -489 return T(val); │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -492 template │ │ │ │ │ -_4_9_3 bool _a_n_y___t_r_u_e(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_b_o_o_l_,_ _a_l_i_g_n_>& val) │ │ │ │ │ -494 { │ │ │ │ │ -495 return bool(val); │ │ │ │ │ -496 } │ │ │ │ │ -497 │ │ │ │ │ -498 template │ │ │ │ │ -_4_9_9 bool _a_l_l___t_r_u_e(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_b_o_o_l_,_ _a_l_i_g_n_>& val) │ │ │ │ │ -500 { │ │ │ │ │ -501 return bool(val); │ │ │ │ │ -502 } │ │ │ │ │ -503 │ │ │ │ │ -504 // SIMD-like functionality from "simd/interface.hh" │ │ │ │ │ -_5_0_5 namespace Simd { │ │ │ │ │ -_5_0_6 namespace Overloads { │ │ │ │ │ -507 │ │ │ │ │ -508 template │ │ │ │ │ -_5_0_9 struct _S_c_a_l_a_r_T_y_p_e_<_A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> > { using _t_y_p_e = T; }; │ │ │ │ │ -510 │ │ │ │ │ -511 template │ │ │ │ │ -_5_1_2 struct _R_e_b_i_n_d_T_y_p_e > { │ │ │ │ │ -_5_1_3 using _t_y_p_e = _A_l_i_g_n_e_d_N_u_m_b_e_r_<_U_,_ _a_l_i_g_n_>; │ │ │ │ │ -514 }; │ │ │ │ │ -515 │ │ │ │ │ -516 template │ │ │ │ │ -_5_1_7 struct _L_a_n_e_C_o_u_n_t<_A_l_i_g_n_e_d_N_u_m_b_e_r > : _i_n_d_e_x___c_o_n_s_t_a_n_t<1> {}; │ │ │ │ │ -518 │ │ │ │ │ -519 template │ │ │ │ │ -_5_2_0 T& _l_a_n_e(_A_D_L_T_a_g_<_5_>, std::size_t l, _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &v) │ │ │ │ │ -521 { │ │ │ │ │ -522 assert(l == 0); │ │ │ │ │ -523 return v._v_a_l_u_e(); │ │ │ │ │ -524 } │ │ │ │ │ -525 │ │ │ │ │ -526 template │ │ │ │ │ -_5_2_7 T _l_a_n_e(_A_D_L_T_a_g_<_5_>, std::size_t l, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &v) │ │ │ │ │ -528 { │ │ │ │ │ -529 assert(l == 0); │ │ │ │ │ -530 return v._v_a_l_u_e(); │ │ │ │ │ -531 } │ │ │ │ │ -532 │ │ │ │ │ -533 template │ │ │ │ │ -534 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> & │ │ │ │ │ -_5_3_5 _c_o_n_d(_A_D_L_T_a_g_<_5_>, _A_l_i_g_n_e_d_N_u_m_b_e_r_<_b_o_o_l_,_ _a_l_i_g_n_> mask, │ │ │ │ │ -536 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &ifTrue, │ │ │ │ │ -537 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &ifFalse) │ │ │ │ │ -538 { │ │ │ │ │ -539 return _m_a_s_k ? ifTrue : ifFalse; │ │ │ │ │ -540 } │ │ │ │ │ -541 │ │ │ │ │ -542 template │ │ │ │ │ -_5_4_3 bool _a_n_y_T_r_u_e(_A_D_L_T_a_g_<_5_>, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_b_o_o_l_,_ _a_l_i_g_n_> &mask) │ │ │ │ │ -544 { │ │ │ │ │ -545 return bool(_m_a_s_k); │ │ │ │ │ -546 } │ │ │ │ │ -547 │ │ │ │ │ -548 } // namespace Overloads │ │ │ │ │ -549 │ │ │ │ │ -550 } // namespace Simd │ │ │ │ │ -551 │ │ │ │ │ -552} // namespace Dune │ │ │ │ │ -553 │ │ │ │ │ -554#endif // DUNE_DEBUGALIGN_HH │ │ │ │ │ -_i_n_d_i_c_e_s_._h_h │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ -#define DUNE_BINARY_OP(OP) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:248 │ │ │ │ │ -_D_U_N_E___U_N_A_R_Y___F_U_N_C │ │ │ │ │ -#define DUNE_UNARY_FUNC(name) │ │ │ │ │ -_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:207 │ │ │ │ │ -_c_l_a_s_s_n_a_m_e_._h_h │ │ │ │ │ -A free function to provide the demangled class name of a given object or type │ │ │ │ │ -as a string. │ │ │ │ │ -_b_a_s_e_._h_h │ │ │ │ │ -Basic definitions for SIMD Implementations. │ │ │ │ │ -_d_e_f_a_u_l_t_s_._h_h │ │ │ │ │ -Default implementations for SIMD Implementations. │ │ │ │ │ -_D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_m_a_s_k │ │ │ │ │ -Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ -implements Simd::mask() │ │ │ │ │ -DDeeffiinniittiioonn defaults.hh:153 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +29 }; │ │ │ │ │ +30 │ │ │ │ │ +31} // end namespace Dune │ │ │ │ │ +32#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t │ │ │ │ │ -void violatedAlignment(const char *className, std::size_t expectedAlignment, │ │ │ │ │ -const void *address) │ │ │ │ │ -called when an alignment violation is detected │ │ │ │ │ -DDeeffiinniittiioonn debugalign.cc:39 │ │ │ │ │ -_D_u_n_e_:_:_a_n_y___t_r_u_e │ │ │ │ │ -bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_a_l_l___t_r_u_e │ │ │ │ │ -bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_c_l_a_s_s_N_a_m_e │ │ │ │ │ -std::string className() │ │ │ │ │ -Provide the demangled class name of a type T as a string. │ │ │ │ │ -DDeeffiinniittiioonn classname.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_d_e_b_u_g_A_l_i_g_n_m_e_n_t │ │ │ │ │ -static constexpr auto debugAlignment │ │ │ │ │ -an alignment large enough to trigger alignment errors │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_d │ │ │ │ │ -const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ -conditional evaluate │ │ │ │ │ -DDeeffiinniittiioonn conditional.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_a_l_i_g_n_e_d │ │ │ │ │ -AlignedNumber< T, align > aligned(T value) │ │ │ │ │ -align a value to a certain alignment │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r │ │ │ │ │ -ViolatedAlignmentHandler & violatedAlignmentHandler() │ │ │ │ │ -access the handler called by violatedAlignment() │ │ │ │ │ -DDeeffiinniittiioonn debugalign.cc:33 │ │ │ │ │ -_D_u_n_e_:_:_i_s_A_l_i_g_n_e_d │ │ │ │ │ -bool isAligned(const void *p, std::size_t align) │ │ │ │ │ -check whether an address conforms to the given alignment │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_m_a_x___v_a_l_u_e │ │ │ │ │ -T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_V_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t_H_a_n_d_l_e_r │ │ │ │ │ -std::function< void(const char *, std::size_t, const void *)> │ │ │ │ │ -ViolatedAlignmentHandler │ │ │ │ │ -type of the handler called by violatedAlignment() │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_m_i_n___v_a_l_u_e │ │ │ │ │ -T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_i_n │ │ │ │ │ -auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:447 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_m_a_x │ │ │ │ │ -auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_a_n_y_T_r_u_e │ │ │ │ │ -bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:543 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_l_a_n_e │ │ │ │ │ -T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_I_s_N_u_m_b_e_r │ │ │ │ │ -Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ -containers. │ │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -CRTP base mixin class to check alignment. │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_~_A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -~AlignedBase() │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -AlignedBase & operator=(AlignedBase &&)=default │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -AlignedBase(AlignedBase &&) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -AlignedBase & operator=(const AlignedBase &)=default │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -AlignedBase(const AlignedBase &) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_B_a_s_e_:_:_A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -AlignedBase() │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -aligned wrappers for arithmetic types │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP(<<=) │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP(-=) │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ -decltype(auto) operator+() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP(+=) │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -decltype(auto) operator--(int) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%= │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -decltype(auto) operator++(int) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_! │ │ │ │ │ -decltype(auto) operator!() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:204 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_v_a_l_u_e │ │ │ │ │ -T & value() │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_v_a_l_u_e │ │ │ │ │ -const T & value() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|= │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ -friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< │ │ │ │ │ -charT, Traits > &str, AlignedNumber &u) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_D_U_N_E___A_S_S_I_G_N___O_P │ │ │ │ │ -DUNE_ASSIGN_OP(> >=) │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -AlignedNumber()=default │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_~ │ │ │ │ │ -decltype(auto) operator~() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -AlignedNumber(T value) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -AlignedNumber(const AlignedNumber< U, uAlign > &o) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_I_m_p_l_:_:_A_l_i_g_n_e_d_N_u_m_b_e_r_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -decltype(auto) operator-() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_S_c_a_l_a_r_T_y_p_e_<_ _A_l_i_g_n_e_d_N_u_m_b_e_r_<_ _T_,_ _a_l_i_g_n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -T type │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:509 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_A_D_L_T_a_g │ │ │ │ │ -Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ -DDeeffiinniittiioonn base.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_S_c_a_l_a_r_T_y_p_e │ │ │ │ │ -should have a member type type │ │ │ │ │ -DDeeffiinniittiioonn standard.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_R_e_b_i_n_d_T_y_p_e │ │ │ │ │ -should have a member type type │ │ │ │ │ -DDeeffiinniittiioonn standard.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_L_a_n_e_C_o_u_n_t │ │ │ │ │ -should be derived from a Dune::index_constant │ │ │ │ │ -DDeeffiinniittiioonn standard.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_C_l_o_n_e_a_b_l_e │ │ │ │ │ +An interface class for cloneable objects. │ │ │ │ │ +DDeeffiinniittiioonn interfaces.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_C_l_o_n_e_a_b_l_e_:_:_~_C_l_o_n_e_a_b_l_e │ │ │ │ │ +virtual ~Cloneable() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn interfaces.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_C_l_o_n_e_a_b_l_e_:_:_c_l_o_n_e │ │ │ │ │ +virtual Cloneable * clone() const =0 │ │ │ │ │ +Clones the object clone needs to be redefined by an implementation class, with │ │ │ │ │ +the return type covari... │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parametertree.hh File Reference │ │ │ │ +dune-common: densematrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,69 +71,72 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
parametertree.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
densematrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

A hierarchical structure of string parameters. │ │ │ │ +

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

│ │ │ │ -
#include <array>
│ │ │ │ +
#include <cmath>
│ │ │ │ #include <cstddef>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <istream>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <locale>
│ │ │ │ -#include <map>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <string>
│ │ │ │ -#include <typeinfo>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ #include <vector>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <bitset>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/classname.hh>
│ │ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ │ +#include <dune/common/classname.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/precision.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ParameterTree
 Hierarchical structure of string parameters. More...
struct  Dune::FieldTraits< DenseMatrix< M > >
 
struct  Dune::ParameterTree::Parser< std::basic_string< char, traits, Allocator > >
class  Dune::FMatrixError
 Error thrown if operations of a FieldMatrix fail. More...
 
struct  Dune::ParameterTree::Parser< bool >
 
struct  Dune::ParameterTree::Parser< bool >::ToLower
 
struct  Dune::ParameterTree::Parser< FieldVector< T, n > >
 
struct  Dune::ParameterTree::Parser< std::array< T, n > >
 
struct  Dune::ParameterTree::Parser< std::bitset< n > >
 
struct  Dune::ParameterTree::Parser< std::vector< T, A > >
class  Dune::DenseMatrix< MAT >
 A dense n x m matrix. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

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

Detailed Description

│ │ │ │ -

A hierarchical structure of string parameters.

│ │ │ │ +

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

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

An stl-compliant random-access container which stores everything on the stack. │ │ │ │ +

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

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <array>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <dune/common/hash.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ReservedVector< T, n >
 A Vector class with statically reserved memory. More...
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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Macros

#define CHECKSIZE(X)   {}
 

│ │ │ │ +Functions

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

Detailed Description

│ │ │ │ -

An stl-compliant random-access container which stores everything on the stack.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ CHECKSIZE

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define CHECKSIZE( X)   {}
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,37 +1,108 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -reservedvector.hh File Reference │ │ │ │ │ -An stl-compliant random-access container which stores everything on the stack. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +tupleutility.hh File Reference │ │ │ │ │ +_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _T_u_p_l_e_ _U_t_i_l_i_t_i_e_s │ │ │ │ │ +Contains utility classes which can be used with std::tuple. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_a_s_h_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_s_e_r_v_e_d_V_e_c_t_o_r_<_ _T_,_ _n_ _> │ │ │ │ │ -  A Vector class with statically reserved memory. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _*_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _&_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r_<_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_o_r_E_a_c_h_T_y_p_e_<_ _T_E_,_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _>_:_:_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_R_e_f_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ +  TypeEvaluator to turn a type T into a reference to T _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ +  TypeEvaluator to turn a type T into a pointer to T _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _&_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_t_T_y_p_e_<_ _N_,_ _T_u_p_l_e_ _> │ │ │ │ │ +  Type for reverse element access. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_t_<_ _N_ _> │ │ │ │ │ +  Reverse element access. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_P_o_i_n_t_e_r_P_a_i_r_D_e_l_e_t_o_r_<_ _T_u_p_l_e_ _> │ │ │ │ │ +  Deletes all objects pointed to in a std::tuple of pointers. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_F_i_r_s_t_P_r_e_d_i_c_a_t_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _P_r_e_d_i_c_a_t_e_,_ _s_t_a_r_t_,_ _s_i_z_e_ _> │ │ │ │ │ +  Finding the index of a certain type in a std::tuple. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _> │ │ │ │ │ +  Generator for predicates accepting one particular type. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _>_:_:_P_r_e_d_i_c_a_t_e_<_ _U_ _> │ │ │ │ │ +  The actual predicate. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_r_s_t_T_y_p_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _T_,_ _s_t_a_r_t_ _> │ │ │ │ │ +  Find the first occurrence of a type in a std::tuple. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_P_u_s_h_B_a_c_k_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_P_u_s_h_F_r_o_n_t_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _N_ _> │ │ │ │ │ +  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _0_ _> │ │ │ │ │ +  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_J_o_i_n_T_u_p_l_e_s_<_ _H_e_a_d_,_ _T_a_i_l_ _> │ │ │ │ │ +  Join two std::tuple's. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_l_a_t_t_e_n_T_u_p_l_e_<_ _T_u_p_l_e_ _> │ │ │ │ │ +  Flatten a std::tuple of std::tuple's. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _C_H_E_C_K_S_I_Z_E(X)   {} │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ + decltype(auto)  _D_u_n_e_:_:_a_p_p_l_y_P_a_r_t_i_a_l (F &&f, ArgTuple │ │ │ │ │ + &&args, std::integer_sequence< I, i... >) │ │ │ │ │ +  Apply function with arguments from a │ │ │ │ │ + given tuple. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_g_e_n_e_r_i_c_T_r_a_n_s_f_o_r_m_T_u_p_l_e (Tuple &&t, │ │ │ │ │ + Functor &&f) -> decltype │ │ │ │ │ + (genericTransformTupleBackend(t, f)) │ │ │ │ │ +  │ │ │ │ │ +template class TE, class... Args> │ │ │ │ │ +_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r< TE, Args... >  _D_u_n_e_:_:_m_a_k_e_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r (Args │ │ │ │ │ + &&... args) │ │ │ │ │ +  │ │ │ │ │ +template class TypeEvaluator, class Tuple , class... Args> │ │ │ │ │ + auto  _D_u_n_e_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (Tuple &&orig, Args │ │ │ │ │ + &&... args) -> decltype │ │ │ │ │ + (_g_e_n_e_r_i_c_T_r_a_n_s_f_o_r_m_T_u_p_l_e(orig, │ │ │ │ │ + _m_a_k_e_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r< TypeEvaluator │ │ │ │ │ + >(args...))) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -An stl-compliant random-access container which stores everything on the stack. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? CCHHEECCKKSSIIZZEE ********** │ │ │ │ │ -#define CHECKSIZE (   X )    {} │ │ │ │ │ +Contains utility classes which can be used with std::tuple. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: reservedvector.hh Source File │ │ │ │ +dune-common: tupleutility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,528 +74,447 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
reservedvector.hh
│ │ │ │ +
tupleutility.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_RESERVEDVECTOR_HH
│ │ │ │ -
6#define DUNE_COMMON_RESERVEDVECTOR_HH
│ │ │ │ -
7
│ │ │ │ -
12#include <algorithm>
│ │ │ │ -
13#include <array>
│ │ │ │ -
14#include <cassert>
│ │ │ │ -
15#include <iostream>
│ │ │ │ -
16#include <iterator>
│ │ │ │ -
17#include <cstddef>
│ │ │ │ -
18#include <initializer_list>
│ │ │ │ -
19
│ │ │ │ -
20#include <dune/common/hash.hh>
│ │ │ │ -
21
│ │ │ │ -
22#ifdef CHECK_RESERVEDVECTOR
│ │ │ │ -
23#define CHECKSIZE(X) assert(X)
│ │ │ │ -
24#else
│ │ │ │ -
25#define CHECKSIZE(X) {}
│ │ │ │ -
26#endif
│ │ │ │ -
27
│ │ │ │ -
28namespace Dune
│ │ │ │ -
29{
│ │ │ │ -
45 template<class T, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
47 {
│ │ │ │ -
48 using storage_type = std::array<T,n>;
│ │ │ │ -
49
│ │ │ │ -
50 public:
│ │ │ │ -
51
│ │ │ │ -
55 typedef typename storage_type::value_type value_type;
│ │ │ │ -
57 typedef typename storage_type::pointer pointer;
│ │ │ │ -
59 typedef typename storage_type::const_pointer const_pointer;
│ │ │ │ -
61 typedef typename storage_type::reference reference;
│ │ │ │ -
63 typedef typename storage_type::const_reference const_reference;
│ │ │ │ -
65 typedef typename storage_type::size_type size_type;
│ │ │ │ -
67 typedef typename storage_type::difference_type difference_type;
│ │ │ │ -
69 typedef typename storage_type::iterator iterator;
│ │ │ │ -
71 typedef typename storage_type::const_iterator const_iterator;
│ │ │ │ -
73 typedef std::reverse_iterator<iterator> reverse_iterator;
│ │ │ │ -
75 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
│ │ │ │ -
76
│ │ │ │ -
│ │ │ │ -
82 constexpr ReservedVector()
│ │ │ │ -
83 noexcept(std::is_nothrow_default_constructible_v<value_type>)
│ │ │ │ -
84 : storage_()
│ │ │ │ -
85 , size_(0)
│ │ │ │ -
86 {}
│ │ │ │ -
│ │ │ │ -
87
│ │ │ │ -
│ │ │ │ -
89 explicit constexpr ReservedVector(size_type count)
│ │ │ │ -
90 noexcept(std::is_nothrow_default_constructible_v<value_type>)
│ │ │ │ -
91 : storage_()
│ │ │ │ -
92 , size_(count)
│ │ │ │ -
93 {
│ │ │ │ -
94 assert(count <= n);
│ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ -
98 constexpr ReservedVector(size_type count, const value_type& value)
│ │ │ │ -
99 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
│ │ │ │ -
100 noexcept(ReservedVector(count)))
│ │ │ │ -
101 : ReservedVector(count)
│ │ │ │ -
102 {
│ │ │ │ -
103 for (size_type i=0; i<count; ++i)
│ │ │ │ -
104 storage_[i] = value;
│ │ │ │ -
105 }
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
108 template<class InputIt,
│ │ │ │ -
109 std::enable_if_t<std::is_convertible_v<typename std::iterator_traits<InputIt>::value_type, value_type>, int> = 0>
│ │ │ │ -
│ │ │ │ -
110 constexpr ReservedVector(InputIt first, InputIt last)
│ │ │ │ -
111 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
│ │ │ │ -
112 noexcept(ReservedVector()))
│ │ │ │ - │ │ │ │ -
114 {
│ │ │ │ -
115 for (size_type i=0; i<n && first!=last; ++i,++size_)
│ │ │ │ -
116 storage_[i] = *first++;
│ │ │ │ -
117 assert(first == last);
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
│ │ │ │ -
121 constexpr ReservedVector(std::initializer_list<value_type> const& l)
│ │ │ │ -
122 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
│ │ │ │ -
123 noexcept(ReservedVector(l.begin(),l.end())))
│ │ │ │ -
124 : ReservedVector(l.begin(),l.end())
│ │ │ │ -
125 {}
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ -
132 constexpr bool operator== (const ReservedVector& that) const noexcept
│ │ │ │ -
133 {
│ │ │ │ -
134 if (size() != that.size())
│ │ │ │ -
135 return false;
│ │ │ │ -
136 for (size_type i=0; i<size(); ++i)
│ │ │ │ -
137 if (!(storage_[i]==that.storage_[i]))
│ │ │ │ -
138 return false;
│ │ │ │ -
139 return true;
│ │ │ │ -
140 }
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
│ │ │ │ -
143 constexpr bool operator!= (const ReservedVector& that) const noexcept
│ │ │ │ -
144 {
│ │ │ │ -
145 return !(*this == that);
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
│ │ │ │ -
149 constexpr bool operator< (const ReservedVector& that) const noexcept
│ │ │ │ -
150 {
│ │ │ │ -
151 for (size_type i=0; i<std::min(size(),that.size()); ++i) {
│ │ │ │ -
152 if (storage_[i] < that.storage_[i]) return true;
│ │ │ │ -
153 if (that.storage_[i] < storage_[i]) return false;
│ │ │ │ -
154 }
│ │ │ │ -
155 return size() < that.size();
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ -
157
│ │ │ │ -
│ │ │ │ -
159 constexpr bool operator> (const ReservedVector& that) const noexcept
│ │ │ │ -
160 {
│ │ │ │ -
161 return that < *this;
│ │ │ │ -
162 }
│ │ │ │ -
│ │ │ │ -
163
│ │ │ │ -
│ │ │ │ -
165 constexpr bool operator<= (const ReservedVector& that) const noexcept
│ │ │ │ -
166 {
│ │ │ │ -
167 return !(*this > that);
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
│ │ │ │ -
171 constexpr bool operator>= (const ReservedVector& that) const noexcept
│ │ │ │ -
172 {
│ │ │ │ -
173 return !(*this < that);
│ │ │ │ -
174 }
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
│ │ │ │ -
181 constexpr void clear() noexcept
│ │ │ │ -
182 {
│ │ │ │ -
183 size_ = 0;
│ │ │ │ -
184 }
│ │ │ │ -
│ │ │ │ -
185
│ │ │ │ -
│ │ │ │ -
187 constexpr void resize(size_type s) noexcept
│ │ │ │ -
188 {
│ │ │ │ -
189 CHECKSIZE(s<=n);
│ │ │ │ -
190 size_ = s;
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
│ │ │ │ -
194 constexpr void push_back(const value_type& t)
│ │ │ │ -
195 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
│ │ │ │ -
196 {
│ │ │ │ -
197 CHECKSIZE(size_<n);
│ │ │ │ -
198 storage_[size_++] = t;
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ -
202 constexpr void push_back(value_type&& t)
│ │ │ │ -
203 noexcept(std::is_nothrow_move_assignable_v<value_type>)
│ │ │ │ -
204 {
│ │ │ │ -
205 CHECKSIZE(size_<n);
│ │ │ │ -
206 storage_[size_++] = std::move(t);
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
210 template<class... Args>
│ │ │ │ -
│ │ │ │ -
211 reference emplace_back(Args&&... args)
│ │ │ │ -
212 noexcept(std::is_nothrow_constructible_v<value_type,decltype(args)...>)
│ │ │ │ -
213 {
│ │ │ │ -
214 CHECKSIZE(size_<n);
│ │ │ │ -
215 value_type* p = &storage_[size_++];
│ │ │ │ -
216 // first destroy any previously (default) constructed element at that location
│ │ │ │ -
217 p->~value_type();
│ │ │ │ -
218 // construct the value_type in place
│ │ │ │ -
219 // NOTE: This is not an integral constant expression.
│ │ │ │ -
220 // With c++20 we could use std::construct_at
│ │ │ │ -
221 ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
│ │ │ │ -
222 value_type(std::forward<Args>(args)...);
│ │ │ │ -
223 return *p;
│ │ │ │ -
224 }
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
│ │ │ │ -
227 constexpr void pop_back() noexcept
│ │ │ │ -
228 {
│ │ │ │ -
229 if (! empty()) size_--;
│ │ │ │ -
230 }
│ │ │ │ -
│ │ │ │ -
231
│ │ │ │ -
│ │ │ │ -
237 constexpr iterator begin() noexcept
│ │ │ │ -
238 {
│ │ │ │ -
239 return storage_.begin();
│ │ │ │ -
240 }
│ │ │ │ -
│ │ │ │ -
241
│ │ │ │ -
│ │ │ │ -
243 constexpr const_iterator begin() const noexcept
│ │ │ │ -
244 {
│ │ │ │ -
245 return storage_.begin();
│ │ │ │ -
246 }
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
│ │ │ │ -
249 constexpr const_iterator cbegin() const noexcept
│ │ │ │ -
250 {
│ │ │ │ -
251 return storage_.cbegin();
│ │ │ │ -
252 }
│ │ │ │ -
│ │ │ │ -
253
│ │ │ │ -
│ │ │ │ -
255 constexpr reverse_iterator rbegin() noexcept
│ │ │ │ -
256 {
│ │ │ │ -
257 return reverse_iterator{begin()+size()};
│ │ │ │ -
258 }
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
│ │ │ │ -
261 constexpr const_reverse_iterator rbegin() const noexcept
│ │ │ │ -
262 {
│ │ │ │ - │ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265
│ │ │ │ -
│ │ │ │ -
267 constexpr const_reverse_iterator crbegin() const noexcept
│ │ │ │ -
268 {
│ │ │ │ - │ │ │ │ -
270 }
│ │ │ │ -
│ │ │ │ -
271
│ │ │ │ -
│ │ │ │ -
273 constexpr iterator end() noexcept
│ │ │ │ -
274 {
│ │ │ │ -
275 return storage_.begin()+size();
│ │ │ │ -
276 }
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
│ │ │ │ -
279 constexpr const_iterator end() const noexcept
│ │ │ │ -
280 {
│ │ │ │ -
281 return storage_.begin()+size();
│ │ │ │ -
282 }
│ │ │ │ -
│ │ │ │ -
283
│ │ │ │ -
│ │ │ │ -
285 constexpr const_iterator cend() const noexcept
│ │ │ │ -
286 {
│ │ │ │ -
287 return storage_.cbegin()+size();
│ │ │ │ -
288 }
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
│ │ │ │ -
291 constexpr reverse_iterator rend() noexcept
│ │ │ │ -
292 {
│ │ │ │ -
293 return reverse_iterator{begin()};
│ │ │ │ -
294 }
│ │ │ │ -
│ │ │ │ -
295
│ │ │ │ -
│ │ │ │ -
297 constexpr const_reverse_iterator rend() const noexcept
│ │ │ │ -
298 {
│ │ │ │ - │ │ │ │ -
300 }
│ │ │ │ -
│ │ │ │ -
301
│ │ │ │ -
│ │ │ │ -
303 constexpr const_reverse_iterator crend() const noexcept
│ │ │ │ -
304 {
│ │ │ │ - │ │ │ │ -
306 }
│ │ │ │ -
│ │ │ │ -
307
│ │ │ │ -
│ │ │ │ -
313 constexpr reference at(size_type i)
│ │ │ │ -
314 {
│ │ │ │ -
315 if (!(i < size()))
│ │ │ │ -
316 throw std::out_of_range("Index out of range");
│ │ │ │ -
317 return storage_[i];
│ │ │ │ -
318 }
│ │ │ │ -
│ │ │ │ -
319
│ │ │ │ -
│ │ │ │ -
321 constexpr const_reference at(size_type i) const
│ │ │ │ -
322 {
│ │ │ │ -
323 if (!(i < size()))
│ │ │ │ -
324 throw std::out_of_range("Index out of range");
│ │ │ │ -
325 return storage_[i];
│ │ │ │ -
326 }
│ │ │ │ +
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>
│ │ │ │ +
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;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
86 {
│ │ │ │ +
87 return ResultType(static_cast<Args>(nullptr)...);
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ -
329 constexpr reference operator[] (size_type i) noexcept
│ │ │ │ -
330 {
│ │ │ │ -
331 CHECKSIZE(size_>i);
│ │ │ │ -
332 return storage_[i];
│ │ │ │ -
333 }
│ │ │ │ -
│ │ │ │ -
334
│ │ │ │ -
│ │ │ │ -
336 constexpr const_reference operator[] (size_type i) const noexcept
│ │ │ │ -
337 {
│ │ │ │ -
338 CHECKSIZE(size_>i);
│ │ │ │ -
339 return storage_[i];
│ │ │ │ -
340 }
│ │ │ │ -
│ │ │ │ -
341
│ │ │ │ -
│ │ │ │ -
343 constexpr reference front() noexcept
│ │ │ │ -
344 {
│ │ │ │ -
345 CHECKSIZE(size_>0);
│ │ │ │ -
346 return storage_[0];
│ │ │ │ -
347 }
│ │ │ │ -
│ │ │ │ -
348
│ │ │ │ -
│ │ │ │ -
350 constexpr const_reference front() const noexcept
│ │ │ │ -
351 {
│ │ │ │ -
352 CHECKSIZE(size_>0);
│ │ │ │ -
353 return storage_[0];
│ │ │ │ -
354 }
│ │ │ │ -
│ │ │ │ -
355
│ │ │ │ -
│ │ │ │ -
357 constexpr reference back() noexcept
│ │ │ │ -
358 {
│ │ │ │ -
359 CHECKSIZE(size_>0);
│ │ │ │ -
360 return storage_[size_-1];
│ │ │ │ -
361 }
│ │ │ │ -
│ │ │ │ -
362
│ │ │ │ -
│ │ │ │ -
364 constexpr const_reference back() const noexcept
│ │ │ │ -
365 {
│ │ │ │ -
366 CHECKSIZE(size_>0);
│ │ │ │ -
367 return storage_[size_-1];
│ │ │ │ -
368 }
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
│ │ │ │ -
371 constexpr pointer data() noexcept
│ │ │ │ -
372 {
│ │ │ │ -
373 return storage_.data();
│ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
│ │ │ │ -
377 constexpr const_pointer data() const noexcept
│ │ │ │ -
378 {
│ │ │ │ -
379 return storage_.data();
│ │ │ │ -
380 }
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
│ │ │ │ -
387 constexpr size_type size() const noexcept
│ │ │ │ -
388 {
│ │ │ │ -
389 return size_;
│ │ │ │ -
390 }
│ │ │ │ -
│ │ │ │ -
391
│ │ │ │ -
│ │ │ │ -
393 constexpr bool empty() const noexcept
│ │ │ │ -
394 {
│ │ │ │ -
395 return size_==0;
│ │ │ │ -
396 }
│ │ │ │ -
│ │ │ │ -
397
│ │ │ │ -
│ │ │ │ -
399 static constexpr size_type capacity() noexcept
│ │ │ │ -
400 {
│ │ │ │ -
401 return n;
│ │ │ │ -
402 }
│ │ │ │ -
│ │ │ │ -
403
│ │ │ │ -
│ │ │ │ -
405 static constexpr size_type max_size() noexcept
│ │ │ │ -
406 {
│ │ │ │ -
407 return n;
│ │ │ │ -
408 }
│ │ │ │ -
│ │ │ │ -
409
│ │ │ │ -
│ │ │ │ -
415 constexpr void fill(const value_type& value)
│ │ │ │ -
416 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
│ │ │ │ -
417 {
│ │ │ │ -
418 for (size_type i=0; i<size(); ++i)
│ │ │ │ -
419 storage_[i] = value;
│ │ │ │ -
420 }
│ │ │ │ -
│ │ │ │ -
421
│ │ │ │ -
│ │ │ │ -
423 void swap(ReservedVector& other)
│ │ │ │ -
424 noexcept(std::is_nothrow_swappable_v<value_type>)
│ │ │ │ -
425 {
│ │ │ │ -
426 using std::swap;
│ │ │ │ -
427 swap(storage_, other.storage_);
│ │ │ │ -
428 swap(size_, other.size_);
│ │ │ │ -
429 }
│ │ │ │ -
│ │ │ │ -
430
│ │ │ │ -
│ │ │ │ -
434 friend std::ostream& operator<< (std::ostream& s, const ReservedVector& v)
│ │ │ │ -
435 {
│ │ │ │ -
436 for (size_type i=0; i<v.size(); i++)
│ │ │ │ -
437 s << v[i] << " ";
│ │ │ │ -
438 return s;
│ │ │ │ -
439 }
│ │ │ │ -
│ │ │ │ -
440
│ │ │ │ -
│ │ │ │ -
441 inline friend std::size_t hash_value(const ReservedVector& v) noexcept
│ │ │ │ -
442 {
│ │ │ │ -
443 return hash_range(v.storage_.data(),v.storage_.data()+v.size_);
│ │ │ │ -
444 }
│ │ │ │ -
│ │ │ │ -
445
│ │ │ │ -
446 private:
│ │ │ │ -
447 storage_type storage_;
│ │ │ │ -
448 size_type size_;
│ │ │ │ +
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
│ │ │ │ -
451}
│ │ │ │ -
452
│ │ │ │ - │ │ │ │ -
454
│ │ │ │ -
455#undef CHECKSIZE
│ │ │ │ -
456
│ │ │ │ -
457#endif // DUNE_COMMON_RESERVEDVECTOR_HH
│ │ │ │ -
Support for calculating hash values of objects.
│ │ │ │ -
#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
│ │ │ │ -
#define CHECKSIZE(X)
Definition reservedvector.hh:25
│ │ │ │ +
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
│ │ │ │
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
│ │ │ │ -
A Vector class with statically reserved memory.
Definition reservedvector.hh:47
│ │ │ │ -
constexpr const_reference front() const noexcept
Returns const reference to first element of vector.
Definition reservedvector.hh:350
│ │ │ │ -
constexpr const_reverse_iterator crend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:303
│ │ │ │ -
constexpr ReservedVector(size_type count) noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs the vector with count elements that will be default-initialized.
Definition reservedvector.hh:89
│ │ │ │ -
constexpr void fill(const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Fill the container with the value.
Definition reservedvector.hh:415
│ │ │ │ -
storage_type::pointer pointer
Pointer to T.
Definition reservedvector.hh:57
│ │ │ │ -
constexpr reverse_iterator rbegin() noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:255
│ │ │ │ -
constexpr bool operator<=(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:165
│ │ │ │ -
constexpr bool operator>(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:159
│ │ │ │ -
constexpr const_reverse_iterator rend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:297
│ │ │ │ -
static constexpr size_type max_size() noexcept
Returns the maximum length of the vector.
Definition reservedvector.hh:405
│ │ │ │ -
constexpr const_reference at(size_type i) const
Returns a const reference to the i'th element.
Definition reservedvector.hh:321
│ │ │ │ -
std::reverse_iterator< iterator > reverse_iterator
Reverse iterator.
Definition reservedvector.hh:73
│ │ │ │ -
constexpr iterator end() noexcept
Returns an iterator pointing to the end of the vector.
Definition reservedvector.hh:273
│ │ │ │ -
constexpr bool operator<(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:149
│ │ │ │ -
constexpr size_type size() const noexcept
Returns number of elements in the vector.
Definition reservedvector.hh:387
│ │ │ │ -
constexpr bool empty() const noexcept
Returns true if vector has no elements.
Definition reservedvector.hh:393
│ │ │ │ -
constexpr iterator begin() noexcept
Returns a iterator pointing to the beginning of the vector.
Definition reservedvector.hh:237
│ │ │ │ -
constexpr void push_back(const value_type &t) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Appends an element to the end of a vector, up to the maximum size n, O(1) time.
Definition reservedvector.hh:194
│ │ │ │ -
constexpr reverse_iterator rend() noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:291
│ │ │ │ -
storage_type::iterator iterator
Iterator used to iterate through a vector.
Definition reservedvector.hh:69
│ │ │ │ -
constexpr const_iterator cbegin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition reservedvector.hh:249
│ │ │ │ -
std::reverse_iterator< const_iterator > const_reverse_iterator
Const reverse iterator.
Definition reservedvector.hh:75
│ │ │ │ -
constexpr pointer data() noexcept
Returns pointer to the underlying memory.
Definition reservedvector.hh:371
│ │ │ │ -
constexpr const_reference back() const noexcept
Returns const reference to last element of vector.
Definition reservedvector.hh:364
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const ReservedVector &v)
Send ReservedVector to an output stream.
Definition reservedvector.hh:434
│ │ │ │ -
constexpr bool operator==(const ReservedVector &that) const noexcept
Compares the values in the vector this with that for equality.
Definition reservedvector.hh:132
│ │ │ │ -
constexpr void pop_back() noexcept
Erases the last element of the vector, O(1) time.
Definition reservedvector.hh:227
│ │ │ │ -
friend std::size_t hash_value(const ReservedVector &v) noexcept
Definition reservedvector.hh:441
│ │ │ │ -
storage_type::difference_type difference_type
A signed integral type.
Definition reservedvector.hh:67
│ │ │ │ -
constexpr const_iterator end() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition reservedvector.hh:279
│ │ │ │ -
constexpr void clear() noexcept
Erases all elements.
Definition reservedvector.hh:181
│ │ │ │ -
constexpr ReservedVector() noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs an empty vector.
Definition reservedvector.hh:82
│ │ │ │ -
storage_type::const_iterator const_iterator
Const iterator used to iterate through a vector.
Definition reservedvector.hh:71
│ │ │ │ -
reference emplace_back(Args &&... args) noexcept(std::is_nothrow_constructible_v< value_type, decltype(args)... >)
Appends an element to the end of a vector by constructing it in place.
Definition reservedvector.hh:211
│ │ │ │ -
storage_type::size_type size_type
An unsigned integral type.
Definition reservedvector.hh:65
│ │ │ │ -
constexpr bool operator>=(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:171
│ │ │ │ -
storage_type::const_reference const_reference
Const reference to T.
Definition reservedvector.hh:63
│ │ │ │ -
void swap(ReservedVector &other) noexcept(std::is_nothrow_swappable_v< value_type >)
Swap the content with another vector.
Definition reservedvector.hh:423
│ │ │ │ -
constexpr ReservedVector(InputIt first, InputIt last) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector()))
Constructs the vector from an iterator range [first,last)
Definition reservedvector.hh:110
│ │ │ │ -
constexpr const_pointer data() const noexcept
Returns const pointer to the underlying memory.
Definition reservedvector.hh:377
│ │ │ │ -
constexpr reference at(size_type i)
Returns reference to the i'th element.
Definition reservedvector.hh:313
│ │ │ │ -
constexpr const_iterator cend() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition reservedvector.hh:285
│ │ │ │ -
constexpr reference back() noexcept
Returns reference to last element of vector.
Definition reservedvector.hh:357
│ │ │ │ -
constexpr const_reverse_iterator rbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:261
│ │ │ │ -
storage_type::value_type value_type
The type of object, T, stored in the vector.
Definition reservedvector.hh:55
│ │ │ │ -
constexpr const_iterator begin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition reservedvector.hh:243
│ │ │ │ -
constexpr ReservedVector(size_type count, const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(count)))
Constructs the vector with count copies of elements with value value.
Definition reservedvector.hh:98
│ │ │ │ -
constexpr reference operator[](size_type i) noexcept
Returns reference to the i'th element.
Definition reservedvector.hh:329
│ │ │ │ -
constexpr reference front() noexcept
Returns reference to first element of vector.
Definition reservedvector.hh:343
│ │ │ │ -
storage_type::const_pointer const_pointer
Const pointer to T.
Definition reservedvector.hh:59
│ │ │ │ -
constexpr ReservedVector(std::initializer_list< value_type > const &l) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(l.begin(), l.end())))
Constructs the vector from an initializer list.
Definition reservedvector.hh:121
│ │ │ │ -
constexpr bool operator!=(const ReservedVector &that) const noexcept
Compares the values in the vector this with that for not equality.
Definition reservedvector.hh:143
│ │ │ │ -
constexpr void resize(size_type s) noexcept
Specifies a new size for the vector.
Definition reservedvector.hh:187
│ │ │ │ -
static constexpr size_type capacity() noexcept
Returns current capacity (allocated memory) of the vector.
Definition reservedvector.hh:399
│ │ │ │ -
storage_type::reference reference
Reference to T.
Definition reservedvector.hh:61
│ │ │ │ -
constexpr const_reverse_iterator crbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:267
│ │ │ │ -
constexpr void push_back(value_type &&t) noexcept(std::is_nothrow_move_assignable_v< value_type >)
Appends an element to the end of a vector by moving the value, up to the maximum size n,...
Definition reservedvector.hh:202
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,633 +1,515 @@ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -reservedvector.hh │ │ │ │ │ +tupleutility.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (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_RESERVEDVECTOR_HH │ │ │ │ │ -6#define DUNE_COMMON_RESERVEDVECTOR_HH │ │ │ │ │ -7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_a_s_h_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22#ifdef CHECK_RESERVEDVECTOR │ │ │ │ │ -23#define CHECKSIZE(X) assert(X) │ │ │ │ │ -24#else │ │ │ │ │ -_2_5#define CHECKSIZE(X) {} │ │ │ │ │ -26#endif │ │ │ │ │ -27 │ │ │ │ │ -28namespace _D_u_n_e │ │ │ │ │ -29{ │ │ │ │ │ -45 template │ │ │ │ │ -_4_6 class _R_e_s_e_r_v_e_d_V_e_c_t_o_r │ │ │ │ │ -47 { │ │ │ │ │ -48 using storage_type = std::array; │ │ │ │ │ -49 │ │ │ │ │ -50 public: │ │ │ │ │ -51 │ │ │ │ │ -_5_5 typedef typename storage_type::value_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_5_7 typedef typename storage_type::pointer _p_o_i_n_t_e_r; │ │ │ │ │ -_5_9 typedef typename storage_type::const_pointer _c_o_n_s_t___p_o_i_n_t_e_r; │ │ │ │ │ -_6_1 typedef typename storage_type::reference _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_3 typedef typename storage_type::const_reference _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_5 typedef typename storage_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -_6_7 typedef typename storage_type::difference_type _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -_6_9 typedef typename storage_type::iterator _i_t_e_r_a_t_o_r; │ │ │ │ │ -_7_1 typedef typename storage_type::const_iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -_7_3 typedef std::reverse_iterator _r_e_v_e_r_s_e___i_t_e_r_a_t_o_r; │ │ │ │ │ -_7_5 typedef std::reverse_iterator _c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r; │ │ │ │ │ -76 │ │ │ │ │ -_8_2 constexpr _R_e_s_e_r_v_e_d_V_e_c_t_o_r() │ │ │ │ │ -83 noexcept(_s_t_d::is_nothrow_default_constructible_v<_v_a_l_u_e___t_y_p_e>) │ │ │ │ │ -84 : storage_() │ │ │ │ │ -85 , size_(0) │ │ │ │ │ -86 {} │ │ │ │ │ -87 │ │ │ │ │ -_8_9 explicit constexpr _R_e_s_e_r_v_e_d_V_e_c_t_o_r(_s_i_z_e___t_y_p_e count) │ │ │ │ │ -90 noexcept(std::is_nothrow_default_constructible_v) │ │ │ │ │ -91 : storage_() │ │ │ │ │ -92 , size_(count) │ │ │ │ │ -93 { │ │ │ │ │ -94 assert(count <= n); │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -_9_8 constexpr _R_e_s_e_r_v_e_d_V_e_c_t_o_r(_s_i_z_e___t_y_p_e count, const _v_a_l_u_e___t_y_p_e& value) │ │ │ │ │ -99 noexcept(std::is_nothrow_copy_assignable_v && │ │ │ │ │ -100 noexcept(_R_e_s_e_r_v_e_d_V_e_c_t_o_r(count))) │ │ │ │ │ -101 : _R_e_s_e_r_v_e_d_V_e_c_t_o_r(count) │ │ │ │ │ -102 { │ │ │ │ │ -103 for (_s_i_z_e___t_y_p_e i=0; i::value_type, _v_a_l_u_e___t_y_p_e>, int> = 0> │ │ │ │ │ -_1_1_0 constexpr _R_e_s_e_r_v_e_d_V_e_c_t_o_r(InputIt first, InputIt last) │ │ │ │ │ -111 noexcept(std::is_nothrow_copy_assignable_v && │ │ │ │ │ -112 noexcept(_R_e_s_e_r_v_e_d_V_e_c_t_o_r())) │ │ │ │ │ -113 : _R_e_s_e_r_v_e_d_V_e_c_t_o_r() │ │ │ │ │ -114 { │ │ │ │ │ -115 for (_s_i_z_e___t_y_p_e i=0; i const& l) │ │ │ │ │ -122 noexcept(std::is_nothrow_copy_assignable_v && │ │ │ │ │ -123 noexcept(_R_e_s_e_r_v_e_d_V_e_c_t_o_r(l.begin(),l.end()))) │ │ │ │ │ -124 : _R_e_s_e_r_v_e_d_V_e_c_t_o_r(l.begin(),l.end()) │ │ │ │ │ -125 {} │ │ │ │ │ -126 │ │ │ │ │ -_1_3_2 constexpr bool _o_p_e_r_a_t_o_r_=_=_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -133 { │ │ │ │ │ -134 if (_s_i_z_e() != that.size()) │ │ │ │ │ -135 return false; │ │ │ │ │ -136 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); ++i) │ │ │ │ │ -137 if (!(storage_[i]==that.storage_[i])) │ │ │ │ │ -138 return false; │ │ │ │ │ -139 return true; │ │ │ │ │ -140 } │ │ │ │ │ -141 │ │ │ │ │ -_1_4_3 constexpr bool _o_p_e_r_a_t_o_r_!_=_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -144 { │ │ │ │ │ -145 return !(*this == that); │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 constexpr bool _o_p_e_r_a_t_o_r_<_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -150 { │ │ │ │ │ -151 for (_s_i_z_e___t_y_p_e i=0; i_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -160 { │ │ │ │ │ -161 return that < *this; │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -_1_6_5 constexpr bool _o_p_e_r_a_t_o_r_<_=_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -166 { │ │ │ │ │ -167 return !(*this > that); │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -_1_7_1 constexpr bool _o_p_e_r_a_t_o_r_>_=_ (const _R_e_s_e_r_v_e_d_V_e_c_t_o_r& that) const noexcept │ │ │ │ │ -172 { │ │ │ │ │ -173 return !(*this < that); │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -_1_8_1 constexpr void _c_l_e_a_r() noexcept │ │ │ │ │ -182 { │ │ │ │ │ -183 size_ = 0; │ │ │ │ │ -184 } │ │ │ │ │ -185 │ │ │ │ │ -_1_8_7 constexpr void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e s) noexcept │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_TUPLE_UTILITY_HH │ │ │ │ │ +7#define DUNE_TUPLE_UTILITY_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e { │ │ │ │ │ +18 │ │ │ │ │ +41 template │ │ │ │ │ +_4_2 decltype(auto) _a_p_p_l_y_P_a_r_t_i_a_l(F&& f, ArgTuple&& args, std::integer_sequence /*indices*/) │ │ │ │ │ +43 { │ │ │ │ │ +44 return f(std::get(args)...); │ │ │ │ │ +45 } │ │ │ │ │ +46 │ │ │ │ │ +47 template │ │ │ │ │ +_4_8 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ │ +49 { │ │ │ │ │ +_5_0 typedef typename std::add_const::type& _C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_5_1 typedef T& _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_5_2 typedef const typename std::remove_const::type& _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ │ +53 }; │ │ │ │ │ +54 │ │ │ │ │ +55 template │ │ │ │ │ +_5_6 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ │ +57 { │ │ │ │ │ +_5_8 typedef typename std::add_const::type* _C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_5_9 typedef T* _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_6_0 typedef T* _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ │ +61 }; │ │ │ │ │ +62 │ │ │ │ │ +63 template │ │ │ │ │ +_6_4 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ │ +65 { │ │ │ │ │ +_6_6 typedef T& _C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_6_7 typedef T& _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ │ +_6_8 typedef T& _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ │ +69 }; │ │ │ │ │ +70 │ │ │ │ │ +78 template │ │ │ │ │ +_7_9 struct _N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r; │ │ │ │ │ +80 │ │ │ │ │ +81 template │ │ │ │ │ +_8_2 struct _N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r<_s_t_d::tuple > │ │ │ │ │ +83 { │ │ │ │ │ +_8_4 typedef std::tuple _R_e_s_u_l_t_T_y_p_e; │ │ │ │ │ +_8_5 static _R_e_s_u_l_t_T_y_p_e _a_p_p_l_y() │ │ │ │ │ +86 { │ │ │ │ │ +87 return _R_e_s_u_l_t_T_y_p_e(static_cast(nullptr)...); │ │ │ │ │ +88 } │ │ │ │ │ +89 }; │ │ │ │ │ +90 │ │ │ │ │ +115 template