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

This file implements a quadratic diagonal matrix of fixed size. │ │ │ │ +

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

│ │ │ │
#include <algorithm>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/boundschecking.hh>
│ │ │ │ -#include <dune/common/densematrix.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/genericiterator.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include "genericiterator.hh"
│ │ │ │ +#include "ftraits.hh"
│ │ │ │ +#include "matvectraits.hh"
│ │ │ │ +#include "promotiontraits.hh"
│ │ │ │ +#include "dotproduct.hh"
│ │ │ │ +#include "boundschecking.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::DiagonalMatrix< K, n >
 A diagonal matrix of static size. More...
struct  Dune::FieldTraits< DenseVector< V > >
 
struct  Dune::FieldTraits< DiagonalMatrix< K, n > >
class  Dune::DenseIterator< C, T, R >
 Generic iterator class for dense vector and matrix implementations. More...
 
class  Dune::DiagonalMatrixWrapper< DiagonalMatrixType >
 
class  Dune::DiagonalRowVectorConst< K, n >
 
class  Dune::DiagonalRowVector< K, n >
 
struct  Dune::const_reference< DiagonalRowVector< K, n > >
 
struct  Dune::const_reference< DiagonalRowVectorConst< K, n > >
 
struct  Dune::mutable_reference< DiagonalRowVector< K, n > >
 
struct  Dune::mutable_reference< DiagonalRowVectorConst< K, n > >
 
class  Dune::ContainerWrapperIterator< CW, T, R >
 Iterator class for sparse vector-like containers. More...
 
struct  Dune::DenseMatrixAssigner< DenseMatrix, DiagonalMatrix< field, N > >
class  Dune::DenseVector< V >
 Interface for a class of dense vectors over a given field. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ -

This file implements a quadratic diagonal matrix of fixed size.

│ │ │ │ +

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

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,58 +1,41 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -diagonalmatrix.hh File Reference │ │ │ │ │ -This file implements a quadratic diagonal matrix of fixed size. _M_o_r_e_._._. │ │ │ │ │ +densevector.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 the dense vector interface, with an exchangeable storage class. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ #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_/_d_e_n_s_e_m_a_t_r_i_x_._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_m_a_t_r_i_x_._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_/_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_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h" │ │ │ │ │ +#include "_f_t_r_a_i_t_s_._h_h" │ │ │ │ │ +#include "_m_a_t_v_e_c_t_r_a_i_t_s_._h_h" │ │ │ │ │ +#include "_p_r_o_m_o_t_i_o_n_t_r_a_i_t_s_._h_h" │ │ │ │ │ +#include "_d_o_t_p_r_o_d_u_c_t_._h_h" │ │ │ │ │ +#include "_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._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_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _> │ │ │ │ │ -  A diagonal matrix of static size. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_V_e_c_t_o_r_<_ _V_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_<_ _C_,_ _T_,_ _R_ _> │ │ │ │ │ +  Generic iterator class for dense vector and matrix implementations. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_ _K_,_ _n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_ _K_,_ _n_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_ _C_W_,_ _T_,_ _R_ _> │ │ │ │ │ -  Iterator class for sparse vector-like containers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _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_,_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N_ _>_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_<_ _V_ _> │ │ │ │ │ +  _I_n_t_e_r_f_a_c_e for a class of dense vectors over a given field. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_f_v_m_e_t_a │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file implements a quadratic diagonal matrix of fixed size. │ │ │ │ │ +Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: diagonalmatrix.hh Source File │ │ │ │ +dune-common: densevector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1353 +74,830 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
diagonalmatrix.hh
│ │ │ │ +
densevector.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_DIAGONAL_MATRIX_HH
│ │ │ │ -
6#define DUNE_DIAGONAL_MATRIX_HH
│ │ │ │ +
5#ifndef DUNE_DENSEVECTOR_HH
│ │ │ │ +
6#define DUNE_DENSEVECTOR_HH
│ │ │ │
7
│ │ │ │ -
12#include <algorithm>
│ │ │ │ -
13#include <cassert>
│ │ │ │ -
14#include <cmath>
│ │ │ │ -
15#include <complex>
│ │ │ │ -
16#include <cstddef>
│ │ │ │ -
17#include <initializer_list>
│ │ │ │ -
18#include <iostream>
│ │ │ │ -
19#include <memory>
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <limits>
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include "genericiterator.hh"
│ │ │ │ +
13#include "ftraits.hh"
│ │ │ │ +
14#include "matvectraits.hh"
│ │ │ │ +
15#include "promotiontraits.hh"
│ │ │ │ +
16#include "dotproduct.hh"
│ │ │ │ +
17#include "boundschecking.hh"
│ │ │ │ +
18
│ │ │ │ +
19namespace Dune {
│ │ │ │
20
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31
│ │ │ │ -
32 template< class K, int n > class DiagonalRowVectorConst;
│ │ │ │ -
33 template< class K, int n > class DiagonalRowVector;
│ │ │ │ -
34 template< class DiagonalMatrixType > class DiagonalMatrixWrapper;
│ │ │ │ -
35 template< class C, class T, class R> class ContainerWrapperIterator;
│ │ │ │ -
36
│ │ │ │ -
51 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
53 {
│ │ │ │ - │ │ │ │ -
55
│ │ │ │ -
56 public:
│ │ │ │ -
57 //===== type definitions and constants
│ │ │ │ -
58
│ │ │ │ -
60 typedef K value_type;
│ │ │ │ - │ │ │ │ -
62
│ │ │ │ -
64 typedef K block_type;
│ │ │ │ -
65
│ │ │ │ -
67 typedef std::size_t size_type;
│ │ │ │ -
68
│ │ │ │ -
70 constexpr static int blocklevel = 1;
│ │ │ │ -
71
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
79
│ │ │ │ -
81 constexpr static int rows = n;
│ │ │ │ -
83 constexpr static int cols = n;
│ │ │ │ -
84
│ │ │ │ -
85 //==== size
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ -
87 static constexpr size_type size ()
│ │ │ │ -
88 {
│ │ │ │ -
89 return rows;
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
92 //===== constructors
│ │ │ │ -
93
│ │ │ │ -
95 constexpr DiagonalMatrix() = default;
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ -
98 DiagonalMatrix (const K& k)
│ │ │ │ -
99 : diag_(k)
│ │ │ │ -
100 {}
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
104 : diag_(diag)
│ │ │ │ -
105 {}
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
│ │ │ │ -
115 DiagonalMatrix (std::initializer_list<K> const &l)
│ │ │ │ -
116 {
│ │ │ │ -
117 std::copy_n(l.begin(), std::min(static_cast<std::size_t>(rows),
│ │ │ │ -
118 l.size()),
│ │ │ │ -
119 diag_.begin());
│ │ │ │ +
21 // forward declaration of template
│ │ │ │ +
22 template<typename V> class DenseVector;
│ │ │ │ +
23
│ │ │ │ +
24 template<typename V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
26 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
29 };
│ │ │ │ +
│ │ │ │ +
30
│ │ │ │ +
│ │ │ │ +
40 namespace fvmeta
│ │ │ │ +
41 {
│ │ │ │ +
46 template<class K>
│ │ │ │ +
47 inline typename FieldTraits<K>::real_type absreal (const K& k)
│ │ │ │ +
48 {
│ │ │ │ +
49 using std::abs;
│ │ │ │ +
50 return abs(k);
│ │ │ │ +
51 }
│ │ │ │ +
52
│ │ │ │ +
57 template<class K>
│ │ │ │ +
58 inline typename FieldTraits<K>::real_type absreal (const std::complex<K>& c)
│ │ │ │ +
59 {
│ │ │ │ +
60 using std::abs;
│ │ │ │ +
61 return abs(c.real()) + abs(c.imag());
│ │ │ │ +
62 }
│ │ │ │ +
63
│ │ │ │ +
68 template<class K>
│ │ │ │ +
69 inline typename FieldTraits<K>::real_type abs2 (const K& k)
│ │ │ │ +
70 {
│ │ │ │ +
71 return k*k;
│ │ │ │ +
72 }
│ │ │ │ +
73
│ │ │ │ +
78 template<class K>
│ │ │ │ +
79 inline typename FieldTraits<K>::real_type abs2 (const std::complex<K>& c)
│ │ │ │ +
80 {
│ │ │ │ +
81 return c.real()*c.real() + c.imag()*c.imag();
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
88 template<class K, bool isInteger = std::numeric_limits<K>::is_integer>
│ │ │ │ +
89 struct Sqrt
│ │ │ │ +
90 {
│ │ │ │ +
91 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
92 {
│ │ │ │ +
93 using std::sqrt;
│ │ │ │ +
94 return sqrt(k);
│ │ │ │ +
95 }
│ │ │ │ +
96 };
│ │ │ │ +
97
│ │ │ │ +
102 template<class K>
│ │ │ │ +
103 struct Sqrt<K, true>
│ │ │ │ +
104 {
│ │ │ │ +
105 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
106 {
│ │ │ │ +
107 using std::sqrt;
│ │ │ │ +
108 return typename FieldTraits<K>::real_type(sqrt(double(k)));
│ │ │ │ +
109 }
│ │ │ │ +
110 };
│ │ │ │ +
111
│ │ │ │ +
116 template<class K>
│ │ │ │ +
117 inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
118 {
│ │ │ │ +
119 return Sqrt<K>::sqrt(k);
│ │ │ │
120 }
│ │ │ │ -
│ │ │ │
121
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
124 {
│ │ │ │ -
125 diag_ = k;
│ │ │ │ -
126 return *this;
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
│ │ │ │ -
130 bool identical(const DiagonalMatrix<K,n>& other) const
│ │ │ │ -
131 {
│ │ │ │ -
132 return (this==&other);
│ │ │ │ -
133 }
│ │ │ │ +
122 }
│ │ │ │
│ │ │ │ +
123
│ │ │ │ +
128 template<class C, class T, class R =T&>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
130 public Dune::RandomAccessIteratorFacade<DenseIterator<C,T,R>,T, R, std::ptrdiff_t>
│ │ │ │ +
131 {
│ │ │ │ +
132 friend class DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type >;
│ │ │ │ +
133 friend class DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type >;
│ │ │ │
134
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
138 return *this;
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
141 //===== iterator interface to rows of the matrix
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
150
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
153 {
│ │ │ │ -
154 return Iterator(WrapperType(this),0);
│ │ │ │ -
155 }
│ │ │ │ +
135 typedef DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type > MutableIterator;
│ │ │ │ +
136 typedef DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type > ConstIterator;
│ │ │ │ +
137 public:
│ │ │ │ +
138
│ │ │ │ +
142 typedef std::ptrdiff_t DifferenceType;
│ │ │ │ +
143
│ │ │ │ +
147 typedef typename C::size_type SizeType;
│ │ │ │ +
148
│ │ │ │ +
149 // Constructors needed by the base iterators.
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
151 : container_(0), position_()
│ │ │ │ +
152 {}
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
155 : container_(&cont), position_(pos)
│ │ │ │ +
156 {}
│ │ │ │
│ │ │ │ -
156
│ │ │ │ +
157
│ │ │ │
│ │ │ │ - │ │ │ │ -
159 {
│ │ │ │ -
160 return Iterator(WrapperType(this),n);
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
166 {
│ │ │ │ -
167 return Iterator(WrapperType(this),n-1);
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
173 {
│ │ │ │ -
174 return Iterator(WrapperType(this),-1);
│ │ │ │ -
175 }
│ │ │ │ + │ │ │ │ +
159 : container_(other.container_), position_(other.position_)
│ │ │ │ +
160 {}
│ │ │ │ +
│ │ │ │ +
161
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
163 : container_(other.container_), position_(other.position_)
│ │ │ │ +
164 {}
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
166 // Methods needed by the forward iterator
│ │ │ │ +
│ │ │ │ +
167 bool equals(const MutableIterator &other) const
│ │ │ │ +
168 {
│ │ │ │ +
169 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
│ │ │ │ +
173 bool equals(const ConstIterator & other) const
│ │ │ │ +
174 {
│ │ │ │ +
175 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
176 }
│ │ │ │
│ │ │ │ -
176
│ │ │ │
177
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
186
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 return ConstIterator(WrapperType(this),0);
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
195 {
│ │ │ │ -
196 return ConstIterator(WrapperType(this),n);
│ │ │ │ -
197 }
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
202 {
│ │ │ │ -
203 return ConstIterator(WrapperType(this),n-1);
│ │ │ │ +
│ │ │ │ +
178 R dereference() const {
│ │ │ │ +
179 return container_->operator[](position_);
│ │ │ │ +
180 }
│ │ │ │ +
│ │ │ │ +
181
│ │ │ │ +
│ │ │ │ +
182 void increment(){
│ │ │ │ +
183 ++position_;
│ │ │ │ +
184 }
│ │ │ │ +
│ │ │ │ +
185
│ │ │ │ +
186 // Additional function needed by BidirectionalIterator
│ │ │ │ +
│ │ │ │ +
187 void decrement(){
│ │ │ │ +
188 --position_;
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │ +
190
│ │ │ │ +
191 // Additional function needed by RandomAccessIterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
193 return container_->operator[](position_+i);
│ │ │ │ +
194 }
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 position_=position_+n;
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199
│ │ │ │ +
│ │ │ │ +
200 DifferenceType distanceTo(DenseIterator<const typename std::remove_const<C>::type,const typename std::remove_const<T>::type> other) const
│ │ │ │ +
201 {
│ │ │ │ +
202 assert(other.container_==container_);
│ │ │ │ +
203 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
│ │ │ │
204 }
│ │ │ │
│ │ │ │
205
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
209 {
│ │ │ │ -
210 return ConstIterator(WrapperType(this),-1);
│ │ │ │ -
211 }
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213
│ │ │ │ -
214
│ │ │ │ -
215 //===== vector space arithmetic
│ │ │ │ -
216
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
219 {
│ │ │ │ -
220 diag_ += y.diag_;
│ │ │ │ -
221 return *this;
│ │ │ │ -
222 }
│ │ │ │ -
│ │ │ │ -
223
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
226 {
│ │ │ │ -
227 diag_ -= y.diag_;
│ │ │ │ -
228 return *this;
│ │ │ │ -
229 }
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
233 {
│ │ │ │ -
234 diag_ += k;
│ │ │ │ -
235 return *this;
│ │ │ │ -
236 }
│ │ │ │ -
│ │ │ │ -
237
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
240 {
│ │ │ │ -
241 diag_ -= k;
│ │ │ │ -
242 return *this;
│ │ │ │ -
243 }
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
247 {
│ │ │ │ -
248 diag_ *= k;
│ │ │ │ -
249 return *this;
│ │ │ │ -
250 }
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
206 DifferenceType distanceTo(DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type> other) const
│ │ │ │ +
207 {
│ │ │ │ +
208 assert(other.container_==container_);
│ │ │ │ +
209 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
│ │ │ │ +
210 }
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
214 {
│ │ │ │ +
215 return this->position_;
│ │ │ │ +
216 }
│ │ │ │ +
│ │ │ │ +
217
│ │ │ │ +
218 private:
│ │ │ │ +
219 C *container_;
│ │ │ │ +
220 SizeType position_;
│ │ │ │ +
221 };
│ │ │ │ +
│ │ │ │ +
222
│ │ │ │ +
227 template<typename V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ + │ │ │ │ +
231 // typedef typename Traits::value_type K;
│ │ │ │ +
232
│ │ │ │ +
233 // Curiously recurring template pattern
│ │ │ │ +
234 V & asImp() { return static_cast<V&>(*this); }
│ │ │ │ +
235 const V & asImp() const { return static_cast<const V&>(*this); }
│ │ │ │ +
236
│ │ │ │ +
237 protected:
│ │ │ │ +
238 // construction allowed to derived classes only
│ │ │ │ +
239 constexpr DenseVector() = default;
│ │ │ │ +
240 // copying only allowed by derived classes
│ │ │ │ +
241 DenseVector(const DenseVector&) = default;
│ │ │ │ +
242
│ │ │ │ +
243 public:
│ │ │ │ +
244 //===== type definitions and constants
│ │ │ │ +
245
│ │ │ │ +
247 typedef typename Traits::derived_type derived_type;
│ │ │ │ +
248
│ │ │ │ +
250 typedef typename Traits::value_type value_type;
│ │ │ │
251
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
254 {
│ │ │ │ -
255 diag_ /= k;
│ │ │ │ -
256 return *this;
│ │ │ │ -
257 }
│ │ │ │ -
│ │ │ │ -
258
│ │ │ │ -
259 //===== comparison ops
│ │ │ │ + │ │ │ │ +
254
│ │ │ │ +
256 typedef typename Traits::value_type block_type;
│ │ │ │ +
257
│ │ │ │ +
259 typedef typename Traits::size_type size_type;
│ │ │ │
260
│ │ │ │ -
│ │ │ │ -
262 bool operator==(const DiagonalMatrix& other) const
│ │ │ │ -
263 {
│ │ │ │ -
264 return diag_==other.diagonal();
│ │ │ │ -
265 }
│ │ │ │ -
│ │ │ │ -
266
│ │ │ │ -
│ │ │ │ -
268 bool operator!=(const DiagonalMatrix& other) const
│ │ │ │ -
269 {
│ │ │ │ -
270 return diag_!=other.diagonal();
│ │ │ │ +
262 constexpr static int blocklevel = 1;
│ │ │ │ +
263
│ │ │ │ +
264 //===== assignment from scalar
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ +
268 for (size_type i=0; i<size(); i++)
│ │ │ │ +
269 asImp()[i] = k;
│ │ │ │ +
270 return asImp();
│ │ │ │
271 }
│ │ │ │
│ │ │ │
272
│ │ │ │ -
273
│ │ │ │ -
274 //===== linear maps
│ │ │ │ -
275
│ │ │ │ -
277 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
278 void mv (const X& x, Y& y) const
│ │ │ │ -
279 {
│ │ │ │ -
280#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
281 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
282 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
283#endif
│ │ │ │ -
284 for (size_type i=0; i<n; ++i)
│ │ │ │ -
285 y[i] = diag_[i] * x[i];
│ │ │ │ -
286 }
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
289 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
290 void mtv (const X& x, Y& y) const
│ │ │ │ -
291 {
│ │ │ │ -
292 mv(x, y);
│ │ │ │ -
293 }
│ │ │ │ -
│ │ │ │ -
294
│ │ │ │ -
296 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
297 void umv (const X& x, Y& y) const
│ │ │ │ -
298 {
│ │ │ │ -
299#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
300 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
301 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
302#endif
│ │ │ │ -
303 for (size_type i=0; i<n; ++i)
│ │ │ │ -
304 y[i] += diag_[i] * x[i];
│ │ │ │ -
305 }
│ │ │ │ -
│ │ │ │ -
306
│ │ │ │ -
308 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
309 void umtv (const X& x, Y& y) const
│ │ │ │ -
310 {
│ │ │ │ -
311#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
312 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
313 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
314#endif
│ │ │ │ -
315 for (size_type i=0; i<n; ++i)
│ │ │ │ -
316 y[i] += diag_[i] * x[i];
│ │ │ │ -
317 }
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
320 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
321 void umhv (const X& x, Y& y) const
│ │ │ │ -
322 {
│ │ │ │ -
323#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
324 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
325 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
326#endif
│ │ │ │ -
327 for (size_type i=0; i<n; i++)
│ │ │ │ -
328 y[i] += conjugateComplex(diag_[i])*x[i];
│ │ │ │ -
329 }
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
332 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
333 void mmv (const X& x, Y& y) const
│ │ │ │ -
334 {
│ │ │ │ -
335#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
336 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
337 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
338#endif
│ │ │ │ -
339 for (size_type i=0; i<n; ++i)
│ │ │ │ -
340 y[i] -= diag_[i] * x[i];
│ │ │ │ -
341 }
│ │ │ │ -
│ │ │ │ -
342
│ │ │ │ -
344 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
345 void mmtv (const X& x, Y& y) const
│ │ │ │ -
346 {
│ │ │ │ -
347#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
348 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
349 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
350#endif
│ │ │ │ -
351 for (size_type i=0; i<n; ++i)
│ │ │ │ -
352 y[i] -= diag_[i] * x[i];
│ │ │ │ -
353 }
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
356 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
357 void mmhv (const X& x, Y& y) const
│ │ │ │ -
358 {
│ │ │ │ -
359#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
360 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
361 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
362#endif
│ │ │ │ -
363 for (size_type i=0; i<n; i++)
│ │ │ │ -
364 y[i] -= conjugateComplex(diag_[i])*x[i];
│ │ │ │ -
365 }
│ │ │ │ -
│ │ │ │ -
366
│ │ │ │ -
368 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
369 void usmv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ │ -
370 const X& x, Y& y) const
│ │ │ │ -
371 {
│ │ │ │ -
372#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
373 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
374 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
375#endif
│ │ │ │ -
376 for (size_type i=0; i<n; i++)
│ │ │ │ -
377 y[i] += alpha * diag_[i] * x[i];
│ │ │ │ -
378 }
│ │ │ │ -
│ │ │ │ -
379
│ │ │ │ -
381 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
382 void usmtv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ │ -
383 const X& x, Y& y) const
│ │ │ │ -
384 {
│ │ │ │ -
385#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
386 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
387 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
388#endif
│ │ │ │ -
389 for (size_type i=0; i<n; i++)
│ │ │ │ -
390 y[i] += alpha * diag_[i] * x[i];
│ │ │ │ -
391 }
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
394 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
395 void usmhv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ │ -
396 const X& x, Y& y) const
│ │ │ │ -
397 {
│ │ │ │ -
398#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
399 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
400 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
401#endif
│ │ │ │ -
402 for (size_type i=0; i<n; i++)
│ │ │ │ -
403 y[i] += alpha * conjugateComplex(diag_[i]) * x[i];
│ │ │ │ -
404 }
│ │ │ │ -
│ │ │ │ -
405
│ │ │ │ -
406 //===== norms
│ │ │ │ -
407
│ │ │ │ -
│ │ │ │ -
409 double frobenius_norm () const
│ │ │ │ -
410 {
│ │ │ │ -
411 return diag_.two_norm();
│ │ │ │ -
412 }
│ │ │ │ -
│ │ │ │ -
413
│ │ │ │ -
│ │ │ │ -
415 double frobenius_norm2 () const
│ │ │ │ -
416 {
│ │ │ │ -
417 return diag_.two_norm2();
│ │ │ │ -
418 }
│ │ │ │ -
│ │ │ │ -
419
│ │ │ │ -
│ │ │ │ -
421 double infinity_norm () const
│ │ │ │ -
422 {
│ │ │ │ -
423 return diag_.infinity_norm();
│ │ │ │ -
424 }
│ │ │ │ -
│ │ │ │ -
425
│ │ │ │ -
│ │ │ │ -
427 double infinity_norm_real () const
│ │ │ │ -
428 {
│ │ │ │ -
429 return diag_.infinity_norm_real();
│ │ │ │ -
430 }
│ │ │ │ -
│ │ │ │ -
431
│ │ │ │ -
432
│ │ │ │ -
433
│ │ │ │ -
434 //===== solve
│ │ │ │ -
435
│ │ │ │ -
437 template<class V>
│ │ │ │ -
│ │ │ │ -
438 void solve (V& x, const V& b) const
│ │ │ │ -
439 {
│ │ │ │ -
440 for (int i=0; i<n; i++)
│ │ │ │ -
441 x[i] = b[i]/diag_[i];
│ │ │ │ -
442 }
│ │ │ │ -
│ │ │ │ -
443
│ │ │ │ -
│ │ │ │ -
445 void invert()
│ │ │ │ -
446 {
│ │ │ │ -
447 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
448 for (int i=0; i<n; i++)
│ │ │ │ -
449 diag_[i] = real_type(1.0)/diag_[i];
│ │ │ │ -
450 }
│ │ │ │ -
│ │ │ │ -
451
│ │ │ │ -
│ │ │ │ -
453 K determinant () const
│ │ │ │ -
454 {
│ │ │ │ -
455 K det = diag_[0];
│ │ │ │ -
456 for (int i=1; i<n; i++)
│ │ │ │ -
457 det *= diag_[i];
│ │ │ │ -
458 return det;
│ │ │ │ -
459 }
│ │ │ │ -
│ │ │ │ -
460
│ │ │ │ +
273 //===== assignment from other DenseVectors
│ │ │ │ +
274 protected:
│ │ │ │ + │ │ │ │ +
277
│ │ │ │ +
278 public:
│ │ │ │ +
279
│ │ │ │ +
281 template <typename W,
│ │ │ │ +
282 std::enable_if_t<
│ │ │ │ +
283 std::is_assignable<value_type&, typename DenseVector<W>::value_type>::value, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
285 {
│ │ │ │ +
286 assert(other.size() == size());
│ │ │ │ +
287 for (size_type i=0; i<size(); i++)
│ │ │ │ +
288 asImp()[i] = other[i];
│ │ │ │ +
289 return asImp();
│ │ │ │ +
290 }
│ │ │ │ +
│ │ │ │ +
291
│ │ │ │ +
292 //===== access to components
│ │ │ │ +
293
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
296 {
│ │ │ │ +
297 return asImp()[i];
│ │ │ │ +
298 }
│ │ │ │ +
│ │ │ │ +
299
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 return asImp()[i];
│ │ │ │ +
303 }
│ │ │ │ +
│ │ │ │ +
304
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
307 {
│ │ │ │ +
308 return asImp()[0];
│ │ │ │ +
309 }
│ │ │ │ +
│ │ │ │ +
310
│ │ │ │ +
│ │ │ │ +
312 const value_type& front() const
│ │ │ │ +
313 {
│ │ │ │ +
314 return asImp()[0];
│ │ │ │ +
315 }
│ │ │ │ +
│ │ │ │ +
316
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
319 {
│ │ │ │ +
320 return asImp()[size()-1];
│ │ │ │ +
321 }
│ │ │ │ +
│ │ │ │ +
322
│ │ │ │ +
│ │ │ │ +
324 const value_type& back() const
│ │ │ │ +
325 {
│ │ │ │ +
326 return asImp()[size()-1];
│ │ │ │ +
327 }
│ │ │ │ +
│ │ │ │ +
328
│ │ │ │ +
│ │ │ │ +
330 bool empty() const
│ │ │ │ +
331 {
│ │ │ │ +
332 return size() == 0;
│ │ │ │ +
333 }
│ │ │ │ +
│ │ │ │ +
334
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
337 {
│ │ │ │ +
338 return asImp().size();
│ │ │ │ +
339 }
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ + │ │ │ │ + │ │ │ │ +
345
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
348 {
│ │ │ │ +
349 return Iterator(*this,0);
│ │ │ │ +
350 }
│ │ │ │ +
│ │ │ │ +
351
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
354 {
│ │ │ │ +
355 return Iterator(*this,size());
│ │ │ │ +
356 }
│ │ │ │ +
│ │ │ │ +
357
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
361 {
│ │ │ │ +
362 return Iterator(*this,size()-1);
│ │ │ │ +
363 }
│ │ │ │ +
│ │ │ │ +
364
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
368 {
│ │ │ │ +
369 return Iterator(*this,-1);
│ │ │ │ +
370 }
│ │ │ │ +
│ │ │ │ +
371
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
374 {
│ │ │ │ +
375 return Iterator(*this,std::min(i,size()));
│ │ │ │ +
376 }
│ │ │ │ +
│ │ │ │ +
377
│ │ │ │ + │ │ │ │ + │ │ │ │ +
382
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
385 {
│ │ │ │ +
386 return ConstIterator(*this,0);
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
391 {
│ │ │ │ +
392 return ConstIterator(*this,size());
│ │ │ │ +
393 }
│ │ │ │ +
│ │ │ │ +
394
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
398 {
│ │ │ │ +
399 return ConstIterator(*this,size()-1);
│ │ │ │ +
400 }
│ │ │ │ +
│ │ │ │ +
401
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
405 {
│ │ │ │ +
406 return ConstIterator(*this,-1);
│ │ │ │ +
407 }
│ │ │ │ +
│ │ │ │ +
408
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
411 {
│ │ │ │ +
412 return ConstIterator(*this,std::min(i,size()));
│ │ │ │ +
413 }
│ │ │ │ +
│ │ │ │ +
414
│ │ │ │ +
415 //===== vector space arithmetic
│ │ │ │ +
416
│ │ │ │ +
418 template <class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
420 {
│ │ │ │ +
421 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
422 for (size_type i=0; i<size(); i++)
│ │ │ │ +
423 (*this)[i] += x[i];
│ │ │ │ +
424 return asImp();
│ │ │ │ +
425 }
│ │ │ │ +
│ │ │ │ +
426
│ │ │ │ +
428 template <class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
430 {
│ │ │ │ +
431 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
432 for (size_type i=0; i<size(); i++)
│ │ │ │ +
433 (*this)[i] -= x[i];
│ │ │ │ +
434 return asImp();
│ │ │ │ +
435 }
│ │ │ │ +
│ │ │ │ +
436
│ │ │ │ +
438 template <class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
440 {
│ │ │ │ +
441 derived_type z = asImp();
│ │ │ │ +
442 return (z+=b);
│ │ │ │ +
443 }
│ │ │ │ +
│ │ │ │ +
444
│ │ │ │ +
446 template <class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
448 {
│ │ │ │ +
449 derived_type z = asImp();
│ │ │ │ +
450 return (z-=b);
│ │ │ │ +
451 }
│ │ │ │ +
│ │ │ │ +
452
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
455 {
│ │ │ │ +
456 V result;
│ │ │ │ +
457 using idx_type = typename decltype(result)::size_type;
│ │ │ │ +
458
│ │ │ │ +
459 for (idx_type i = 0; i < size(); ++i)
│ │ │ │ +
460 result[i] = -asImp()[i];
│ │ │ │
461
│ │ │ │ -
462
│ │ │ │ -
463 //===== matrix-matrix multiplication
│ │ │ │ +
462 return result;
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │
464
│ │ │ │ -
467 template <class OtherScalar>
│ │ │ │ -
│ │ │ │ -
468 friend auto operator* ( const DiagonalMatrix& matrixA,
│ │ │ │ -
469 const DiagonalMatrix<OtherScalar, n>& matrixB)
│ │ │ │ -
470 {
│ │ │ │ - │ │ │ │ -
472 for(int i=0; i<n; ++i)
│ │ │ │ -
473 result.diagonal(i) = matrixA.diagonal(i)*matrixB.diagonal(i);
│ │ │ │ -
474 return result;
│ │ │ │ -
475 }
│ │ │ │ -
│ │ │ │ -
476
│ │ │ │ -
477
│ │ │ │ -
478
│ │ │ │ -
479 //===== sizes
│ │ │ │ -
480
│ │ │ │ -
│ │ │ │ -
482 static constexpr size_type N ()
│ │ │ │ -
483 {
│ │ │ │ -
484 return n;
│ │ │ │ +
466
│ │ │ │ +
474 template <typename ValueType>
│ │ │ │ +
475 typename std::enable_if<
│ │ │ │ +
476 std::is_convertible<ValueType, value_type>::value,
│ │ │ │ + │ │ │ │ +
478 >::type&
│ │ │ │ +
│ │ │ │ +
479 operator+= (const ValueType& kk)
│ │ │ │ +
480 {
│ │ │ │ +
481 const value_type& k = kk;
│ │ │ │ +
482 for (size_type i=0; i<size(); i++)
│ │ │ │ +
483 (*this)[i] += k;
│ │ │ │ +
484 return asImp();
│ │ │ │
485 }
│ │ │ │
│ │ │ │
486
│ │ │ │ -
│ │ │ │ -
488 static constexpr size_type M ()
│ │ │ │ -
489 {
│ │ │ │ -
490 return n;
│ │ │ │ -
491 }
│ │ │ │ -
│ │ │ │ -
492
│ │ │ │ -
493
│ │ │ │ -
494
│ │ │ │ -
495 //===== query
│ │ │ │ -
496
│ │ │ │ -
│ │ │ │ -
498 bool exists (size_type i, size_type j) const
│ │ │ │ -
499 {
│ │ │ │ -
500 DUNE_ASSERT_BOUNDS(i >= 0 && i < n);
│ │ │ │ -
501 DUNE_ASSERT_BOUNDS(j >= 0 && j < n);
│ │ │ │ -
502 return i==j;
│ │ │ │ -
503 }
│ │ │ │ -
│ │ │ │ -
504
│ │ │ │ -
505
│ │ │ │ -
506
│ │ │ │ -
│ │ │ │ -
508 friend std::ostream& operator<< (std::ostream& s, const DiagonalMatrix<K,n>& a)
│ │ │ │ -
509 {
│ │ │ │ -
510 for (size_type i=0; i<n; i++) {
│ │ │ │ -
511 for (size_type j=0; j<n; j++)
│ │ │ │ -
512 s << ((i==j) ? a.diag_[i] : 0) << " ";
│ │ │ │ -
513 s << std::endl;
│ │ │ │ -
514 }
│ │ │ │ -
515 return s;
│ │ │ │ -
516 }
│ │ │ │ -
│ │ │ │ -
517
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
520 {
│ │ │ │ -
521 return reference(const_cast<K*>(&diag_[i]), i);
│ │ │ │ -
522 }
│ │ │ │ -
│ │ │ │ -
523
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
526 {
│ │ │ │ -
527 return const_reference(const_cast<K*>(&diag_[i]), i);
│ │ │ │ -
528 }
│ │ │ │ -
│ │ │ │ -
529
│ │ │ │ -
│ │ │ │ -
531 const K& diagonal(size_type i) const
│ │ │ │ -
532 {
│ │ │ │ -
533 return diag_[i];
│ │ │ │ -
534 }
│ │ │ │ -
│ │ │ │ -
535
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
538 {
│ │ │ │ -
539 return diag_[i];
│ │ │ │ -
540 }
│ │ │ │ -
│ │ │ │ -
541
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
544 {
│ │ │ │ -
545 return diag_;
│ │ │ │ -
546 }
│ │ │ │ -
│ │ │ │ -
547
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
550 {
│ │ │ │ -
551 return diag_;
│ │ │ │ -
552 }
│ │ │ │ -
│ │ │ │ -
553
│ │ │ │ -
554 private:
│ │ │ │ -
555
│ │ │ │ -
556 // the data, a FieldVector storing the diagonal
│ │ │ │ -
557 FieldVector<K,n> diag_;
│ │ │ │ -
558 };
│ │ │ │ -
│ │ │ │ -
559
│ │ │ │ -
560 template< class K, int n >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
562 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
565 };
│ │ │ │ -
│ │ │ │ -
566
│ │ │ │ -
567
│ │ │ │ -
568#ifndef DOXYGEN // hide specialization
│ │ │ │ -
571 template< class K >
│ │ │ │ -
572 class DiagonalMatrix<K, 1> : public FieldMatrix<K, 1, 1>
│ │ │ │ -
573 {
│ │ │ │ -
574 typedef FieldMatrix<K,1,1> Base;
│ │ │ │ -
575 public:
│ │ │ │ -
577 typedef typename Base::size_type size_type;
│ │ │ │ -
578
│ │ │ │ -
581 constexpr static int blocklevel = 1;
│ │ │ │ +
488
│ │ │ │ +
496 template <typename ValueType>
│ │ │ │ +
497 typename std::enable_if<
│ │ │ │ +
498 std::is_convertible<ValueType, value_type>::value,
│ │ │ │ + │ │ │ │ +
500 >::type&
│ │ │ │ +
│ │ │ │ +
501 operator-= (const ValueType& kk)
│ │ │ │ +
502 {
│ │ │ │ +
503 const value_type& k = kk;
│ │ │ │ +
504 for (size_type i=0; i<size(); i++)
│ │ │ │ +
505 (*this)[i] -= k;
│ │ │ │ +
506 return asImp();
│ │ │ │ +
507 }
│ │ │ │ +
│ │ │ │ +
508
│ │ │ │ +
510
│ │ │ │ +
518 template <typename FieldType>
│ │ │ │ +
519 typename std::enable_if<
│ │ │ │ +
520 std::is_convertible<FieldType, field_type>::value,
│ │ │ │ + │ │ │ │ +
522 >::type&
│ │ │ │ +
│ │ │ │ +
523 operator*= (const FieldType& kk)
│ │ │ │ +
524 {
│ │ │ │ +
525 const field_type& k = kk;
│ │ │ │ +
526 for (size_type i=0; i<size(); i++)
│ │ │ │ +
527 (*this)[i] *= k;
│ │ │ │ +
528 return asImp();
│ │ │ │ +
529 }
│ │ │ │ +
│ │ │ │ +
530
│ │ │ │ +
532
│ │ │ │ +
540 template <typename FieldType>
│ │ │ │ +
541 typename std::enable_if<
│ │ │ │ +
542 std::is_convertible<FieldType, field_type>::value,
│ │ │ │ + │ │ │ │ +
544 >::type&
│ │ │ │ +
│ │ │ │ +
545 operator/= (const FieldType& kk)
│ │ │ │ +
546 {
│ │ │ │ +
547 const field_type& k = kk;
│ │ │ │ +
548 for (size_type i=0; i<size(); i++)
│ │ │ │ +
549 (*this)[i] /= k;
│ │ │ │ +
550 return asImp();
│ │ │ │ +
551 }
│ │ │ │ +
│ │ │ │ +
552
│ │ │ │ +
554 template <class Other>
│ │ │ │ +
│ │ │ │ +
555 bool operator== (const DenseVector<Other>& x) const
│ │ │ │ +
556 {
│ │ │ │ +
557 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
558 for (size_type i=0; i<size(); i++)
│ │ │ │ +
559 if ((*this)[i]!=x[i])
│ │ │ │ +
560 return false;
│ │ │ │ +
561
│ │ │ │ +
562 return true;
│ │ │ │ +
563 }
│ │ │ │ +
│ │ │ │ +
564
│ │ │ │ +
566 template <class Other>
│ │ │ │ +
│ │ │ │ +
567 bool operator!= (const DenseVector<Other>& x) const
│ │ │ │ +
568 {
│ │ │ │ +
569 return !operator==(x);
│ │ │ │ +
570 }
│ │ │ │ +
│ │ │ │ +
571
│ │ │ │ +
572
│ │ │ │ +
574 template <class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
576 {
│ │ │ │ +
577 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
578 for (size_type i=0; i<size(); i++)
│ │ │ │ +
579 (*this)[i] += a*x[i];
│ │ │ │ +
580 return asImp();
│ │ │ │ +
581 }
│ │ │ │ +
│ │ │ │
582
│ │ │ │ -
583 typedef typename Base::row_type row_type;
│ │ │ │ -
584
│ │ │ │ -
585 typedef typename Base::row_reference row_reference;
│ │ │ │ -
586 typedef typename Base::const_row_reference const_row_reference;
│ │ │ │ -
587
│ │ │ │ -
590 constexpr static int rows = 1;
│ │ │ │ -
593 constexpr static int cols = 1;
│ │ │ │ -
594
│ │ │ │ -
595
│ │ │ │ -
597 constexpr DiagonalMatrix() = default;
│ │ │ │ -
598
│ │ │ │ -
600 DiagonalMatrix(const K& scalar)
│ │ │ │ -
601 {
│ │ │ │ -
602 (*this)[0][0] = scalar;
│ │ │ │ -
603 }
│ │ │ │ -
604
│ │ │ │ -
606 const K& diagonal(size_type) const
│ │ │ │ -
607 {
│ │ │ │ -
608 return (*this)[0][0];
│ │ │ │ -
609 }
│ │ │ │ -
610
│ │ │ │ - │ │ │ │ -
613 {
│ │ │ │ -
614 return (*this)[0][0];
│ │ │ │ -
615 }
│ │ │ │ -
616
│ │ │ │ -
618 const FieldVector<K,1>& diagonal() const
│ │ │ │ -
619 {
│ │ │ │ -
620 return (*this)[0];
│ │ │ │ -
621 }
│ │ │ │ -
622
│ │ │ │ -
624 FieldVector<K,1>& diagonal()
│ │ │ │ -
625 {
│ │ │ │ -
626 return (*this)[0];
│ │ │ │ -
627 }
│ │ │ │ -
628
│ │ │ │ -
630 DiagonalMatrix<K, 1> transposed() const
│ │ │ │ -
631 {
│ │ │ │ -
632 return *this;
│ │ │ │ -
633 }
│ │ │ │ -
634
│ │ │ │ -
637 template <class OtherScalar>
│ │ │ │ -
638 friend auto operator* ( const DiagonalMatrix& matrixA,
│ │ │ │ -
639 const DiagonalMatrix<OtherScalar, 1>& matrixB)
│ │ │ │ -
640 {
│ │ │ │ -
641 return DiagonalMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType, 1>{matrixA.diagonal(0)*matrixB.diagonal(0)};
│ │ │ │ -
642 }
│ │ │ │ -
643
│ │ │ │ -
644 };
│ │ │ │ -
645#endif
│ │ │ │ -
646
│ │ │ │ -
647
│ │ │ │ -
648 template<class DiagonalMatrixType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
650 {
│ │ │ │ -
651 typedef typename DiagonalMatrixType::reference reference;
│ │ │ │ -
652 typedef typename DiagonalMatrixType::const_reference const_reference;
│ │ │ │ -
653 typedef typename DiagonalMatrixType::field_type K;
│ │ │ │ - │ │ │ │ -
655 typedef std::size_t size_type;
│ │ │ │ - │ │ │ │ +
590 template<class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
592 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
│ │ │ │ +
593 PromotedType result(0);
│ │ │ │ +
594 assert(x.size() == size());
│ │ │ │ +
595 for (size_type i=0; i<size(); i++) {
│ │ │ │ +
596 result += PromotedType((*this)[i]*x[i]);
│ │ │ │ +
597 }
│ │ │ │ +
598 return result;
│ │ │ │ +
599 }
│ │ │ │ +
│ │ │ │ +
600
│ │ │ │ +
608 template<class Other>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
610 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
│ │ │ │ +
611 PromotedType result(0);
│ │ │ │ +
612 assert(x.size() == size());
│ │ │ │ +
613 for (size_type i=0; i<size(); i++) {
│ │ │ │ +
614 result += Dune::dot((*this)[i],x[i]);
│ │ │ │ +
615 }
│ │ │ │ +
616 return result;
│ │ │ │ +
617 }
│ │ │ │ +
│ │ │ │ +
618
│ │ │ │ +
619 //===== norms
│ │ │ │ +
620
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
623 using std::abs;
│ │ │ │ +
624 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
625 for (size_type i=0; i<size(); i++)
│ │ │ │ +
626 result += abs((*this)[i]);
│ │ │ │ +
627 return result;
│ │ │ │ +
628 }
│ │ │ │ +
│ │ │ │ +
629
│ │ │ │ +
630
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
633 {
│ │ │ │ +
634 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
635 for (size_type i=0; i<size(); i++)
│ │ │ │ +
636 result += fvmeta::absreal((*this)[i]);
│ │ │ │ +
637 return result;
│ │ │ │ +
638 }
│ │ │ │ +
│ │ │ │ +
639
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
642 {
│ │ │ │ +
643 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
644 for (size_type i=0; i<size(); i++)
│ │ │ │ +
645 result += fvmeta::abs2((*this)[i]);
│ │ │ │ +
646 return fvmeta::sqrt(result);
│ │ │ │ +
647 }
│ │ │ │ +
│ │ │ │ +
648
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
651 {
│ │ │ │ +
652 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
653 for (size_type i=0; i<size(); i++)
│ │ │ │ +
654 result += fvmeta::abs2((*this)[i]);
│ │ │ │ +
655 return result;
│ │ │ │ +
656 }
│ │ │ │ +
│ │ │ │
657
│ │ │ │ -
658 friend class ContainerWrapperIterator<const MyType, reference, reference>;
│ │ │ │ -
659 friend class ContainerWrapperIterator<const MyType, const_reference, const_reference>;
│ │ │ │ -
660
│ │ │ │ -
661 public:
│ │ │ │ -
662
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
664 mat_(0)
│ │ │ │ -
665 {}
│ │ │ │ -
│ │ │ │ -
666
│ │ │ │ -
│ │ │ │ -
667 DiagonalMatrixWrapper(const DiagonalMatrixType* mat) :
│ │ │ │ -
668 mat_(const_cast<DiagonalMatrixType*>(mat))
│ │ │ │ -
669 {}
│ │ │ │ -
│ │ │ │ -
670
│ │ │ │ -
│ │ │ │ -
671 size_type realIndex(int i) const
│ │ │ │ -
672 {
│ │ │ │ -
673 return i;
│ │ │ │ -
674 }
│ │ │ │ -
│ │ │ │ -
675
│ │ │ │ -
│ │ │ │ -
676 row_type* pointer(int i) const
│ │ │ │ -
677 {
│ │ │ │ -
678 row_ = row_type(&(mat_->diagonal(i)), i);
│ │ │ │ -
679 return &row_;
│ │ │ │ -
680 }
│ │ │ │ -
│ │ │ │ -
681
│ │ │ │ -
│ │ │ │ -
682 bool identical(const DiagonalMatrixWrapper& other) const
│ │ │ │ -
683 {
│ │ │ │ -
684 return mat_==other.mat_;
│ │ │ │ -
685 }
│ │ │ │ +
659 template <typename vt = value_type,
│ │ │ │ +
660 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
662 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
663 using std::abs;
│ │ │ │ +
664 using std::max;
│ │ │ │ +
665
│ │ │ │ +
666 real_type norm = 0;
│ │ │ │ +
667 for (auto const &x : *this) {
│ │ │ │ +
668 real_type const a = abs(x);
│ │ │ │ +
669 norm = max(a, norm);
│ │ │ │ +
670 }
│ │ │ │ +
671 return norm;
│ │ │ │ +
672 }
│ │ │ │ +
│ │ │ │ +
673
│ │ │ │ +
675 template <typename vt = value_type,
│ │ │ │ +
676 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
678 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
679 using std::max;
│ │ │ │ +
680
│ │ │ │ +
681 real_type norm = 0;
│ │ │ │ +
682 for (auto const &x : *this) {
│ │ │ │ +
683 real_type const a = fvmeta::absreal(x);
│ │ │ │ +
684 norm = max(a, norm);
│ │ │ │ +
685 }
│ │ │ │ +
686 return norm;
│ │ │ │ +
687 }
│ │ │ │
│ │ │ │ -
686
│ │ │ │ -
687 private:
│ │ │ │
688
│ │ │ │ -
689 mutable DiagonalMatrixType* mat_;
│ │ │ │ -
690 mutable row_type row_;
│ │ │ │ -
691 };
│ │ │ │ -
│ │ │ │ -
692
│ │ │ │ -
696 template< class K, int n >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
698 {
│ │ │ │ -
699 template<class DiagonalMatrixType>
│ │ │ │ - │ │ │ │ -
701 friend class ContainerWrapperIterator<DiagonalRowVectorConst<K,n>, const K, const K&>;
│ │ │ │ -
702
│ │ │ │ -
703 public:
│ │ │ │ -
704 // remember size of vector
│ │ │ │ -
705 constexpr static int dimension = n;
│ │ │ │ +
690 template <typename vt = value_type,
│ │ │ │ +
691 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
693 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
694 using std::abs;
│ │ │ │ +
695 using std::max;
│ │ │ │ +
696
│ │ │ │ +
697 real_type norm = 0;
│ │ │ │ +
698 real_type isNaN = 1;
│ │ │ │ +
699 for (auto const &x : *this) {
│ │ │ │ +
700 real_type const a = abs(x);
│ │ │ │ +
701 norm = max(a, norm);
│ │ │ │ +
702 isNaN += a;
│ │ │ │ +
703 }
│ │ │ │ +
704 return norm * (isNaN / isNaN);
│ │ │ │ +
705 }
│ │ │ │ +
│ │ │ │
706
│ │ │ │ -
707 // standard constructor and everything is sufficient ...
│ │ │ │ -
708
│ │ │ │ -
709 //===== type definitions and constants
│ │ │ │ -
710
│ │ │ │ -
712 typedef K field_type;
│ │ │ │ +
708 template <typename vt = value_type,
│ │ │ │ +
709 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
711 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
712 using std::max;
│ │ │ │
713
│ │ │ │ -
715 typedef K block_type;
│ │ │ │ -
716
│ │ │ │ -
718 typedef std::size_t size_type;
│ │ │ │ -
719
│ │ │ │ -
721 constexpr static int blocklevel = 1;
│ │ │ │ -
722
│ │ │ │ -
724 constexpr static int size = n;
│ │ │ │ +
714 real_type norm = 0;
│ │ │ │ +
715 real_type isNaN = 1;
│ │ │ │ +
716 for (auto const &x : *this) {
│ │ │ │ +
717 real_type const a = fvmeta::absreal(x);
│ │ │ │ +
718 norm = max(a, norm);
│ │ │ │ +
719 isNaN += a;
│ │ │ │ +
720 }
│ │ │ │ +
721 return norm * (isNaN / isNaN);
│ │ │ │ +
722 }
│ │ │ │ +
│ │ │ │ +
723
│ │ │ │ +
724 //===== sizes
│ │ │ │
725
│ │ │ │
│ │ │ │ - │ │ │ │ -
728 p_(0),
│ │ │ │ -
729 row_(0)
│ │ │ │ -
730 {}
│ │ │ │ +
727 size_type N () const
│ │ │ │ +
728 {
│ │ │ │ +
729 return size();
│ │ │ │ +
730 }
│ │ │ │
│ │ │ │
731
│ │ │ │
│ │ │ │ -
733 explicit DiagonalRowVectorConst (K* p, int col) :
│ │ │ │ -
734 p_(p),
│ │ │ │ -
735 row_(col)
│ │ │ │ -
736 {}
│ │ │ │ +
733 size_type dim () const
│ │ │ │ +
734 {
│ │ │ │ +
735 return size();
│ │ │ │ +
736 }
│ │ │ │
│ │ │ │
737
│ │ │ │ -
738 //===== access to components
│ │ │ │ +
738 };
│ │ │ │ +
│ │ │ │
739
│ │ │ │ -
│ │ │ │ -
741 const K& operator[] ([[maybe_unused]] size_type i) const
│ │ │ │ -
742 {
│ │ │ │ - │ │ │ │ -
744 return *p_;
│ │ │ │ -
745 }
│ │ │ │ -
│ │ │ │ -
746
│ │ │ │ -
747 // check if row is identical to other row (not only identical values)
│ │ │ │ -
748 // since this is a proxy class we need to check equality of the stored pointer
│ │ │ │ +
748 template<typename V>
│ │ │ │
│ │ │ │ -
749 bool identical(const DiagonalRowVectorConst<K,n>& other) const
│ │ │ │ -
750 {
│ │ │ │ -
751 return ((p_ == other.p_)and (row_ == other.row_));
│ │ │ │ -
752 }
│ │ │ │ -
│ │ │ │ -
753
│ │ │ │ - │ │ │ │ - │ │ │ │ -
758
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
761 {
│ │ │ │ -
762 return ConstIterator(*this,0);
│ │ │ │ -
763 }
│ │ │ │ -
│ │ │ │ -
764
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
767 {
│ │ │ │ -
768 return ConstIterator(*this,1);
│ │ │ │ -
769 }
│ │ │ │ -
│ │ │ │ -
770
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
774 {
│ │ │ │ -
775 return ConstIterator(*this,0);
│ │ │ │ -
776 }
│ │ │ │ -
│ │ │ │ -
777
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
781 {
│ │ │ │ -
782 return ConstIterator(*this,-1);
│ │ │ │ -
783 }
│ │ │ │ -
│ │ │ │ -
784
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
787 {
│ │ │ │ -
788 return ((p_==y.p_)and (row_==y.row_));
│ │ │ │ -
789 }
│ │ │ │ -
│ │ │ │ -
790
│ │ │ │ -
791 //===== sizes
│ │ │ │ -
792
│ │ │ │ -
│ │ │ │ -
794 size_type N () const
│ │ │ │ -
795 {
│ │ │ │ -
796 return n;
│ │ │ │ -
797 }
│ │ │ │ -
│ │ │ │ -
798
│ │ │ │ -
│ │ │ │ -
800 size_type dim () const
│ │ │ │ -
801 {
│ │ │ │ -
802 return n;
│ │ │ │ -
803 }
│ │ │ │ -
│ │ │ │ -
804
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
807 {
│ │ │ │ -
808 return row_;
│ │ │ │ -
809 }
│ │ │ │ -
│ │ │ │ -
810
│ │ │ │ -
│ │ │ │ -
812 const K& diagonal() const
│ │ │ │ -
813 {
│ │ │ │ -
814 return *p_;
│ │ │ │ -
815 }
│ │ │ │ -
│ │ │ │ -
816
│ │ │ │ -
817 protected:
│ │ │ │ -
818
│ │ │ │ -
│ │ │ │ -
819 size_type realIndex([[maybe_unused]] int i) const
│ │ │ │ -
820 {
│ │ │ │ -
821 return rowIndex();
│ │ │ │ -
822 }
│ │ │ │ -
│ │ │ │ -
823
│ │ │ │ -
│ │ │ │ -
824 K* pointer([[maybe_unused]] size_type i) const
│ │ │ │ -
825 {
│ │ │ │ -
826 return const_cast<K*>(p_);
│ │ │ │ -
827 }
│ │ │ │ -
│ │ │ │ -
828
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
830 {
│ │ │ │ -
831 return this;
│ │ │ │ -
832 }
│ │ │ │ -
│ │ │ │ -
833
│ │ │ │ -
834 // the data, very simply a pointer to the diagonal value and the row number
│ │ │ │ -
835 K* p_;
│ │ │ │ - │ │ │ │ -
837 };
│ │ │ │ -
│ │ │ │ -
838
│ │ │ │ -
839 template< class K, int n >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
841 {
│ │ │ │ -
842 template<class DiagonalMatrixType>
│ │ │ │ - │ │ │ │ -
844 friend class ContainerWrapperIterator<DiagonalRowVector<K,n>, K, K&>;
│ │ │ │ -
845
│ │ │ │ -
846 public:
│ │ │ │ -
847 // standard constructor and everything is sufficient ...
│ │ │ │ -
848
│ │ │ │ -
849 //===== type definitions and constants
│ │ │ │ -
850
│ │ │ │ -
852 typedef K field_type;
│ │ │ │ -
853
│ │ │ │ -
855 typedef K block_type;
│ │ │ │ -
856
│ │ │ │ -
858 typedef std::size_t size_type;
│ │ │ │ -
859
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
862 {}
│ │ │ │ -
│ │ │ │ -
863
│ │ │ │ -
│ │ │ │ -
865 explicit DiagonalRowVector (K* p, int col) : DiagonalRowVectorConst<K,n>(p, col)
│ │ │ │ -
866 {}
│ │ │ │ -
│ │ │ │ -
867
│ │ │ │ -
868 //===== assignment from scalar
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
871 {
│ │ │ │ -
872 *p_ = k;
│ │ │ │ -
873 return *this;
│ │ │ │ -
874 }
│ │ │ │ -
│ │ │ │ -
875
│ │ │ │ -
876 //===== access to components
│ │ │ │ -
877
│ │ │ │ -
│ │ │ │ -
879 K& operator[] ([[maybe_unused]] size_type i)
│ │ │ │ -
880 {
│ │ │ │ - │ │ │ │ -
882 return *p_;
│ │ │ │ -
883 }
│ │ │ │ -
│ │ │ │ -
884
│ │ │ │ - │ │ │ │ - │ │ │ │ -
889
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
892 {
│ │ │ │ -
893 return Iterator(*this, 0);
│ │ │ │ -
894 }
│ │ │ │ -
│ │ │ │ -
895
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
898 {
│ │ │ │ -
899 return Iterator(*this, 1);
│ │ │ │ -
900 }
│ │ │ │ -
│ │ │ │ -
901
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
905 {
│ │ │ │ -
906 return Iterator(*this, 0);
│ │ │ │ -
907 }
│ │ │ │ -
│ │ │ │ -
908
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
912 {
│ │ │ │ -
913 return Iterator(*this, -1);
│ │ │ │ -
914 }
│ │ │ │ -
│ │ │ │ -
915
│ │ │ │ - │ │ │ │ - │ │ │ │ -
920
│ │ │ │ - │ │ │ │ -
922 using DiagonalRowVectorConst<K,n>::operator[];
│ │ │ │ -
923 using DiagonalRowVectorConst<K,n>::operator==;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
928 using DiagonalRowVectorConst<K,n>::N;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
932
│ │ │ │ -
933 protected:
│ │ │ │ -
934
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
936 {
│ │ │ │ -
937 return this;
│ │ │ │ -
938 }
│ │ │ │ -
│ │ │ │ -
939
│ │ │ │ -
940 private:
│ │ │ │ -
941
│ │ │ │ - │ │ │ │ - │ │ │ │ -
944 };
│ │ │ │ -
│ │ │ │ -
945
│ │ │ │ -
946
│ │ │ │ -
947 // implement type traits
│ │ │ │ -
948 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
950 {
│ │ │ │ - │ │ │ │ -
952 };
│ │ │ │ -
│ │ │ │ -
953
│ │ │ │ -
954 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
956 {
│ │ │ │ - │ │ │ │ -
958 };
│ │ │ │ -
│ │ │ │ -
959
│ │ │ │ -
960 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
962 {
│ │ │ │ - │ │ │ │ -
964 };
│ │ │ │ -
│ │ │ │ -
965
│ │ │ │ -
966 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
968 {
│ │ │ │ - │ │ │ │ -
970 };
│ │ │ │ -
│ │ │ │ -
971
│ │ │ │ -
972
│ │ │ │ -
973
│ │ │ │ -
996 template<class CW, class T, class R>
│ │ │ │ -
│ │ │ │ -
997 class ContainerWrapperIterator : public BidirectionalIteratorFacade<ContainerWrapperIterator<CW,T,R>,T, R, int>
│ │ │ │ -
998 {
│ │ │ │ -
999 typedef typename std::remove_const<CW>::type NonConstCW;
│ │ │ │ -
1000
│ │ │ │ -
1001 friend class ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type>;
│ │ │ │ -
1002 friend class ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type>;
│ │ │ │ -
1003
│ │ │ │ -
1004 typedef ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type> MyType;
│ │ │ │ -
1005 typedef ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type> MyConstType;
│ │ │ │ -
1006
│ │ │ │ -
1007 public:
│ │ │ │ -
1008
│ │ │ │ -
1009 // Constructors needed by the facade iterators.
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1011 containerWrapper_(),
│ │ │ │ -
1012 position_(0)
│ │ │ │ -
1013 {}
│ │ │ │ -
│ │ │ │ -
1014
│ │ │ │ -
│ │ │ │ -
1015 ContainerWrapperIterator(CW containerWrapper, int position) :
│ │ │ │ -
1016 containerWrapper_(containerWrapper),
│ │ │ │ -
1017 position_(position)
│ │ │ │ -
1018 {}
│ │ │ │ -
│ │ │ │ -
1019
│ │ │ │ -
1020 template<class OtherContainerWrapperIteratorType>
│ │ │ │ -
│ │ │ │ -
1021 ContainerWrapperIterator(OtherContainerWrapperIteratorType& other) :
│ │ │ │ -
1022 containerWrapper_(other.containerWrapper_),
│ │ │ │ -
1023 position_(other.position_)
│ │ │ │ -
1024 {}
│ │ │ │ -
│ │ │ │ -
1025
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1027 containerWrapper_(other.containerWrapper_),
│ │ │ │ -
1028 position_(other.position_)
│ │ │ │ -
1029 {}
│ │ │ │ -
│ │ │ │ -
1030
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1032 containerWrapper_(other.containerWrapper_),
│ │ │ │ -
1033 position_(other.position_)
│ │ │ │ -
1034 {}
│ │ │ │ -
│ │ │ │ -
1035
│ │ │ │ -
1036 template<class OtherContainerWrapperIteratorType>
│ │ │ │ -
│ │ │ │ -
1037 ContainerWrapperIterator& operator=(OtherContainerWrapperIteratorType& other)
│ │ │ │ -
1038 {
│ │ │ │ -
1039 containerWrapper_ = other.containerWrapper_;
│ │ │ │ -
1040 position_ = other.position_;
│ │ │ │ -
1041 return *this;
│ │ │ │ -
1042 }
│ │ │ │ -
│ │ │ │ -
1043
│ │ │ │ -
1044 // This operator is needed since we can not get the address of the
│ │ │ │ -
1045 // temporary object returned by dereference
│ │ │ │ -
│ │ │ │ -
1046 T* operator->() const
│ │ │ │ -
1047 {
│ │ │ │ -
1048 return containerWrapper_.pointer(position_);
│ │ │ │ -
1049 }
│ │ │ │ -
│ │ │ │ -
1050
│ │ │ │ -
1051 // Methods needed by the forward iterator
│ │ │ │ -
│ │ │ │ -
1052 bool equals(const MyType& other) const
│ │ │ │ -
1053 {
│ │ │ │ -
1054 return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
│ │ │ │ -
1055 }
│ │ │ │ -
│ │ │ │ -
1056
│ │ │ │ -
│ │ │ │ -
1057 bool equals(const MyConstType& other) const
│ │ │ │ -
1058 {
│ │ │ │ -
1059 return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
│ │ │ │ -
1060 }
│ │ │ │ -
│ │ │ │ -
1061
│ │ │ │ -
│ │ │ │ -
1062 R dereference() const
│ │ │ │ -
1063 {
│ │ │ │ -
1064 return *containerWrapper_.pointer(position_);
│ │ │ │ -
1065 }
│ │ │ │ -
│ │ │ │ -
1066
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1068 {
│ │ │ │ -
1069 ++position_;
│ │ │ │ -
1070 }
│ │ │ │ -
│ │ │ │ -
1071
│ │ │ │ -
1072 // Additional function needed by BidirectionalIterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1074 {
│ │ │ │ -
1075 --position_;
│ │ │ │ -
1076 }
│ │ │ │ -
│ │ │ │ -
1077
│ │ │ │ -
1078 // Additional function needed by RandomAccessIterator
│ │ │ │ -
│ │ │ │ -
1079 R elementAt(int i) const
│ │ │ │ -
1080 {
│ │ │ │ -
1081 return *containerWrapper_.pointer(position_+i);
│ │ │ │ -
1082 }
│ │ │ │ -
│ │ │ │ -
1083
│ │ │ │ -
│ │ │ │ -
1084 void advance(int n)
│ │ │ │ -
1085 {
│ │ │ │ -
1086 position_=position_+n;
│ │ │ │ -
1087 }
│ │ │ │ -
│ │ │ │ -
1088
│ │ │ │ -
1089 template<class OtherContainerWrapperIteratorType>
│ │ │ │ -
│ │ │ │ -
1090 std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType& other) const
│ │ │ │ -
1091 {
│ │ │ │ -
1092 assert(containerWrapper_.identical(other));
│ │ │ │ -
1093 return other.position_ - position_;
│ │ │ │ -
1094 }
│ │ │ │ -
│ │ │ │ -
1095
│ │ │ │ -
│ │ │ │ -
1096 std::ptrdiff_t index() const
│ │ │ │ -
1097 {
│ │ │ │ -
1098 return containerWrapper_.realIndex(position_);
│ │ │ │ -
1099 }
│ │ │ │ -
│ │ │ │ -
1100
│ │ │ │ -
1101 private:
│ │ │ │ -
1102 NonConstCW containerWrapper_;
│ │ │ │ -
1103 size_t position_;
│ │ │ │ -
1104 };
│ │ │ │ -
│ │ │ │ -
1105
│ │ │ │ -
1106 template <class DenseMatrix, class field, int N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1108 static void apply(DenseMatrix& denseMatrix,
│ │ │ │ -
1109 DiagonalMatrix<field, N> const& rhs) {
│ │ │ │ -
1110 DUNE_ASSERT_BOUNDS(denseMatrix.M() == N);
│ │ │ │ -
1111 DUNE_ASSERT_BOUNDS(denseMatrix.N() == N);
│ │ │ │ -
1112 denseMatrix = field(0);
│ │ │ │ -
1113 for (int i = 0; i < N; ++i)
│ │ │ │ -
1114 denseMatrix[i][i] = rhs.diagonal()[i];
│ │ │ │ -
1115 }
│ │ │ │ -
│ │ │ │ -
1116 };
│ │ │ │ -
│ │ │ │ -
1117 /* @} */
│ │ │ │ -
1118} // end namespace
│ │ │ │ -
1119#endif
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ -
A few common exception classes.
│ │ │ │ +
749 std::ostream& operator<< (std::ostream& s, const DenseVector<V>& v)
│ │ │ │ +
750 {
│ │ │ │ +
751 for (typename DenseVector<V>::size_type i=0; i<v.size(); i++)
│ │ │ │ +
752 s << ((i>0) ? " " : "") << v[i];
│ │ │ │ +
753 return s;
│ │ │ │ +
754 }
│ │ │ │ +
│ │ │ │ +
755
│ │ │ │ +
758} // end namespace
│ │ │ │ +
759
│ │ │ │ +
760#endif // DUNE_DENSEVECTOR_HH
│ │ │ │ +
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
│ │ │ │ +
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ +
Provides the functions dot(a,b) := and dotT(a,b) := .
│ │ │ │ +
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
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
│ │ │ │ -
ConstIterator beforeBegin() const
Definition diagonalmatrix.hh:208
│ │ │ │ -
DiagonalMatrix< K, n > transposed() const
Return transposed of the matrix as DiagonalMatrix.
Definition diagonalmatrix.hh:136
│ │ │ │ -
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition diagonalmatrix.hh:357
│ │ │ │ -
DiagonalMatrix & operator*=(const K &k)
vector space multiplication with scalar
Definition diagonalmatrix.hh:246
│ │ │ │ -
FieldTraits< K >::field_type field_type
Definition diagonalmatrix.hh:563
│ │ │ │ -
std::size_t size_type
The type used for the index access and size operations.
Definition diagonalmatrix.hh:67
│ │ │ │ -
size_type dim() const
dimension of the vector space
Definition diagonalmatrix.hh:800
│ │ │ │ -
ConstIterator ConstRowIterator
rename the iterators for easier access
Definition diagonalmatrix.hh:183
│ │ │ │ -
row_type row_reference
Definition diagonalmatrix.hh:75
│ │ │ │ -
K & operator[](size_type i)
random access
Definition diagonalmatrix.hh:879
│ │ │ │ -
ContainerWrapperIterator & operator=(OtherContainerWrapperIteratorType &other)
Definition diagonalmatrix.hh:1037
│ │ │ │ -
static constexpr int rows
The number of rows.
Definition diagonalmatrix.hh:81
│ │ │ │ -
static constexpr size_type M()
number of blocks in column direction
Definition diagonalmatrix.hh:488
│ │ │ │ -
FieldVector< K, n > & diagonal()
Get reference to diagonal vector.
Definition diagonalmatrix.hh:549
│ │ │ │ -
void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition diagonalmatrix.hh:395
│ │ │ │ -
Iterator iterator
typedef for stl compliant access
Definition diagonalmatrix.hh:888
│ │ │ │ -
void increment()
Definition diagonalmatrix.hh:1067
│ │ │ │ -
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition diagonalmatrix.hh:70
│ │ │ │ -
DiagonalRowVectorConst< K, n > type
Definition diagonalmatrix.hh:957
│ │ │ │ -
T * operator->() const
Definition diagonalmatrix.hh:1046
│ │ │ │ -
static constexpr int size
The size of this vector.
Definition diagonalmatrix.hh:724
│ │ │ │ -
K * pointer(size_type i) const
Definition diagonalmatrix.hh:824
│ │ │ │ -
K field_type
export the type representing the field
Definition diagonalmatrix.hh:712
│ │ │ │ -
DiagonalRowVector< K, n > type
Definition diagonalmatrix.hh:963
│ │ │ │ -
ConstIterator beforeEnd() const
Definition diagonalmatrix.hh:773
│ │ │ │ -
const_row_type::ConstIterator ConstColIterator
rename the iterators for easier access
Definition diagonalmatrix.hh:185
│ │ │ │ -
bool exists(size_type i, size_type j) const
return true when (i,j) is in pattern
Definition diagonalmatrix.hh:498
│ │ │ │ -
ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
Iterator class for sequential access.
Definition diagonalmatrix.hh:179
│ │ │ │ -
const_row_type const_row_reference
Definition diagonalmatrix.hh:78
│ │ │ │ -
static constexpr size_type size()
Definition diagonalmatrix.hh:87
│ │ │ │ -
size_type row_
Definition diagonalmatrix.hh:836
│ │ │ │ -
ContainerWrapperIterator(CW containerWrapper, int position)
Definition diagonalmatrix.hh:1015
│ │ │ │ -
DiagonalRowVector(K *p, int col)
Constructor making vector with identical coordinates.
Definition diagonalmatrix.hh:865
│ │ │ │ -
K & diagonal(size_type i)
Get reference to diagonal entry.
Definition diagonalmatrix.hh:537
│ │ │ │ -
void solve(V &x, const V &b) const
Solve system A x = b.
Definition diagonalmatrix.hh:438
│ │ │ │ -
static constexpr size_type N()
number of blocks in row direction
Definition diagonalmatrix.hh:482
│ │ │ │ -
Iterator beforeBegin()
Definition diagonalmatrix.hh:911
│ │ │ │ -
ContainerWrapperIterator(OtherContainerWrapperIteratorType &other)
Definition diagonalmatrix.hh:1021
│ │ │ │ -
const_reference operator[](size_type i) const
Return const_reference object as row replacement.
Definition diagonalmatrix.hh:525
│ │ │ │ -
Iterator iterator
typedef for stl compliant access
Definition diagonalmatrix.hh:145
│ │ │ │ -
ConstIterator begin() const
begin ConstIterator
Definition diagonalmatrix.hh:760
│ │ │ │ -
ConstIterator const_iterator
typedef for stl compliant access
Definition diagonalmatrix.hh:919
│ │ │ │ -
bool identical(const DiagonalRowVectorConst< K, n > &other) const
Definition diagonalmatrix.hh:749
│ │ │ │ -
DiagonalMatrix & operator-=(const DiagonalMatrix &y)
vector space subtraction
Definition diagonalmatrix.hh:225
│ │ │ │ -
DiagonalRowVectorConst(K *p, int col)
Constructor making vector with identical coordinates.
Definition diagonalmatrix.hh:733
│ │ │ │ -
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition diagonalmatrix.hh:345
│ │ │ │ -
static constexpr int blocklevel
The number of block levels we contain.
Definition diagonalmatrix.hh:721
│ │ │ │ -
row_type * pointer(int i) const
Definition diagonalmatrix.hh:676
│ │ │ │ -
DiagonalMatrix(const K &k)
Constructor initializing the whole matrix with a scalar.
Definition diagonalmatrix.hh:98
│ │ │ │ -
ContainerWrapperIterator< DiagonalRowVector< K, n >, K, K & > Iterator
Iterator class for sequential access.
Definition diagonalmatrix.hh:886
│ │ │ │ -
R elementAt(int i) const
Definition diagonalmatrix.hh:1079
│ │ │ │ -
std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType &other) const
Definition diagonalmatrix.hh:1090
│ │ │ │ -
Iterator beforeEnd()
Definition diagonalmatrix.hh:904
│ │ │ │ -
void umtv(const X &x, Y &y) const
y += A^T x
Definition diagonalmatrix.hh:309
│ │ │ │ -
ConstIterator const_iterator
typedef for stl compliant access
Definition diagonalmatrix.hh:757
│ │ │ │ -
double infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition diagonalmatrix.hh:427
│ │ │ │ -
DiagonalMatrixWrapper(const DiagonalMatrixType *mat)
Definition diagonalmatrix.hh:667
│ │ │ │ -
void umv(const X &x, Y &y) const
y += A x
Definition diagonalmatrix.hh:297
│ │ │ │ -
ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
Iterator class for sequential access.
Definition diagonalmatrix.hh:143
│ │ │ │ -
DiagonalRowVector< K, n > type
Definition diagonalmatrix.hh:969
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition diagonalmatrix.hh:278
│ │ │ │ -
double frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition diagonalmatrix.hh:409
│ │ │ │ -
ConstIterator end() const
end iterator
Definition diagonalmatrix.hh:194
│ │ │ │ -
static constexpr int cols
The number of columns.
Definition diagonalmatrix.hh:83
│ │ │ │ -
static constexpr int dimension
Definition diagonalmatrix.hh:705
│ │ │ │ -
K * p_
Definition diagonalmatrix.hh:835
│ │ │ │ -
size_type rowIndex() const
index of this row in surrounding matrix
Definition diagonalmatrix.hh:806
│ │ │ │ -
R dereference() const
Definition diagonalmatrix.hh:1062
│ │ │ │ -
DiagonalRowVector & operator=(const K &k)
Assignment operator for scalar.
Definition diagonalmatrix.hh:870
│ │ │ │ -
bool operator!=(const DiagonalMatrix &other) const
incomparison operator
Definition diagonalmatrix.hh:268
│ │ │ │ -
value_type field_type
Definition diagonalmatrix.hh:61
│ │ │ │ -
void advance(int n)
Definition diagonalmatrix.hh:1084
│ │ │ │ -
ConstIterator begin() const
begin iterator
Definition diagonalmatrix.hh:188
│ │ │ │ -
Iterator begin()
begin iterator
Definition diagonalmatrix.hh:891
│ │ │ │ -
void mmv(const X &x, Y &y) const
y -= A x
Definition diagonalmatrix.hh:333
│ │ │ │ -
DiagonalMatrix & operator/=(const K &k)
vector space division by scalar
Definition diagonalmatrix.hh:253
│ │ │ │ -
ConstIterator const_iterator
typedef for stl compliant access
Definition diagonalmatrix.hh:181
│ │ │ │ -
const_row_type const_reference
Definition diagonalmatrix.hh:77
│ │ │ │ -
bool identical(const DiagonalMatrix< K, n > &other) const
Check if matrix is the same object as the other matrix.
Definition diagonalmatrix.hh:130
│ │ │ │ -
friend auto operator*(const DiagonalMatrix &matrixA, const DiagonalMatrix< OtherScalar, n > &matrixB)
Matrix-matrix multiplication.
Definition diagonalmatrix.hh:468
│ │ │ │ -
size_type realIndex(int i) const
Definition diagonalmatrix.hh:671
│ │ │ │ -
Iterator end()
end iterator
Definition diagonalmatrix.hh:158
│ │ │ │ -
const K & operator[](size_type i) const
same for read only access
Definition diagonalmatrix.hh:741
│ │ │ │ -
DiagonalRowVector()
Constructor making uninitialized vector.
Definition diagonalmatrix.hh:861
│ │ │ │ -
row_type reference
Definition diagonalmatrix.hh:74
│ │ │ │ -
DiagonalRowVectorConst * operator&()
Definition diagonalmatrix.hh:829
│ │ │ │ -
bool operator==(const DiagonalRowVectorConst &y) const
Binary vector comparison.
Definition diagonalmatrix.hh:786
│ │ │ │ -
double frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition diagonalmatrix.hh:415
│ │ │ │ -
constexpr DiagonalMatrix()=default
Default constructor.
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition diagonalmatrix.hh:290
│ │ │ │ -
ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > ConstIterator
ConstIterator class for sequential access.
Definition diagonalmatrix.hh:917
│ │ │ │ -
bool identical(const DiagonalMatrixWrapper &other) const
Definition diagonalmatrix.hh:682
│ │ │ │ -
void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition diagonalmatrix.hh:382
│ │ │ │ -
void decrement()
Definition diagonalmatrix.hh:1073
│ │ │ │ -
std::ptrdiff_t index() const
Definition diagonalmatrix.hh:1096
│ │ │ │ -
const FieldVector< K, n > & diagonal() const
Get const reference to diagonal vector.
Definition diagonalmatrix.hh:543
│ │ │ │ -
void invert()
Compute inverse.
Definition diagonalmatrix.hh:445
│ │ │ │ -
DiagonalRowVector * operator&()
Definition diagonalmatrix.hh:935
│ │ │ │ -
const K & diagonal(size_type i) const
Get const reference to diagonal entry.
Definition diagonalmatrix.hh:531
│ │ │ │ -
size_type N() const
number of blocks in the vector (are of size 1 here)
Definition diagonalmatrix.hh:794
│ │ │ │ -
DiagonalMatrix(std::initializer_list< K > const &l)
Construct diagonal matrix from an initializer list.
Definition diagonalmatrix.hh:115
│ │ │ │ -
row_type::Iterator ColIterator
rename the iterators for easier access
Definition diagonalmatrix.hh:149
│ │ │ │ -
K field_type
export the type representing the field
Definition diagonalmatrix.hh:852
│ │ │ │ -
reference operator[](size_type i)
Return reference object as row replacement.
Definition diagonalmatrix.hh:519
│ │ │ │ -
DiagonalRowVectorConst< K, n > type
Definition diagonalmatrix.hh:951
│ │ │ │ -
Iterator end()
end iterator
Definition diagonalmatrix.hh:897
│ │ │ │ -
DiagonalMatrix(const FieldVector< K, n > &diag)
Constructor initializing the diagonal with a vector.
Definition diagonalmatrix.hh:103
│ │ │ │ -
std::size_t size_type
The type used for the index access and size operation.
Definition diagonalmatrix.hh:858
│ │ │ │ -
void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A x
Definition diagonalmatrix.hh:369
│ │ │ │ -
double infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition diagonalmatrix.hh:421
│ │ │ │ -
DiagonalMatrix & operator+=(const DiagonalMatrix &y)
vector space addition
Definition diagonalmatrix.hh:218
│ │ │ │ -
K block_type
export the type representing the components
Definition diagonalmatrix.hh:64
│ │ │ │ -
void umhv(const X &x, Y &y) const
y += A^H x
Definition diagonalmatrix.hh:321
│ │ │ │ -
Iterator beforeBegin()
Definition diagonalmatrix.hh:172
│ │ │ │ -
static void apply(DenseMatrix &denseMatrix, DiagonalMatrix< field, N > const &rhs)
Definition diagonalmatrix.hh:1108
│ │ │ │ -
ContainerWrapperIterator(const MyType &other)
Definition diagonalmatrix.hh:1026
│ │ │ │ -
ConstIterator end() const
end ConstIterator
Definition diagonalmatrix.hh:766
│ │ │ │ -
std::size_t size_type
The type used for the index access and size operation.
Definition diagonalmatrix.hh:718
│ │ │ │ -
DiagonalMatrix & operator=(const K &k)
Assignment from a scalar.
Definition diagonalmatrix.hh:123
│ │ │ │ -
DiagonalRowVectorConst()
Constructor making uninitialized vector.
Definition diagonalmatrix.hh:727
│ │ │ │ -
Iterator beforeEnd()
Definition diagonalmatrix.hh:165
│ │ │ │ -
size_type realIndex(int i) const
Definition diagonalmatrix.hh:819
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const DiagonalMatrix< K, n > &a)
Sends the matrix to an output stream.
Definition diagonalmatrix.hh:508
│ │ │ │ -
K value_type
export the type representing the field
Definition diagonalmatrix.hh:60
│ │ │ │ -
K block_type
export the type representing the components
Definition diagonalmatrix.hh:715
│ │ │ │ -
K determinant() const
calculates the determinant of this matrix
Definition diagonalmatrix.hh:453
│ │ │ │ -
FieldTraits< K >::real_type real_type
Definition diagonalmatrix.hh:564
│ │ │ │ -
ConstIterator beforeBegin() const
Definition diagonalmatrix.hh:780
│ │ │ │ -
DiagonalMatrixWrapper()
Definition diagonalmatrix.hh:663
│ │ │ │ -
ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > ConstIterator
ConstIterator class for sequential access.
Definition diagonalmatrix.hh:755
│ │ │ │ -
Iterator begin()
begin iterator
Definition diagonalmatrix.hh:152
│ │ │ │ -
bool operator==(const DiagonalMatrix &other) const
comparison operator
Definition diagonalmatrix.hh:262
│ │ │ │ -
DiagonalRowVectorConst< K, n > const_row_type
Definition diagonalmatrix.hh:76
│ │ │ │ -
DiagonalRowVector< K, n > row_type
Each row is implemented by a field vector.
Definition diagonalmatrix.hh:73
│ │ │ │ -
bool equals(const MyType &other) const
Definition diagonalmatrix.hh:1052
│ │ │ │ -
Iterator RowIterator
rename the iterators for easier access
Definition diagonalmatrix.hh:147
│ │ │ │ -
K block_type
export the type representing the components
Definition diagonalmatrix.hh:855
│ │ │ │ -
ConstIterator beforeEnd() const
Definition diagonalmatrix.hh:201
│ │ │ │ -
const K & diagonal() const
the diagonal value
Definition diagonalmatrix.hh:812
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │ +
auto dot(const A &a, const B &b) -> typename std::enable_if< IsNumber< A >::value &&!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >::field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a) *b)>::type
computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,...
Definition dotproduct.hh:42
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
K conjugateComplex(const K &x)
compute conjugate complex of x
Definition math.hh:164
│ │ │ │ -
A dense n x m matrix.
Definition densematrix.hh:140
│ │ │ │ -
constexpr size_type M() const
number of columns
Definition densematrix.hh:703
│ │ │ │ -
constexpr size_type N() const
number of rows
Definition densematrix.hh:697
│ │ │ │ -
A dense n x m matrix.
Definition fmatrix.hh:117
│ │ │ │ -
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ -
you have to specialize this structure for any type that should be assignable to a DenseMatrix
Definition densematrix.hh:59
│ │ │ │ -
Error thrown if operations of a FieldMatrix fail.
Definition densematrix.hh:126
│ │ │ │ +
Interface for a class of dense vectors over a given field.
Definition densevector.hh:229
│ │ │ │ +
Traits::value_type value_type
export the type representing the field
Definition densevector.hh:250
│ │ │ │
FieldTraits< value_type >::real_type two_norm2() const
square of two norm (sum over squared values of entries), need for block recursion
Definition densevector.hh:650
│ │ │ │ +
ConstIterator const_iterator
typedef for stl compliant access
Definition densevector.hh:381
│ │ │ │ +
Iterator iterator
typedef for stl compliant access
Definition densevector.hh:344
│ │ │ │ +
ConstIterator find(size_type i) const
return iterator to given element or end()
Definition densevector.hh:410
│ │ │ │ +
ConstIterator end() const
end ConstIterator
Definition densevector.hh:390
│ │ │ │ +
value_type & front()
return reference to first element
Definition densevector.hh:306
│ │ │ │
FieldTraits< value_type >::real_type two_norm() const
two norm sqrt(sum over squared values of entries)
Definition densevector.hh:641
│ │ │ │ +
ConstIterator beforeBegin() const
Definition densevector.hh:404
│ │ │ │ +
bool operator==(const DenseVector< Other > &x) const
Binary vector comparison.
Definition densevector.hh:555
│ │ │ │
Iterator begin()
begin iterator
Definition densevector.hh:347
│ │ │ │ +
Iterator beforeBegin()
Definition densevector.hh:367
│ │ │ │ +
DenseIterator< const DenseVector, const value_type > ConstIterator
ConstIterator class for sequential access.
Definition densevector.hh:379
│ │ │ │ +
Traits::derived_type derived_type
type of derived vector class
Definition densevector.hh:247
│ │ │ │ +
const value_type & front() const
return reference to first element
Definition densevector.hh:312
│ │ │ │ +
derived_type operator+(const DenseVector< Other > &b) const
Binary vector addition.
Definition densevector.hh:439
│ │ │ │ +
size_type size() const
size method
Definition densevector.hh:336
│ │ │ │ +
size_type dim() const
dimension of the vector space
Definition densevector.hh:733
│ │ │ │
FieldTraits< vt >::real_type infinity_norm() const
infinity norm (maximum of absolute values of entries)
Definition densevector.hh:661
│ │ │ │ +
ConstIterator beforeEnd() const
Definition densevector.hh:397
│ │ │ │ +
derived_type & axpy(const field_type &a, const DenseVector< Other > &x)
vector space axpy operation ( *this += a x )
Definition densevector.hh:575
│ │ │ │ +
derived_type & operator=(const value_type &k)
Assignment operator for scalar.
Definition densevector.hh:266
│ │ │ │ +
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition densevector.hh:262
│ │ │ │ +
Iterator end()
end iterator
Definition densevector.hh:353
│ │ │ │ +
Traits::size_type size_type
The type used for the index access and size operation.
Definition densevector.hh:259
│ │ │ │ +
DenseIterator< DenseVector, value_type > Iterator
Iterator class for sequential access.
Definition densevector.hh:342
│ │ │ │ +
derived_type & operator-=(const DenseVector< Other > &x)
vector space subtraction
Definition densevector.hh:429
│ │ │ │ +
DenseVector(const DenseVector &)=default
│ │ │ │ +
Iterator beforeEnd()
Definition densevector.hh:360
│ │ │ │ +
derived_type & operator+=(const DenseVector< Other > &x)
vector space addition
Definition densevector.hh:419
│ │ │ │ +
std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator*=(const FieldType &kk)
vector space multiplication with scalar
Definition densevector.hh:523
│ │ │ │ +
bool operator!=(const DenseVector< Other > &x) const
Binary vector incomparison.
Definition densevector.hh:567
│ │ │ │ +
const value_type & back() const
return reference to last element
Definition densevector.hh:324
│ │ │ │ +
ConstIterator begin() const
begin ConstIterator
Definition densevector.hh:384
│ │ │ │ +
PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType operator*(const DenseVector< Other > &x) const
indefinite vector dot product which corresponds to Petsc's VecTDot
Definition densevector.hh:591
│ │ │ │ +
constexpr DenseVector()=default
│ │ │ │
FieldTraits< vt >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition densevector.hh:677
│ │ │ │ -
Definition diagonalmatrix.hh:698
│ │ │ │ -
Definition diagonalmatrix.hh:841
│ │ │ │ -
Definition diagonalmatrix.hh:650
│ │ │ │ -
Iterator class for sparse vector-like containers.
Definition diagonalmatrix.hh:998
│ │ │ │ -
ContainerWrapperIterator(const MyConstType &other)
Definition diagonalmatrix.hh:1031
│ │ │ │ -
bool equals(const MyConstType &other) const
Definition diagonalmatrix.hh:1057
│ │ │ │ -
A diagonal matrix of static size.
Definition diagonalmatrix.hh:53
│ │ │ │ +
DenseVector & operator=(const DenseVector &)=default
Assignment operator for other DenseVector of same type.
│ │ │ │ +
Traits::value_type block_type
export the type representing the components
Definition densevector.hh:256
│ │ │ │ +
value_type & operator[](size_type i)
random access
Definition densevector.hh:295
│ │ │ │ +
FieldTraits< value_type >::field_type field_type
export the type representing the field
Definition densevector.hh:253
│ │ │ │ +
value_type & back()
return reference to last element
Definition densevector.hh:318
│ │ │ │ +
derived_type operator-() const
Vector negation.
Definition densevector.hh:454
│ │ │ │ +
std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator/=(const FieldType &kk)
vector space division by scalar
Definition densevector.hh:545
│ │ │ │ +
FieldTraits< value_type >::real_type one_norm_real() const
simplified one norm (uses Manhattan norm for complex values)
Definition densevector.hh:632
│ │ │ │ +
PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType dot(const DenseVector< Other > &x) const
vector dot product which corresponds to Petsc's VecDot
Definition densevector.hh:609
│ │ │ │ +
Iterator find(size_type i)
return iterator to given element or end()
Definition densevector.hh:373
│ │ │ │ +
FieldTraits< value_type >::real_type one_norm() const
one norm (sum over absolute values of entries)
Definition densevector.hh:622
│ │ │ │ +
size_type N() const
number of blocks in the vector (are of size 1 here)
Definition densevector.hh:727
│ │ │ │ +
bool empty() const
checks whether the container is empty
Definition densevector.hh:330
│ │ │ │ +
FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type
Definition densevector.hh:28
│ │ │ │ +
FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type field_type
Definition densevector.hh:27
│ │ │ │ +
Generic iterator class for dense vector and matrix implementations.
Definition densevector.hh:131
│ │ │ │ +
void increment()
Definition densevector.hh:182
│ │ │ │ +
SizeType index() const
return index
Definition densevector.hh:213
│ │ │ │ +
bool equals(const MutableIterator &other) const
Definition densevector.hh:167
│ │ │ │ +
DenseIterator(const MutableIterator &other)
Definition densevector.hh:158
│ │ │ │ +
bool equals(const ConstIterator &other) const
Definition densevector.hh:173
│ │ │ │ +
R elementAt(DifferenceType i) const
Definition densevector.hh:192
│ │ │ │ +
DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T >::type > other) const
Definition densevector.hh:200
│ │ │ │ +
void decrement()
Definition densevector.hh:187
│ │ │ │ +
DenseIterator(const ConstIterator &other)
Definition densevector.hh:162
│ │ │ │ +
DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type, typename std::remove_const< T >::type > other) const
Definition densevector.hh:206
│ │ │ │ +
DenseIterator(C &cont, SizeType pos)
Definition densevector.hh:154
│ │ │ │ +
std::ptrdiff_t DifferenceType
The type of the difference between two positions.
Definition densevector.hh:142
│ │ │ │ +
R dereference() const
Definition densevector.hh:178
│ │ │ │ +
void advance(DifferenceType n)
Definition densevector.hh:196
│ │ │ │ +
C::size_type SizeType
The type to index the underlying container.
Definition densevector.hh:147
│ │ │ │
Definition ftraits.hh:26
│ │ │ │
T field_type
export the type representing the field
Definition ftraits.hh:28
│ │ │ │
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ │ -
Get the '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
│ │ │ │ -
Facade class for stl conformant bidirectional iterators.
Definition iteratorfacades.hh:275
│ │ │ │ +
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:435
│ │ │ │ +
Definition matvectraits.hh:31
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
Definition promotiontraits.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1601 +1,944 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -diagonalmatrix.hh │ │ │ │ │ +densevector.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_DIAGONAL_MATRIX_HH │ │ │ │ │ -6#define DUNE_DIAGONAL_MATRIX_HH │ │ │ │ │ +5#ifndef DUNE_DENSEVECTOR_HH │ │ │ │ │ +6#define DUNE_DENSEVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include "_g_e_n_e_r_i_c_i_t_e_r_a_t_o_r_._h_h" │ │ │ │ │ +13#include "_f_t_r_a_i_t_s_._h_h" │ │ │ │ │ +14#include "_m_a_t_v_e_c_t_r_a_i_t_s_._h_h" │ │ │ │ │ +15#include "_p_r_o_m_o_t_i_o_n_t_r_a_i_t_s_._h_h" │ │ │ │ │ +16#include "_d_o_t_p_r_o_d_u_c_t_._h_h" │ │ │ │ │ +17#include "_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h" │ │ │ │ │ +18 │ │ │ │ │ +19namespace _D_u_n_e { │ │ │ │ │ 20 │ │ │ │ │ -21#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> │ │ │ │ │ -22#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_n_s_e_m_a_t_r_i_x_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_m_a_t_r_i_x_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -26#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> │ │ │ │ │ -27#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e { │ │ │ │ │ -31 │ │ │ │ │ -32 template< class K, int n > class DiagonalRowVectorConst; │ │ │ │ │ -33 template< class K, int n > class DiagonalRowVector; │ │ │ │ │ -34 template< class DiagonalMatrixType > class DiagonalMatrixWrapper; │ │ │ │ │ -35 template< class C, class T, class R> class ContainerWrapperIterator; │ │ │ │ │ -36 │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 class _D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -53 { │ │ │ │ │ -54 typedef _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_K_,_n_> > _W_r_a_p_p_e_r_T_y_p_e; │ │ │ │ │ -55 │ │ │ │ │ -56 public: │ │ │ │ │ -57 //===== type definitions and constants │ │ │ │ │ -58 │ │ │ │ │ -_6_0 typedef K _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_6_1 typedef _v_a_l_u_e___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -62 │ │ │ │ │ -_6_4 typedef K _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -68 │ │ │ │ │ -_7_0 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ -71 │ │ │ │ │ -_7_3 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_K_,_n_> _r_o_w___t_y_p_e; │ │ │ │ │ -_7_4 typedef _r_o_w___t_y_p_e _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_7_5 typedef _r_o_w___t_y_p_e _r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_7_6 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_> _c_o_n_s_t___r_o_w___t_y_p_e; │ │ │ │ │ -_7_7 typedef _c_o_n_s_t___r_o_w___t_y_p_e _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_7_8 typedef _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; │ │ │ │ │ -79 │ │ │ │ │ -_8_1 constexpr static int _r_o_w_s = n; │ │ │ │ │ -_8_3 constexpr static int _c_o_l_s = n; │ │ │ │ │ -84 │ │ │ │ │ -85 //==== size │ │ │ │ │ -86 │ │ │ │ │ -_8_7 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e () │ │ │ │ │ -88 { │ │ │ │ │ -89 return _r_o_w_s; │ │ │ │ │ -90 } │ │ │ │ │ -91 │ │ │ │ │ -92 //===== constructors │ │ │ │ │ -93 │ │ │ │ │ -_9_5 constexpr _D_i_a_g_o_n_a_l_M_a_t_r_i_x() = default; │ │ │ │ │ -96 │ │ │ │ │ -_9_8 _D_i_a_g_o_n_a_l_M_a_t_r_i_x (const K& k) │ │ │ │ │ -99 : diag_(k) │ │ │ │ │ -100 {} │ │ │ │ │ -101 │ │ │ │ │ -_1_0_3 _D_i_a_g_o_n_a_l_M_a_t_r_i_x (const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_n_>& diag) │ │ │ │ │ -104 : diag_(diag) │ │ │ │ │ -105 {} │ │ │ │ │ -106 │ │ │ │ │ -_1_1_5 _D_i_a_g_o_n_a_l_M_a_t_r_i_x (std::initializer_list const &l) │ │ │ │ │ -116 { │ │ │ │ │ -117 std::copy_n(l.begin(), std::min(static_cast(_r_o_w_s), │ │ │ │ │ -118 l.size()), │ │ │ │ │ -119 diag_._b_e_g_i_n()); │ │ │ │ │ +21 // forward declaration of template │ │ │ │ │ +22 template class DenseVector; │ │ │ │ │ +23 │ │ │ │ │ +24 template │ │ │ │ │ +_2_5 struct _F_i_e_l_d_T_r_a_i_t_s< _D_e_n_s_e_V_e_c_t_o_r > │ │ │ │ │ +26 { │ │ │ │ │ +_2_7 typedef 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_<_V_>_:_:_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; │ │ │ │ │ +_2_8 typedef 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_<_V_>_:_:_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; │ │ │ │ │ +29 }; │ │ │ │ │ +30 │ │ │ │ │ +_4_0 namespace fvmeta │ │ │ │ │ +41 { │ │ │ │ │ +46 template │ │ │ │ │ +47 inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e absreal (const K& k) │ │ │ │ │ +48 { │ │ │ │ │ +49 using std::abs; │ │ │ │ │ +50 return abs(k); │ │ │ │ │ +51 } │ │ │ │ │ +52 │ │ │ │ │ +57 template │ │ │ │ │ +58 inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e absreal (const std::complex& c) │ │ │ │ │ +59 { │ │ │ │ │ +60 using std::abs; │ │ │ │ │ +61 return abs(c.real()) + abs(c.imag()); │ │ │ │ │ +62 } │ │ │ │ │ +63 │ │ │ │ │ +68 template │ │ │ │ │ +69 inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e abs2 (const K& k) │ │ │ │ │ +70 { │ │ │ │ │ +71 return k*k; │ │ │ │ │ +72 } │ │ │ │ │ +73 │ │ │ │ │ +78 template │ │ │ │ │ +79 inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e abs2 (const std::complex& c) │ │ │ │ │ +80 { │ │ │ │ │ +81 return c.real()*c.real() + c.imag()*c.imag(); │ │ │ │ │ +82 } │ │ │ │ │ +83 │ │ │ │ │ +88 template::is_integer> │ │ │ │ │ +89 struct Sqrt │ │ │ │ │ +90 { │ │ │ │ │ +91 static inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e sqrt (const K& k) │ │ │ │ │ +92 { │ │ │ │ │ +93 using std::sqrt; │ │ │ │ │ +94 return sqrt(k); │ │ │ │ │ +95 } │ │ │ │ │ +96 }; │ │ │ │ │ +97 │ │ │ │ │ +102 template │ │ │ │ │ +103 struct Sqrt │ │ │ │ │ +104 { │ │ │ │ │ +_1_0_5 static inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e sqrt (const K& k) │ │ │ │ │ +106 { │ │ │ │ │ +107 using std::sqrt; │ │ │ │ │ +108 return typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e(sqrt(double(k))); │ │ │ │ │ +109 } │ │ │ │ │ +110 }; │ │ │ │ │ +111 │ │ │ │ │ +116 template │ │ │ │ │ +117 inline typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e sqrt (const K& k) │ │ │ │ │ +118 { │ │ │ │ │ +119 return Sqrt::sqrt(k); │ │ │ │ │ 120 } │ │ │ │ │ 121 │ │ │ │ │ -_1_2_3 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const K& k) │ │ │ │ │ -124 { │ │ │ │ │ -125 diag_ = k; │ │ │ │ │ -126 return *this; │ │ │ │ │ -127 } │ │ │ │ │ -128 │ │ │ │ │ -_1_3_0 bool _i_d_e_n_t_i_c_a_l(const _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_K_,_n_>& other) const │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +128 template │ │ │ │ │ +_1_2_9 class _D_e_n_s_e_I_t_e_r_a_t_o_r : │ │ │ │ │ +130 public _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, R, std:: │ │ │ │ │ +ptrdiff_t> │ │ │ │ │ 131 { │ │ │ │ │ -132 return (this==&other); │ │ │ │ │ -133 } │ │ │ │ │ +132 friend class _D_e_n_s_e_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 >; │ │ │ │ │ +133 friend class _D_e_n_s_e_I_t_e_r_a_t_o_r::type, const │ │ │ │ │ +typename std::remove_const::type, typename const_reference::type >; │ │ │ │ │ 134 │ │ │ │ │ -_1_3_6 _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_K_,_ _n_> _t_r_a_n_s_p_o_s_e_d() const │ │ │ │ │ -137 { │ │ │ │ │ -138 return *this; │ │ │ │ │ -139 } │ │ │ │ │ -140 │ │ │ │ │ -141 //===== iterator interface to rows of the matrix │ │ │ │ │ -_1_4_3 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _W_r_a_p_p_e_r_T_y_p_e_,_ _r_e_f_e_r_e_n_c_e_,_ _r_e_f_e_r_e_n_c_e_> │ │ │ │ │ -_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_4_5 typedef _I_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ -_1_4_7 typedef _I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_4_9 typedef typename _r_o_w___t_y_p_e_:_:_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -150 │ │ │ │ │ -_1_5_2 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -153 { │ │ │ │ │ -154 return _I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),0); │ │ │ │ │ -155 } │ │ │ │ │ -156 │ │ │ │ │ -_1_5_8 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -159 { │ │ │ │ │ -160 return _I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),n); │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -_1_6_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -166 { │ │ │ │ │ -167 return _I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),n-1); │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -_1_7_2 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ -173 { │ │ │ │ │ -174 return _I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),-1); │ │ │ │ │ -175 } │ │ │ │ │ -176 │ │ │ │ │ +135 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r::type, typename std:: │ │ │ │ │ +remove_const::type, typename mutable_reference::type > _M_u_t_a_b_l_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +136 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r::type, const │ │ │ │ │ +typename std::remove_const::type, typename const_reference::type > │ │ │ │ │ +_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +137 public: │ │ │ │ │ +138 │ │ │ │ │ +_1_4_2 typedef std::ptrdiff_t _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ +143 │ │ │ │ │ +_1_4_7 typedef typename C::size_type _S_i_z_e_T_y_p_e; │ │ │ │ │ +148 │ │ │ │ │ +149 // Constructors needed by the base iterators. │ │ │ │ │ +_1_5_0 _D_e_n_s_e_I_t_e_r_a_t_o_r() │ │ │ │ │ +151 : container_(0), position_() │ │ │ │ │ +152 {} │ │ │ │ │ +153 │ │ │ │ │ +_1_5_4 _D_e_n_s_e_I_t_e_r_a_t_o_r(C& cont, _S_i_z_e_T_y_p_e pos) │ │ │ │ │ +155 : container_(&cont), position_(pos) │ │ │ │ │ +156 {} │ │ │ │ │ +157 │ │ │ │ │ +_1_5_8 _D_e_n_s_e_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) │ │ │ │ │ +159 : container_(other.container_), position_(other.position_) │ │ │ │ │ +160 {} │ │ │ │ │ +161 │ │ │ │ │ +_1_6_2 _D_e_n_s_e_I_t_e_r_a_t_o_r(const _C_o_n_s_t_I_t_e_r_a_t_o_r & other) │ │ │ │ │ +163 : container_(other.container_), position_(other.position_) │ │ │ │ │ +164 {} │ │ │ │ │ +165 │ │ │ │ │ +166 // Methods needed by the forward iterator │ │ │ │ │ +_1_6_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 │ │ │ │ │ +168 { │ │ │ │ │ +169 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +172 │ │ │ │ │ +_1_7_3 bool _e_q_u_a_l_s(const _C_o_n_s_t_I_t_e_r_a_t_o_r & other) const │ │ │ │ │ +174 { │ │ │ │ │ +175 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ +176 } │ │ │ │ │ 177 │ │ │ │ │ -_1_7_9 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _W_r_a_p_p_e_r_T_y_p_e_,_ _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_> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_8_1 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; │ │ │ │ │ -_1_8_3 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; │ │ │ │ │ -_1_8_5 typedef typename _c_o_n_s_t___r_o_w___t_y_p_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ -189 { │ │ │ │ │ -190 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),0); │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -_1_9_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ -195 { │ │ │ │ │ -196 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),n); │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -_2_0_1 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -202 { │ │ │ │ │ -203 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),n-1); │ │ │ │ │ +_1_7_8 R _d_e_r_e_f_e_r_e_n_c_e() const { │ │ │ │ │ +179 return container_->operator[](position_); │ │ │ │ │ +180 } │ │ │ │ │ +181 │ │ │ │ │ +_1_8_2 void _i_n_c_r_e_m_e_n_t(){ │ │ │ │ │ +183 ++position_; │ │ │ │ │ +184 } │ │ │ │ │ +185 │ │ │ │ │ +186 // Additional function needed by BidirectionalIterator │ │ │ │ │ +_1_8_7 void _d_e_c_r_e_m_e_n_t(){ │ │ │ │ │ +188 --position_; │ │ │ │ │ +189 } │ │ │ │ │ +190 │ │ │ │ │ +191 // Additional function needed by RandomAccessIterator │ │ │ │ │ +_1_9_2 R _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 { │ │ │ │ │ +193 return container_->operator[](position_+i); │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +_1_9_6 void _a_d_v_a_n_c_e(_D_i_f_f_e_r_e_n_c_e_T_y_p_e n){ │ │ │ │ │ +197 position_=position_+n; │ │ │ │ │ +198 } │ │ │ │ │ +199 │ │ │ │ │ +_2_0_0 _D_i_f_f_e_r_e_n_c_e_T_y_p_e _d_i_s_t_a_n_c_e_T_o(_D_e_n_s_e_I_t_e_r_a_t_o_r::type,const typename std::remove_const::type> other) const │ │ │ │ │ +201 { │ │ │ │ │ +202 assert(other.container_==container_); │ │ │ │ │ +203 return static_cast< _D_i_f_f_e_r_e_n_c_e_T_y_p_e >( other.position_ ) - static_cast< │ │ │ │ │ +_D_i_f_f_e_r_e_n_c_e_T_y_p_e >( position_ ); │ │ │ │ │ 204 } │ │ │ │ │ 205 │ │ │ │ │ -_2_0_8 _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 │ │ │ │ │ -209 { │ │ │ │ │ -210 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_W_r_a_p_p_e_r_T_y_p_e(this),-1); │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -213 │ │ │ │ │ -214 │ │ │ │ │ -215 //===== vector space arithmetic │ │ │ │ │ -216 │ │ │ │ │ -_2_1_8 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& y) │ │ │ │ │ -219 { │ │ │ │ │ -220 diag_ += y.diag_; │ │ │ │ │ -221 return *this; │ │ │ │ │ -222 } │ │ │ │ │ -223 │ │ │ │ │ -_2_2_5 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& y) │ │ │ │ │ -226 { │ │ │ │ │ -227 diag_ -= y.diag_; │ │ │ │ │ -228 return *this; │ │ │ │ │ -229 } │ │ │ │ │ -230 │ │ │ │ │ -_2_3_2 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const K& k) │ │ │ │ │ -233 { │ │ │ │ │ -234 diag_ += k; │ │ │ │ │ -235 return *this; │ │ │ │ │ -236 } │ │ │ │ │ -237 │ │ │ │ │ -_2_3_9 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const K& k) │ │ │ │ │ -240 { │ │ │ │ │ -241 diag_ -= k; │ │ │ │ │ -242 return *this; │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -_2_4_6 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const K& k) │ │ │ │ │ -247 { │ │ │ │ │ -248 diag_ *= k; │ │ │ │ │ -249 return *this; │ │ │ │ │ -250 } │ │ │ │ │ +_2_0_6 _D_i_f_f_e_r_e_n_c_e_T_y_p_e _d_i_s_t_a_n_c_e_T_o(_D_e_n_s_e_I_t_e_r_a_t_o_r:: │ │ │ │ │ +type, typename std::remove_const::type> other) const │ │ │ │ │ +207 { │ │ │ │ │ +208 assert(other.container_==container_); │ │ │ │ │ +209 return static_cast< _D_i_f_f_e_r_e_n_c_e_T_y_p_e >( other.position_ ) - static_cast< │ │ │ │ │ +_D_i_f_f_e_r_e_n_c_e_T_y_p_e >( position_ ); │ │ │ │ │ +210 } │ │ │ │ │ +211 │ │ │ │ │ +_2_1_3 _S_i_z_e_T_y_p_e _i_n_d_e_x () const │ │ │ │ │ +214 { │ │ │ │ │ +215 return this->position_; │ │ │ │ │ +216 } │ │ │ │ │ +217 │ │ │ │ │ +218 private: │ │ │ │ │ +219 C *container_; │ │ │ │ │ +220 _S_i_z_e_T_y_p_e position_; │ │ │ │ │ +221 }; │ │ │ │ │ +222 │ │ │ │ │ +227 template │ │ │ │ │ +_2_2_8 class _D_e_n_s_e_V_e_c_t_o_r │ │ │ │ │ +229 { │ │ │ │ │ +230 typedef _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_V_> _T_r_a_i_t_s; │ │ │ │ │ +231 // typedef typename Traits::value_type K; │ │ │ │ │ +232 │ │ │ │ │ +233 // Curiously recurring template pattern │ │ │ │ │ +234 V & asImp() { return static_cast(*this); } │ │ │ │ │ +235 const V & asImp() const { return static_cast(*this); } │ │ │ │ │ +236 │ │ │ │ │ +237 protected: │ │ │ │ │ +238 // construction allowed to derived classes only │ │ │ │ │ +_2_3_9 constexpr _D_e_n_s_e_V_e_c_t_o_r() = default; │ │ │ │ │ +240 // copying only allowed by derived classes │ │ │ │ │ +_2_4_1 _D_e_n_s_e_V_e_c_t_o_r(const _D_e_n_s_e_V_e_c_t_o_r&) = default; │ │ │ │ │ +242 │ │ │ │ │ +243 public: │ │ │ │ │ +244 //===== type definitions and constants │ │ │ │ │ +245 │ │ │ │ │ +_2_4_7 typedef typename Traits::derived_type _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ │ +248 │ │ │ │ │ +_2_5_0 typedef typename Traits::value_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ 251 │ │ │ │ │ -_2_5_3 _D_i_a_g_o_n_a_l_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const K& k) │ │ │ │ │ -254 { │ │ │ │ │ -255 diag_ /= k; │ │ │ │ │ -256 return *this; │ │ │ │ │ -257 } │ │ │ │ │ -258 │ │ │ │ │ -259 //===== comparison ops │ │ │ │ │ +_2_5_3 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_ _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; │ │ │ │ │ +254 │ │ │ │ │ +_2_5_6 typedef typename Traits::value_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +257 │ │ │ │ │ +_2_5_9 typedef typename Traits::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ 260 │ │ │ │ │ -_2_6_2 bool _o_p_e_r_a_t_o_r_=_=(const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& other) const │ │ │ │ │ -263 { │ │ │ │ │ -264 return diag_==other._d_i_a_g_o_n_a_l(); │ │ │ │ │ -265 } │ │ │ │ │ -266 │ │ │ │ │ -_2_6_8 bool _o_p_e_r_a_t_o_r_!_=(const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& other) const │ │ │ │ │ -269 { │ │ │ │ │ -270 return diag_!=other._d_i_a_g_o_n_a_l(); │ │ │ │ │ +_2_6_2 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ +263 │ │ │ │ │ +264 //===== assignment from scalar │ │ │ │ │ +_2_6_6 inline _d_e_r_i_v_e_d___t_y_p_e& _o_p_e_r_a_t_o_r_=_ (const _v_a_l_u_e___t_y_p_e& k) │ │ │ │ │ +267 { │ │ │ │ │ +268 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +269 asImp()[i] = k; │ │ │ │ │ +270 return asImp(); │ │ │ │ │ 271 } │ │ │ │ │ 272 │ │ │ │ │ -273 │ │ │ │ │ -274 //===== linear maps │ │ │ │ │ -275 │ │ │ │ │ -277 template │ │ │ │ │ -_2_7_8 void _m_v (const X& x, Y& y) const │ │ │ │ │ -279 { │ │ │ │ │ -280#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -281 if (x.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -282 if (y.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -283#endif │ │ │ │ │ -284 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_2_9_0 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ -291 { │ │ │ │ │ -292 _m_v(x, y); │ │ │ │ │ -293 } │ │ │ │ │ -294 │ │ │ │ │ -296 template │ │ │ │ │ -_2_9_7 void _u_m_v (const X& x, Y& y) const │ │ │ │ │ -298 { │ │ │ │ │ -299#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -300 if (x.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -301 if (y.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -302#endif │ │ │ │ │ -303 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_0_9 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ -310 { │ │ │ │ │ -311#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -312 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -313 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -314#endif │ │ │ │ │ -315 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_2_1 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ -322 { │ │ │ │ │ -323#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -324 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -325 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -326#endif │ │ │ │ │ -327 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_3_3 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ -334 { │ │ │ │ │ -335#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -336 if (x.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -337 if (y.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -338#endif │ │ │ │ │ -339 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_4_5 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ -346 { │ │ │ │ │ -347#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -348 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -349 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -350#endif │ │ │ │ │ -351 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_5_7 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ -358 { │ │ │ │ │ -359#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -360 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -361 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -362#endif │ │ │ │ │ -363 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_6_9 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, │ │ │ │ │ -370 const X& x, Y& y) const │ │ │ │ │ -371 { │ │ │ │ │ -372#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -373 if (x.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -374 if (y.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -375#endif │ │ │ │ │ -376 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_8_2 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, │ │ │ │ │ -383 const X& x, Y& y) const │ │ │ │ │ -384 { │ │ │ │ │ -385#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -386 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -387 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -388#endif │ │ │ │ │ -389 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_9_5 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, │ │ │ │ │ -396 const X& x, Y& y) const │ │ │ │ │ -397 { │ │ │ │ │ -398#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -399 if (x.N()!=_N()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -400 if (y.N()!=_M()) _D_U_N_E___T_H_R_O_W(_F_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -401#endif │ │ │ │ │ -402 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_4_3_8 void _s_o_l_v_e (V& x, const V& b) const │ │ │ │ │ -439 { │ │ │ │ │ -440 for (int i=0; i_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -448 for (int i=0; i::value_type>:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +_2_8_4 _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_V_e_c_t_o_r_<_W_>& other) │ │ │ │ │ +285 { │ │ │ │ │ +286 assert(other._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +287 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +288 asImp()[i] = other[i]; │ │ │ │ │ +289 return asImp(); │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +292 //===== access to components │ │ │ │ │ +293 │ │ │ │ │ +_2_9_5 _v_a_l_u_e___t_y_p_e & _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +296 { │ │ │ │ │ +297 return asImp()[i]; │ │ │ │ │ +298 } │ │ │ │ │ +299 │ │ │ │ │ +_3_0_0 const _v_a_l_u_e___t_y_p_e & _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +301 { │ │ │ │ │ +302 return asImp()[i]; │ │ │ │ │ +303 } │ │ │ │ │ +304 │ │ │ │ │ +_3_0_6 _v_a_l_u_e___t_y_p_e& _f_r_o_n_t() │ │ │ │ │ +307 { │ │ │ │ │ +308 return asImp()[0]; │ │ │ │ │ +309 } │ │ │ │ │ +310 │ │ │ │ │ +_3_1_2 const _v_a_l_u_e___t_y_p_e& _f_r_o_n_t() const │ │ │ │ │ +313 { │ │ │ │ │ +314 return asImp()[0]; │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +_3_1_8 _v_a_l_u_e___t_y_p_e& _b_a_c_k() │ │ │ │ │ +319 { │ │ │ │ │ +320 return asImp()[_s_i_z_e()-1]; │ │ │ │ │ +321 } │ │ │ │ │ +322 │ │ │ │ │ +_3_2_4 const _v_a_l_u_e___t_y_p_e& _b_a_c_k() const │ │ │ │ │ +325 { │ │ │ │ │ +326 return asImp()[_s_i_z_e()-1]; │ │ │ │ │ +327 } │ │ │ │ │ +328 │ │ │ │ │ +_3_3_0 bool _e_m_p_t_y() const │ │ │ │ │ +331 { │ │ │ │ │ +332 return _s_i_z_e() == 0; │ │ │ │ │ +333 } │ │ │ │ │ +334 │ │ │ │ │ +_3_3_6 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +337 { │ │ │ │ │ +338 return asImp().size(); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +_3_4_2 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r_<_D_e_n_s_e_V_e_c_t_o_r_,_v_a_l_u_e___t_y_p_e_> _I_t_e_r_a_t_o_r; │ │ │ │ │ +_3_4_4 typedef _I_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ +345 │ │ │ │ │ +_3_4_7 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +348 { │ │ │ │ │ +349 return _I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ +350 } │ │ │ │ │ +351 │ │ │ │ │ +_3_5_3 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +354 { │ │ │ │ │ +355 return _I_t_e_r_a_t_o_r(*this,_s_i_z_e()); │ │ │ │ │ +356 } │ │ │ │ │ +357 │ │ │ │ │ +_3_6_0 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +361 { │ │ │ │ │ +362 return _I_t_e_r_a_t_o_r(*this,_s_i_z_e()-1); │ │ │ │ │ +363 } │ │ │ │ │ +364 │ │ │ │ │ +_3_6_7 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ +368 { │ │ │ │ │ +369 return _I_t_e_r_a_t_o_r(*this,-1); │ │ │ │ │ +370 } │ │ │ │ │ +371 │ │ │ │ │ +_3_7_3 _I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +374 { │ │ │ │ │ +375 return _I_t_e_r_a_t_o_r(*this,std::min(i,_s_i_z_e())); │ │ │ │ │ +376 } │ │ │ │ │ +377 │ │ │ │ │ +_3_7_9 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _D_e_n_s_e_V_e_c_t_o_r_,_c_o_n_s_t_ _v_a_l_u_e___t_y_p_e_> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_3_8_1 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; │ │ │ │ │ +382 │ │ │ │ │ +_3_8_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ +385 { │ │ │ │ │ +386 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +_3_9_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ +391 { │ │ │ │ │ +392 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,_s_i_z_e()); │ │ │ │ │ +393 } │ │ │ │ │ +394 │ │ │ │ │ +_3_9_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () const │ │ │ │ │ +398 { │ │ │ │ │ +399 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,_s_i_z_e()-1); │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +_4_0_4 _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 │ │ │ │ │ +405 { │ │ │ │ │ +406 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,-1); │ │ │ │ │ +407 } │ │ │ │ │ +408 │ │ │ │ │ +_4_1_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +411 { │ │ │ │ │ +412 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,std::min(i,_s_i_z_e())); │ │ │ │ │ +413 } │ │ │ │ │ +414 │ │ │ │ │ +415 //===== vector space arithmetic │ │ │ │ │ +416 │ │ │ │ │ +418 template │ │ │ │ │ +_4_1_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_V_e_c_t_o_r_<_O_t_h_e_r_>& x) │ │ │ │ │ +420 { │ │ │ │ │ +421 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +422 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +423 (*this)[i] += x[i]; │ │ │ │ │ +424 return asImp(); │ │ │ │ │ +425 } │ │ │ │ │ +426 │ │ │ │ │ +428 template │ │ │ │ │ +_4_2_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_V_e_c_t_o_r_<_O_t_h_e_r_>& x) │ │ │ │ │ +430 { │ │ │ │ │ +431 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +432 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +433 (*this)[i] -= x[i]; │ │ │ │ │ +434 return asImp(); │ │ │ │ │ +435 } │ │ │ │ │ +436 │ │ │ │ │ +438 template │ │ │ │ │ +_4_3_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_V_e_c_t_o_r_<_O_t_h_e_r_>& b) const │ │ │ │ │ +440 { │ │ │ │ │ +441 _d_e_r_i_v_e_d___t_y_p_e z = asImp(); │ │ │ │ │ +442 return (z+=b); │ │ │ │ │ +443 } │ │ │ │ │ +444 │ │ │ │ │ +446 template │ │ │ │ │ +_4_4_7 _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_V_e_c_t_o_r_<_O_t_h_e_r_>& b) const │ │ │ │ │ +448 { │ │ │ │ │ +449 _d_e_r_i_v_e_d___t_y_p_e z = asImp(); │ │ │ │ │ +450 return (z-=b); │ │ │ │ │ +451 } │ │ │ │ │ +452 │ │ │ │ │ +_4_5_4 _d_e_r_i_v_e_d___t_y_p_e _o_p_e_r_a_t_o_r_-_ () const │ │ │ │ │ +455 { │ │ │ │ │ +456 V result; │ │ │ │ │ +457 using idx_type = typename decltype(result)_:_:_s_i_z_e___t_y_p_e; │ │ │ │ │ +458 │ │ │ │ │ +459 for (idx_type i = 0; i < _s_i_z_e(); ++i) │ │ │ │ │ +460 result[i] = -asImp()[i]; │ │ │ │ │ 461 │ │ │ │ │ -462 │ │ │ │ │ -463 //===== matrix-matrix multiplication │ │ │ │ │ +462 return result; │ │ │ │ │ +463 } │ │ │ │ │ 464 │ │ │ │ │ -467 template │ │ │ │ │ -_4_6_8 friend auto _o_p_e_r_a_t_o_r_*_ ( const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& matrixA, │ │ │ │ │ -469 const _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_O_t_h_e_r_S_c_a_l_a_r_,_ _n_>& matrixB) │ │ │ │ │ -470 { │ │ │ │ │ -471 auto result = _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_O_t_h_e_r_S_c_a_l_a_r_>_:_: │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e, n>{}; │ │ │ │ │ -472 for(int i=0; i │ │ │ │ │ +475 typename std::enable_if< │ │ │ │ │ +476 std::is_convertible::value, │ │ │ │ │ +477 _d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +478 >::type& │ │ │ │ │ +_4_7_9 _o_p_e_r_a_t_o_r_+_=_ (const ValueType& kk) │ │ │ │ │ +480 { │ │ │ │ │ +481 const _v_a_l_u_e___t_y_p_e& k = kk; │ │ │ │ │ +482 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +483 (*this)[i] += k; │ │ │ │ │ +484 return asImp(); │ │ │ │ │ 485 } │ │ │ │ │ 486 │ │ │ │ │ -_4_8_8 static constexpr _s_i_z_e___t_y_p_e _M () │ │ │ │ │ -489 { │ │ │ │ │ -490 return n; │ │ │ │ │ -491 } │ │ │ │ │ -492 │ │ │ │ │ -493 │ │ │ │ │ -494 │ │ │ │ │ -495 //===== query │ │ │ │ │ -496 │ │ │ │ │ -_4_9_8 bool _e_x_i_s_t_s (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) const │ │ │ │ │ -499 { │ │ │ │ │ -500 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i >= 0 && i < n); │ │ │ │ │ -501 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j >= 0 && j < n); │ │ │ │ │ -502 return i==j; │ │ │ │ │ -503 } │ │ │ │ │ -504 │ │ │ │ │ -505 │ │ │ │ │ -506 │ │ │ │ │ -_5_0_8 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ -_D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_K_,_n_>& a) │ │ │ │ │ -509 { │ │ │ │ │ -510 for (_s_i_z_e___t_y_p_e i=0; i(&diag_[i]), i); │ │ │ │ │ -522 } │ │ │ │ │ -523 │ │ │ │ │ -_5_2_5 _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 │ │ │ │ │ -526 { │ │ │ │ │ -527 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(const_cast(&diag_[i]), i); │ │ │ │ │ -528 } │ │ │ │ │ -529 │ │ │ │ │ -_5_3_1 const K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -532 { │ │ │ │ │ -533 return diag_[i]; │ │ │ │ │ -534 } │ │ │ │ │ -535 │ │ │ │ │ -_5_3_7 K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e i) │ │ │ │ │ -538 { │ │ │ │ │ -539 return diag_[i]; │ │ │ │ │ -540 } │ │ │ │ │ -541 │ │ │ │ │ -_5_4_3 const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_n_>& _d_i_a_g_o_n_a_l() const │ │ │ │ │ -544 { │ │ │ │ │ -545 return diag_; │ │ │ │ │ -546 } │ │ │ │ │ -547 │ │ │ │ │ -_5_4_9 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_n_>& _d_i_a_g_o_n_a_l() │ │ │ │ │ -550 { │ │ │ │ │ -551 return diag_; │ │ │ │ │ -552 } │ │ │ │ │ -553 │ │ │ │ │ -554 private: │ │ │ │ │ -555 │ │ │ │ │ -556 // the data, a FieldVector storing the diagonal │ │ │ │ │ -557 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_n_> diag_; │ │ │ │ │ -558 }; │ │ │ │ │ -559 │ │ │ │ │ -560 template< class K, int n > │ │ │ │ │ -_5_6_1 struct _F_i_e_l_d_T_r_a_i_t_s< _D_i_a_g_o_n_a_l_M_a_t_r_i_x > │ │ │ │ │ -562 { │ │ │ │ │ -_5_6_3 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_6_4 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; │ │ │ │ │ -565 }; │ │ │ │ │ -566 │ │ │ │ │ -567 │ │ │ │ │ -568#ifndef DOXYGEN // hide specialization │ │ │ │ │ -571 template< class K > │ │ │ │ │ -572 class _D_i_a_g_o_n_a_l_M_a_t_r_i_x : public _F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -573 { │ │ │ │ │ -574 typedef _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_> Base; │ │ │ │ │ -575 public: │ │ │ │ │ -577 typedef typename Base::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -578 │ │ │ │ │ -581 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ +488 │ │ │ │ │ +496 template │ │ │ │ │ +497 typename std::enable_if< │ │ │ │ │ +498 std::is_convertible::value, │ │ │ │ │ +499 _d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +500 >::type& │ │ │ │ │ +_5_0_1 _o_p_e_r_a_t_o_r_-_=_ (const ValueType& kk) │ │ │ │ │ +502 { │ │ │ │ │ +503 const _v_a_l_u_e___t_y_p_e& k = kk; │ │ │ │ │ +504 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +505 (*this)[i] -= k; │ │ │ │ │ +506 return asImp(); │ │ │ │ │ +507 } │ │ │ │ │ +508 │ │ │ │ │ +510 │ │ │ │ │ +518 template │ │ │ │ │ +519 typename std::enable_if< │ │ │ │ │ +520 std::is_convertible::value, │ │ │ │ │ +521 _d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +522 >::type& │ │ │ │ │ +_5_2_3 _o_p_e_r_a_t_o_r_*_=_ (const FieldType& kk) │ │ │ │ │ +524 { │ │ │ │ │ +525 const _f_i_e_l_d___t_y_p_e& k = kk; │ │ │ │ │ +526 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +527 (*this)[i] *= k; │ │ │ │ │ +528 return asImp(); │ │ │ │ │ +529 } │ │ │ │ │ +530 │ │ │ │ │ +532 │ │ │ │ │ +540 template │ │ │ │ │ +541 typename std::enable_if< │ │ │ │ │ +542 std::is_convertible::value, │ │ │ │ │ +543 _d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +544 >::type& │ │ │ │ │ +_5_4_5 _o_p_e_r_a_t_o_r_/_=_ (const FieldType& kk) │ │ │ │ │ +546 { │ │ │ │ │ +547 const _f_i_e_l_d___t_y_p_e& k = kk; │ │ │ │ │ +548 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +549 (*this)[i] /= k; │ │ │ │ │ +550 return asImp(); │ │ │ │ │ +551 } │ │ │ │ │ +552 │ │ │ │ │ +554 template │ │ │ │ │ +_5_5_5 bool _o_p_e_r_a_t_o_r_=_=_ (const _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>& x) const │ │ │ │ │ +556 { │ │ │ │ │ +557 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +558 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +559 if ((*this)[i]!=x[i]) │ │ │ │ │ +560 return false; │ │ │ │ │ +561 │ │ │ │ │ +562 return true; │ │ │ │ │ +563 } │ │ │ │ │ +564 │ │ │ │ │ +566 template │ │ │ │ │ +_5_6_7 bool _o_p_e_r_a_t_o_r_!_=_ (const _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>& x) const │ │ │ │ │ +568 { │ │ │ │ │ +569 return !_o_p_e_r_a_t_o_r_=_=(x); │ │ │ │ │ +570 } │ │ │ │ │ +571 │ │ │ │ │ +572 │ │ │ │ │ +574 template │ │ │ │ │ +_5_7_5 _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_V_e_c_t_o_r_<_O_t_h_e_r_>& x) │ │ │ │ │ +576 { │ │ │ │ │ +577 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +578 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +579 (*this)[i] += a*x[i]; │ │ │ │ │ +580 return asImp(); │ │ │ │ │ +581 } │ │ │ │ │ 582 │ │ │ │ │ -583 typedef typename Base::row_type _r_o_w___t_y_p_e; │ │ │ │ │ -584 │ │ │ │ │ -585 typedef typename Base::row_reference _r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -586 typedef typename Base::const_row_reference _c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -587 │ │ │ │ │ -590 constexpr static int _r_o_w_s = 1; │ │ │ │ │ -593 constexpr static int _c_o_l_s = 1; │ │ │ │ │ -594 │ │ │ │ │ -595 │ │ │ │ │ -597 constexpr _D_i_a_g_o_n_a_l_M_a_t_r_i_x() = default; │ │ │ │ │ -598 │ │ │ │ │ -600 _D_i_a_g_o_n_a_l_M_a_t_r_i_x(const K& scalar) │ │ │ │ │ -601 { │ │ │ │ │ -602 (*this)[0][0] = scalar; │ │ │ │ │ -603 } │ │ │ │ │ -604 │ │ │ │ │ -606 const K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e) const │ │ │ │ │ -607 { │ │ │ │ │ -608 return (*this)[0][0]; │ │ │ │ │ -609 } │ │ │ │ │ -610 │ │ │ │ │ -612 K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e) │ │ │ │ │ -613 { │ │ │ │ │ -614 return (*this)[0][0]; │ │ │ │ │ +590 template │ │ │ │ │ +_5_9_1 typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_f_i_e_l_d___t_y_p_e_,_t_y_p_e_n_a_m_e_ _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>_:_: │ │ │ │ │ +_f_i_e_l_d___t_y_p_e>::PromotedType _o_p_e_r_a_t_o_r_*_ (const _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>& x) const { │ │ │ │ │ +592 typedef typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_f_i_e_l_d___t_y_p_e_,_ _t_y_p_e_n_a_m_e_ _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>_:_: │ │ │ │ │ +_f_i_e_l_d___t_y_p_e>::PromotedType PromotedType; │ │ │ │ │ +593 PromotedType result(0); │ │ │ │ │ +594 assert(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +595 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) { │ │ │ │ │ +596 result += PromotedType((*this)[i]*x[i]); │ │ │ │ │ +597 } │ │ │ │ │ +598 return result; │ │ │ │ │ +599 } │ │ │ │ │ +600 │ │ │ │ │ +608 template │ │ │ │ │ +_6_0_9 typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_f_i_e_l_d___t_y_p_e_,_t_y_p_e_n_a_m_e_ _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>_:_: │ │ │ │ │ +_f_i_e_l_d___t_y_p_e>::PromotedType _d_o_t(const _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>& x) const { │ │ │ │ │ +610 typedef typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_f_i_e_l_d___t_y_p_e_,_ _t_y_p_e_n_a_m_e_ _D_e_n_s_e_V_e_c_t_o_r_<_O_t_h_e_r_>_:_: │ │ │ │ │ +_f_i_e_l_d___t_y_p_e>::PromotedType PromotedType; │ │ │ │ │ +611 PromotedType result(0); │ │ │ │ │ +612 assert(x._s_i_z_e() == _s_i_z_e()); │ │ │ │ │ +613 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) { │ │ │ │ │ +614 result += _D_u_n_e_:_:_d_o_t((*this)[i],x[i]); │ │ │ │ │ 615 } │ │ │ │ │ -616 │ │ │ │ │ -618 const FieldVector& _d_i_a_g_o_n_a_l() const │ │ │ │ │ -619 { │ │ │ │ │ -620 return (*this)[0]; │ │ │ │ │ -621 } │ │ │ │ │ -622 │ │ │ │ │ -624 FieldVector& _d_i_a_g_o_n_a_l() │ │ │ │ │ -625 { │ │ │ │ │ -626 return (*this)[0]; │ │ │ │ │ -627 } │ │ │ │ │ -628 │ │ │ │ │ -630 DiagonalMatrix _t_r_a_n_s_p_o_s_e_d() const │ │ │ │ │ -631 { │ │ │ │ │ -632 return *this; │ │ │ │ │ -633 } │ │ │ │ │ -634 │ │ │ │ │ -637 template │ │ │ │ │ -638 friend auto _o_p_e_r_a_t_o_r_*_ ( const _D_i_a_g_o_n_a_l_M_a_t_r_i_x& matrixA, │ │ │ │ │ -639 const DiagonalMatrix& matrixB) │ │ │ │ │ -640 { │ │ │ │ │ -641 return DiagonalMatrix:: │ │ │ │ │ -PromotedType, 1>{matrixA.diagonal(0)*matrixB.diagonal(0)}; │ │ │ │ │ -642 } │ │ │ │ │ -643 │ │ │ │ │ -644 }; │ │ │ │ │ -645#endif │ │ │ │ │ -646 │ │ │ │ │ -647 │ │ │ │ │ -648 template │ │ │ │ │ -_6_4_9 class _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r │ │ │ │ │ -650 { │ │ │ │ │ -651 typedef typename DiagonalMatrixType::reference reference; │ │ │ │ │ -652 typedef typename DiagonalMatrixType::const_reference const_reference; │ │ │ │ │ -653 typedef typename DiagonalMatrixType::field_type K; │ │ │ │ │ -654 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_K_,_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_T_y_p_e_:_:_r_o_w_s_> _r_o_w___t_y_p_e; │ │ │ │ │ -655 typedef std::size_t size_type; │ │ │ │ │ -_6_5_6 typedef _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_T_y_p_e_> _M_y_T_y_p_e; │ │ │ │ │ +616 return result; │ │ │ │ │ +617 } │ │ │ │ │ +618 │ │ │ │ │ +619 //===== norms │ │ │ │ │ +620 │ │ │ │ │ +_6_2_2 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 _o_n_e___n_o_r_m() const { │ │ │ │ │ +623 using std::abs; │ │ │ │ │ +624 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 result( 0 ); │ │ │ │ │ +625 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +626 result += abs((*this)[i]); │ │ │ │ │ +627 return result; │ │ │ │ │ +628 } │ │ │ │ │ +629 │ │ │ │ │ +630 │ │ │ │ │ +_6_3_2 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 _o_n_e___n_o_r_m___r_e_a_l () const │ │ │ │ │ +633 { │ │ │ │ │ +634 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 result( 0 ); │ │ │ │ │ +635 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +636 result += fvmeta::absreal((*this)[i]); │ │ │ │ │ +637 return result; │ │ │ │ │ +638 } │ │ │ │ │ +639 │ │ │ │ │ +_6_4_1 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 _t_w_o___n_o_r_m () const │ │ │ │ │ +642 { │ │ │ │ │ +643 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 result( 0 ); │ │ │ │ │ +644 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +645 result += fvmeta::abs2((*this)[i]); │ │ │ │ │ +646 return fvmeta::sqrt(result); │ │ │ │ │ +647 } │ │ │ │ │ +648 │ │ │ │ │ +_6_5_0 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 _t_w_o___n_o_r_m_2 () const │ │ │ │ │ +651 { │ │ │ │ │ +652 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 result( 0 ); │ │ │ │ │ +653 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +654 result += fvmeta::abs2((*this)[i]); │ │ │ │ │ +655 return result; │ │ │ │ │ +656 } │ │ │ │ │ 657 │ │ │ │ │ -658 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r; │ │ │ │ │ -659 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r; │ │ │ │ │ -660 │ │ │ │ │ -661 public: │ │ │ │ │ -662 │ │ │ │ │ -_6_6_3 _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r() : │ │ │ │ │ -664 mat_(0) │ │ │ │ │ -665 {} │ │ │ │ │ -666 │ │ │ │ │ -_6_6_7 _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r(const DiagonalMatrixType* mat) : │ │ │ │ │ -668 mat_(const_cast(mat)) │ │ │ │ │ -669 {} │ │ │ │ │ -670 │ │ │ │ │ -_6_7_1 size_type _r_e_a_l_I_n_d_e_x(int i) const │ │ │ │ │ -672 { │ │ │ │ │ -673 return i; │ │ │ │ │ -674 } │ │ │ │ │ -675 │ │ │ │ │ -_6_7_6 _r_o_w___t_y_p_e* _p_o_i_n_t_e_r(int i) const │ │ │ │ │ -677 { │ │ │ │ │ -678 row_ = _r_o_w___t_y_p_e(&(mat_->diagonal(i)), i); │ │ │ │ │ -679 return &row_; │ │ │ │ │ -680 } │ │ │ │ │ -681 │ │ │ │ │ -_6_8_2 bool _i_d_e_n_t_i_c_a_l(const _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r& other) const │ │ │ │ │ -683 { │ │ │ │ │ -684 return mat_==other.mat_; │ │ │ │ │ +659 template ::value, int>::type = 0> │ │ │ │ │ +_6_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() const { │ │ │ │ │ +662 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; │ │ │ │ │ +663 using std::abs; │ │ │ │ │ +664 using std::max; │ │ │ │ │ +665 │ │ │ │ │ +666 real_type norm = 0; │ │ │ │ │ +667 for (auto const &x : *this) { │ │ │ │ │ +668 real_type const a = abs(x); │ │ │ │ │ +669 norm = max(a, norm); │ │ │ │ │ +670 } │ │ │ │ │ +671 return norm; │ │ │ │ │ +672 } │ │ │ │ │ +673 │ │ │ │ │ +675 template ::value, int>::type = 0> │ │ │ │ │ +_6_7_7 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 { │ │ │ │ │ +678 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; │ │ │ │ │ +679 using std::max; │ │ │ │ │ +680 │ │ │ │ │ +681 real_type norm = 0; │ │ │ │ │ +682 for (auto const &x : *this) { │ │ │ │ │ +683 real_type const a = fvmeta::absreal(x); │ │ │ │ │ +684 norm = max(a, norm); │ │ │ │ │ 685 } │ │ │ │ │ -686 │ │ │ │ │ -687 private: │ │ │ │ │ +686 return norm; │ │ │ │ │ +687 } │ │ │ │ │ 688 │ │ │ │ │ -689 mutable DiagonalMatrixType* mat_; │ │ │ │ │ -690 mutable row_type row_; │ │ │ │ │ -691 }; │ │ │ │ │ -692 │ │ │ │ │ -696 template< class K, int n > │ │ │ │ │ -_6_9_7 class _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t │ │ │ │ │ -698 { │ │ │ │ │ -699 template │ │ │ │ │ -_7_0_0 friend class _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r; │ │ │ │ │ -701 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r<_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t, const K, │ │ │ │ │ -const K&>; │ │ │ │ │ -702 │ │ │ │ │ -703 public: │ │ │ │ │ -704 // remember size of vector │ │ │ │ │ -_7_0_5 constexpr static int _d_i_m_e_n_s_i_o_n = n; │ │ │ │ │ +690 template ::value, int>::type = 0> │ │ │ │ │ +_6_9_2 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 { │ │ │ │ │ +693 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; │ │ │ │ │ +694 using std::abs; │ │ │ │ │ +695 using std::max; │ │ │ │ │ +696 │ │ │ │ │ +697 real_type norm = 0; │ │ │ │ │ +698 real_type isNaN = 1; │ │ │ │ │ +699 for (auto const &x : *this) { │ │ │ │ │ +700 real_type const a = abs(x); │ │ │ │ │ +701 norm = max(a, norm); │ │ │ │ │ +702 isNaN += a; │ │ │ │ │ +703 } │ │ │ │ │ +704 return norm * (isNaN / isNaN); │ │ │ │ │ +705 } │ │ │ │ │ 706 │ │ │ │ │ -707 // standard constructor and everything is sufficient ... │ │ │ │ │ -708 │ │ │ │ │ -709 //===== type definitions and constants │ │ │ │ │ -710 │ │ │ │ │ -_7_1_2 typedef K _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +708 template ::value, int>::type = 0> │ │ │ │ │ +_7_1_0 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 { │ │ │ │ │ +711 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; │ │ │ │ │ +712 using std::max; │ │ │ │ │ 713 │ │ │ │ │ -_7_1_5 typedef K _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -716 │ │ │ │ │ -_7_1_8 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -719 │ │ │ │ │ -_7_2_1 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ -722 │ │ │ │ │ -_7_2_4 constexpr static int _s_i_z_e = n; │ │ │ │ │ +714 real_type norm = 0; │ │ │ │ │ +715 real_type isNaN = 1; │ │ │ │ │ +716 for (auto const &x : *this) { │ │ │ │ │ +717 real_type const a = fvmeta::absreal(x); │ │ │ │ │ +718 norm = max(a, norm); │ │ │ │ │ +719 isNaN += a; │ │ │ │ │ +720 } │ │ │ │ │ +721 return norm * (isNaN / isNaN); │ │ │ │ │ +722 } │ │ │ │ │ +723 │ │ │ │ │ +724 //===== sizes │ │ │ │ │ 725 │ │ │ │ │ -_7_2_7 _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t() : │ │ │ │ │ -728 _p__(0), │ │ │ │ │ -729 _r_o_w__(0) │ │ │ │ │ -730 {} │ │ │ │ │ +_7_2_7 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ +728 { │ │ │ │ │ +729 return _s_i_z_e(); │ │ │ │ │ +730 } │ │ │ │ │ 731 │ │ │ │ │ -_7_3_3 explicit _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t (K* p, int col) : │ │ │ │ │ -734 _p__(p), │ │ │ │ │ -735 _r_o_w__(col) │ │ │ │ │ -736 {} │ │ │ │ │ +_7_3_3 _s_i_z_e___t_y_p_e _d_i_m () const │ │ │ │ │ +734 { │ │ │ │ │ +735 return _s_i_z_e(); │ │ │ │ │ +736 } │ │ │ │ │ 737 │ │ │ │ │ -738 //===== access to components │ │ │ │ │ +738 }; │ │ │ │ │ 739 │ │ │ │ │ -_7_4_1 const K& _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] _s_i_z_e___t_y_p_e i) const │ │ │ │ │ -742 { │ │ │ │ │ -743 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i == _r_o_w__); │ │ │ │ │ -744 return *_p__; │ │ │ │ │ -745 } │ │ │ │ │ -746 │ │ │ │ │ -747 // check if row is identical to other row (not only identical values) │ │ │ │ │ -748 // since this is a proxy class we need to check equality of the stored │ │ │ │ │ -pointer │ │ │ │ │ -_7_4_9 bool _i_d_e_n_t_i_c_a_l(const _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_>& other) const │ │ │ │ │ +748 template │ │ │ │ │ +_7_4_9 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _D_e_n_s_e_V_e_c_t_o_r_<_V_>& v) │ │ │ │ │ 750 { │ │ │ │ │ -751 return ((_p__ == other._p__)and (_r_o_w__ == other._r_o_w__)); │ │ │ │ │ -752 } │ │ │ │ │ -753 │ │ │ │ │ -_7_5_5 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_>, const K, │ │ │ │ │ -const K&> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_5_7 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; │ │ │ │ │ -758 │ │ │ │ │ -_7_6_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ -761 { │ │ │ │ │ -762 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ -763 } │ │ │ │ │ -764 │ │ │ │ │ -_7_6_6 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ -767 { │ │ │ │ │ -768 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,1); │ │ │ │ │ -769 } │ │ │ │ │ -770 │ │ │ │ │ -_7_7_3 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -774 { │ │ │ │ │ -775 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ -776 } │ │ │ │ │ -777 │ │ │ │ │ -_7_8_0 _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 │ │ │ │ │ -781 { │ │ │ │ │ -782 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,-1); │ │ │ │ │ -783 } │ │ │ │ │ -784 │ │ │ │ │ -_7_8_6 bool _o_p_e_r_a_t_o_r_=_=_ (const _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t& y) const │ │ │ │ │ -787 { │ │ │ │ │ -788 return ((_p__==y._p__)and (_r_o_w__==y._r_o_w__)); │ │ │ │ │ -789 } │ │ │ │ │ -790 │ │ │ │ │ -791 //===== sizes │ │ │ │ │ -792 │ │ │ │ │ -_7_9_4 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ -795 { │ │ │ │ │ -796 return n; │ │ │ │ │ -797 } │ │ │ │ │ -798 │ │ │ │ │ -_8_0_0 _s_i_z_e___t_y_p_e _d_i_m () const │ │ │ │ │ -801 { │ │ │ │ │ -802 return n; │ │ │ │ │ -803 } │ │ │ │ │ -804 │ │ │ │ │ -_8_0_6 _s_i_z_e___t_y_p_e _r_o_w_I_n_d_e_x() const │ │ │ │ │ -807 { │ │ │ │ │ -808 return _r_o_w__; │ │ │ │ │ -809 } │ │ │ │ │ -810 │ │ │ │ │ -_8_1_2 const K& _d_i_a_g_o_n_a_l() const │ │ │ │ │ -813 { │ │ │ │ │ -814 return *_p__; │ │ │ │ │ -815 } │ │ │ │ │ -816 │ │ │ │ │ -817 protected: │ │ │ │ │ -818 │ │ │ │ │ -_8_1_9 _s_i_z_e___t_y_p_e _r_e_a_l_I_n_d_e_x([[maybe_unused]] int i) const │ │ │ │ │ -820 { │ │ │ │ │ -821 return _r_o_w_I_n_d_e_x(); │ │ │ │ │ -822 } │ │ │ │ │ -823 │ │ │ │ │ -_8_2_4 K* _p_o_i_n_t_e_r([[maybe_unused]] _s_i_z_e___t_y_p_e i) const │ │ │ │ │ -825 { │ │ │ │ │ -826 return const_cast(_p__); │ │ │ │ │ -827 } │ │ │ │ │ -828 │ │ │ │ │ -_8_2_9 _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t* _o_p_e_r_a_t_o_r_&() │ │ │ │ │ -830 { │ │ │ │ │ -831 return this; │ │ │ │ │ -832 } │ │ │ │ │ -833 │ │ │ │ │ -834 // the data, very simply a pointer to the diagonal value and the row number │ │ │ │ │ -_8_3_5 K* _p__; │ │ │ │ │ -_8_3_6 _s_i_z_e___t_y_p_e _r_o_w__; │ │ │ │ │ -837 }; │ │ │ │ │ -838 │ │ │ │ │ -839 template< class K, int n > │ │ │ │ │ -_8_4_0 class _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r : public _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t │ │ │ │ │ -841 { │ │ │ │ │ -842 template │ │ │ │ │ -_8_4_3 friend class _D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r; │ │ │ │ │ -844 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r<_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r, K, K&>; │ │ │ │ │ -845 │ │ │ │ │ -846 public: │ │ │ │ │ -847 // standard constructor and everything is sufficient ... │ │ │ │ │ -848 │ │ │ │ │ -849 //===== type definitions and constants │ │ │ │ │ -850 │ │ │ │ │ -_8_5_2 typedef K _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -853 │ │ │ │ │ -_8_5_5 typedef K _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -856 │ │ │ │ │ -_8_5_8 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -859 │ │ │ │ │ -_8_6_1 _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r() : _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t() │ │ │ │ │ -862 {} │ │ │ │ │ -863 │ │ │ │ │ -_8_6_5 explicit _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r (K* p, int col) : _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t(p, │ │ │ │ │ -col) │ │ │ │ │ -866 {} │ │ │ │ │ -867 │ │ │ │ │ -868 //===== assignment from scalar │ │ │ │ │ -_8_7_0 _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const K& k) │ │ │ │ │ -871 { │ │ │ │ │ -872 *_p__ = k; │ │ │ │ │ -873 return *this; │ │ │ │ │ -874 } │ │ │ │ │ -875 │ │ │ │ │ -876 //===== access to components │ │ │ │ │ -877 │ │ │ │ │ -_8_7_9 K& _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] _s_i_z_e___t_y_p_e i) │ │ │ │ │ -880 { │ │ │ │ │ -881 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i == _r_o_w__); │ │ │ │ │ -882 return *_p__; │ │ │ │ │ -883 } │ │ │ │ │ -884 │ │ │ │ │ -_8_8_6 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_K_,_n_>, K, K&> _I_t_e_r_a_t_o_r; │ │ │ │ │ -_8_8_8 typedef _I_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ -889 │ │ │ │ │ -_8_9_1 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -892 { │ │ │ │ │ -893 return _I_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -894 } │ │ │ │ │ -895 │ │ │ │ │ -_8_9_7 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -898 { │ │ │ │ │ -899 return _I_t_e_r_a_t_o_r(*this, 1); │ │ │ │ │ -900 } │ │ │ │ │ -901 │ │ │ │ │ -_9_0_4 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -905 { │ │ │ │ │ -906 return _I_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -907 } │ │ │ │ │ -908 │ │ │ │ │ -_9_1_1 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ -912 { │ │ │ │ │ -913 return _I_t_e_r_a_t_o_r(*this, -1); │ │ │ │ │ -914 } │ │ │ │ │ -915 │ │ │ │ │ -_9_1_7 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_<_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_>, const K, │ │ │ │ │ -const K&> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_9_1_9 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; │ │ │ │ │ -920 │ │ │ │ │ -921 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_i_d_e_n_t_i_c_a_l; │ │ │ │ │ -922 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t::operator[]; │ │ │ │ │ -923 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t::operator==; │ │ │ │ │ -924 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_g_i_n; │ │ │ │ │ -925 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_e_n_d; │ │ │ │ │ -926 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_f_o_r_e_E_n_d; │ │ │ │ │ -927 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_f_o_r_e_B_e_g_i_n; │ │ │ │ │ -928 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_N; │ │ │ │ │ -929 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_d_i_m; │ │ │ │ │ -930 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_r_o_w_I_n_d_e_x; │ │ │ │ │ -931 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_d_i_a_g_o_n_a_l; │ │ │ │ │ -932 │ │ │ │ │ -933 protected: │ │ │ │ │ -934 │ │ │ │ │ -_9_3_5 _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r* _o_p_e_r_a_t_o_r_&() │ │ │ │ │ -936 { │ │ │ │ │ -937 return this; │ │ │ │ │ -938 } │ │ │ │ │ -939 │ │ │ │ │ -940 private: │ │ │ │ │ -941 │ │ │ │ │ -942 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_p__; │ │ │ │ │ -943 using _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_r_o_w__; │ │ │ │ │ -944 }; │ │ │ │ │ -945 │ │ │ │ │ -946 │ │ │ │ │ -947 // implement type traits │ │ │ │ │ -948 template │ │ │ │ │ -_9_4_9 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e< _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r > │ │ │ │ │ -950 { │ │ │ │ │ -_9_5_1 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_> _t_y_p_e; │ │ │ │ │ -952 }; │ │ │ │ │ -953 │ │ │ │ │ -954 template │ │ │ │ │ -_9_5_5 struct _c_o_n_s_t___r_e_f_e_r_e_n_c_e< _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t > │ │ │ │ │ -956 { │ │ │ │ │ -_9_5_7 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_K_,_n_> _t_y_p_e; │ │ │ │ │ -958 }; │ │ │ │ │ -959 │ │ │ │ │ -960 template │ │ │ │ │ -_9_6_1 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e< _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r > │ │ │ │ │ -962 { │ │ │ │ │ -_9_6_3 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_K_,_n_> _t_y_p_e; │ │ │ │ │ -964 }; │ │ │ │ │ -965 │ │ │ │ │ -966 template │ │ │ │ │ -_9_6_7 struct _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e< _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t > │ │ │ │ │ -968 { │ │ │ │ │ -_9_6_9 typedef _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_K_,_n_> _t_y_p_e; │ │ │ │ │ -970 }; │ │ │ │ │ -971 │ │ │ │ │ -972 │ │ │ │ │ -973 │ │ │ │ │ -996 template │ │ │ │ │ -_9_9_7 class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r : public │ │ │ │ │ -_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, R, int> │ │ │ │ │ -998 { │ │ │ │ │ -_9_9_9 typedef typename std::remove_const::type NonConstCW; │ │ │ │ │ -1000 │ │ │ │ │ -1001 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r:: │ │ │ │ │ -type, typename _m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e::type>; │ │ │ │ │ -1002 friend class _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r:: │ │ │ │ │ -type, typename const_reference::type>; │ │ │ │ │ -1003 │ │ │ │ │ -1004 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -typename mutable_reference::type> _M_y_T_y_p_e; │ │ │ │ │ -1005 typedef _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -typename const_reference::type> _M_y_C_o_n_s_t_T_y_p_e; │ │ │ │ │ -1006 │ │ │ │ │ -1007 public: │ │ │ │ │ -1008 │ │ │ │ │ -1009 // Constructors needed by the facade iterators. │ │ │ │ │ -_1_0_1_0 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r() : │ │ │ │ │ -1011 containerWrapper_(), │ │ │ │ │ -1012 position_(0) │ │ │ │ │ -1013 {} │ │ │ │ │ -1014 │ │ │ │ │ -_1_0_1_5 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r(CW containerWrapper, int position) : │ │ │ │ │ -1016 containerWrapper_(containerWrapper), │ │ │ │ │ -1017 position_(position) │ │ │ │ │ -1018 {} │ │ │ │ │ -1019 │ │ │ │ │ -1020 template │ │ │ │ │ -_1_0_2_1 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r(OtherContainerWrapperIteratorType& other) : │ │ │ │ │ -1022 containerWrapper_(other.containerWrapper_), │ │ │ │ │ -1023 position_(other.position_) │ │ │ │ │ -1024 {} │ │ │ │ │ -1025 │ │ │ │ │ -_1_0_2_6 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r(const _M_y_T_y_p_e& other) : │ │ │ │ │ -1027 containerWrapper_(other.containerWrapper_), │ │ │ │ │ -1028 position_(other.position_) │ │ │ │ │ -1029 {} │ │ │ │ │ -1030 │ │ │ │ │ -_1_0_3_1 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r(const _M_y_C_o_n_s_t_T_y_p_e& other) : │ │ │ │ │ -1032 containerWrapper_(other.containerWrapper_), │ │ │ │ │ -1033 position_(other.position_) │ │ │ │ │ -1034 {} │ │ │ │ │ -1035 │ │ │ │ │ -1036 template │ │ │ │ │ -_1_0_3_7 _C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(OtherContainerWrapperIteratorType& │ │ │ │ │ -other) │ │ │ │ │ -1038 { │ │ │ │ │ -1039 containerWrapper_ = other.containerWrapper_; │ │ │ │ │ -1040 position_ = other.position_; │ │ │ │ │ -1041 return *this; │ │ │ │ │ -1042 } │ │ │ │ │ -1043 │ │ │ │ │ -1044 // This operator is needed since we can not get the address of the │ │ │ │ │ -1045 // temporary object returned by dereference │ │ │ │ │ -_1_0_4_6 T* _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -1047 { │ │ │ │ │ -1048 return containerWrapper_.pointer(position_); │ │ │ │ │ -1049 } │ │ │ │ │ -1050 │ │ │ │ │ -1051 // Methods needed by the forward iterator │ │ │ │ │ -_1_0_5_2 bool _e_q_u_a_l_s(const _M_y_T_y_p_e& other) const │ │ │ │ │ -1053 { │ │ │ │ │ -1054 return position_ == other.position_ && containerWrapper_.identical │ │ │ │ │ -(other.containerWrapper_); │ │ │ │ │ -1055 } │ │ │ │ │ -1056 │ │ │ │ │ -_1_0_5_7 bool _e_q_u_a_l_s(const _M_y_C_o_n_s_t_T_y_p_e& other) const │ │ │ │ │ -1058 { │ │ │ │ │ -1059 return position_ == other.position_ && containerWrapper_.identical │ │ │ │ │ -(other.containerWrapper_); │ │ │ │ │ -1060 } │ │ │ │ │ -1061 │ │ │ │ │ -_1_0_6_2 R _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -1063 { │ │ │ │ │ -1064 return *containerWrapper_.pointer(position_); │ │ │ │ │ -1065 } │ │ │ │ │ -1066 │ │ │ │ │ -_1_0_6_7 void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -1068 { │ │ │ │ │ -1069 ++position_; │ │ │ │ │ -1070 } │ │ │ │ │ -1071 │ │ │ │ │ -1072 // Additional function needed by BidirectionalIterator │ │ │ │ │ -_1_0_7_3 void _d_e_c_r_e_m_e_n_t() │ │ │ │ │ -1074 { │ │ │ │ │ -1075 --position_; │ │ │ │ │ -1076 } │ │ │ │ │ -1077 │ │ │ │ │ -1078 // Additional function needed by RandomAccessIterator │ │ │ │ │ -_1_0_7_9 R _e_l_e_m_e_n_t_A_t(int i) const │ │ │ │ │ -1080 { │ │ │ │ │ -1081 return *containerWrapper_.pointer(position_+i); │ │ │ │ │ -1082 } │ │ │ │ │ -1083 │ │ │ │ │ -_1_0_8_4 void _a_d_v_a_n_c_e(int n) │ │ │ │ │ -1085 { │ │ │ │ │ -1086 position_=position_+n; │ │ │ │ │ -1087 } │ │ │ │ │ -1088 │ │ │ │ │ -1089 template │ │ │ │ │ -_1_0_9_0 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(OtherContainerWrapperIteratorType& other) const │ │ │ │ │ -1091 { │ │ │ │ │ -1092 assert(containerWrapper_.identical(other)); │ │ │ │ │ -1093 return other.position_ - position_; │ │ │ │ │ -1094 } │ │ │ │ │ -1095 │ │ │ │ │ -_1_0_9_6 std::ptrdiff_t _i_n_d_e_x() const │ │ │ │ │ -1097 { │ │ │ │ │ -1098 return containerWrapper_.realIndex(position_); │ │ │ │ │ -1099 } │ │ │ │ │ -1100 │ │ │ │ │ -1101 private: │ │ │ │ │ -1102 NonConstCW containerWrapper_; │ │ │ │ │ -1103 size_t position_; │ │ │ │ │ -1104 }; │ │ │ │ │ -1105 │ │ │ │ │ -1106 template │ │ │ │ │ -_1_1_0_7 struct _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, _D_i_a_g_o_n_a_l_M_a_t_r_i_x> { │ │ │ │ │ -_1_1_0_8 static void _a_p_p_l_y(_D_e_n_s_e_M_a_t_r_i_x& denseMatrix, │ │ │ │ │ -1109 _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_f_i_e_l_d_,_ _N_> const& rhs) { │ │ │ │ │ -1110 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(denseMatrix._M() == N); │ │ │ │ │ -1111 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(denseMatrix._N() == N); │ │ │ │ │ -1112 denseMatrix = field(0); │ │ │ │ │ -1113 for (int i = 0; i < N; ++i) │ │ │ │ │ -1114 denseMatrix[i][i] = rhs._d_i_a_g_o_n_a_l()[i]; │ │ │ │ │ -1115 } │ │ │ │ │ -1116 }; │ │ │ │ │ -1117 /* @} */ │ │ │ │ │ -1118} // end namespace │ │ │ │ │ -1119#endif │ │ │ │ │ -_f_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implements a matrix constructed from a given type representing a field and │ │ │ │ │ -compile-time given number ... │ │ │ │ │ -_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -_d_e_n_s_e_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implements a matrix constructed from a given type representing a field and a │ │ │ │ │ -compile-time given numbe... │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ +751 for (typename _D_e_n_s_e_V_e_c_t_o_r_<_V_>_:_:_s_i_z_e___t_y_p_e i=0; i0) ? " " : "") << v[i]; │ │ │ │ │ +753 return s; │ │ │ │ │ +754 } │ │ │ │ │ +755 │ │ │ │ │ +758} // end namespace │ │ │ │ │ +759 │ │ │ │ │ +760#endif // DUNE_DENSEVECTOR_HH │ │ │ │ │ +_m_a_t_v_e_c_t_r_a_i_t_s_._h_h │ │ │ │ │ +Documentation of the traits classes you need to write for each implementation │ │ │ │ │ +of DenseVector or Dense... │ │ │ │ │ _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. │ │ │ │ │ -_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. │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ +_d_o_t_p_r_o_d_u_c_t_._h_h │ │ │ │ │ +Provides the functions dot(a,b) := and dotT(a,b) := . │ │ │ │ │ +_f_t_r_a_i_t_s_._h_h │ │ │ │ │ +Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +_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. │ │ │ │ │ +_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_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -ConstIterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_t_r_a_n_s_p_o_s_e_d │ │ │ │ │ -DiagonalMatrix< K, n > transposed() const │ │ │ │ │ -Return transposed of the matrix as DiagonalMatrix. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ -void mmhv(const X &x, Y &y) const │ │ │ │ │ -y -= A^H x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:357 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -DiagonalMatrix & operator*=(const K &k) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< K >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:563 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for the index access and size operations. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_d_i_m │ │ │ │ │ -size_type dim() const │ │ │ │ │ -dimension of the vector space │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:800 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -row_type row_reference │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -K & operator[](size_type i) │ │ │ │ │ -random access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:879 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -ContainerWrapperIterator & operator=(OtherContainerWrapperIteratorType &other) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1037 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_r_o_w_s │ │ │ │ │ -static constexpr int rows │ │ │ │ │ -The number of rows. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_M │ │ │ │ │ -static constexpr size_type M() │ │ │ │ │ -number of blocks in column direction │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -FieldVector< K, n > & diagonal() │ │ │ │ │ -Get reference to diagonal vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:549 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:888 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1067 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_ _K_,_ _n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -DiagonalRowVectorConst< K, n > type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:957 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -T * operator->() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1046 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_s_i_z_e │ │ │ │ │ -static constexpr int size │ │ │ │ │ -The size of this vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:724 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_p_o_i_n_t_e_r │ │ │ │ │ -K * pointer(size_type i) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:824 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -K field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:712 │ │ │ │ │ -_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_ _K_,_ _n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -DiagonalRowVector< K, n > type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:963 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:773 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -const_row_type::ConstIterator ConstColIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:498 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< const WrapperType, const_reference, const_reference > │ │ │ │ │ -ConstIterator │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const_row_type const_row_reference │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_s_i_z_e │ │ │ │ │ -static constexpr size_type size() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_r_o_w__ │ │ │ │ │ -size_type row_ │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:836 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator(CW containerWrapper, int position) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1015 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r │ │ │ │ │ -DiagonalRowVector(K *p, int col) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:865 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -K & diagonal(size_type i) │ │ │ │ │ -Get reference to diagonal entry. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:537 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ -void solve(V &x, const V &b) const │ │ │ │ │ -Solve system A x = b. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:438 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_N │ │ │ │ │ -static constexpr size_type N() │ │ │ │ │ -number of blocks in row direction │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:482 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:911 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator(OtherContainerWrapperIteratorType &other) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1021 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const_reference operator[](size_type i) const │ │ │ │ │ -Return const_reference object as row replacement. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:525 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -begin ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:760 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator const_iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:919 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_i_d_e_n_t_i_c_a_l │ │ │ │ │ -bool identical(const DiagonalRowVectorConst< K, n > &other) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:749 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -DiagonalMatrix & operator-=(const DiagonalMatrix &y) │ │ │ │ │ -vector space subtraction │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t │ │ │ │ │ -DiagonalRowVectorConst(K *p, int col) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:733 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ -void mmtv(const X &x, Y &y) const │ │ │ │ │ -y -= A^T x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr int blocklevel │ │ │ │ │ -The number of block levels we contain. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:721 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_:_:_p_o_i_n_t_e_r │ │ │ │ │ -row_type * pointer(int i) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:676 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -DiagonalMatrix(const K &k) │ │ │ │ │ -Constructor initializing the whole matrix with a scalar. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< DiagonalRowVector< K, n >, K, K & > Iterator │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:886 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -R elementAt(int i) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1079 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType &other) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1090 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:904 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ -void umtv(const X &x, Y &y) const │ │ │ │ │ -y += A^T x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:309 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator const_iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:757 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -double infinity_norm_real() const │ │ │ │ │ -simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:427 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r │ │ │ │ │ -DiagonalMatrixWrapper(const DiagonalMatrixType *mat) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:667 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ -void umv(const X &x, Y &y) const │ │ │ │ │ -y += A x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< const WrapperType, reference, reference > Iterator │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_m_u_t_a_b_l_e___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_<_ _K_,_ _n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -DiagonalRowVector< K, n > type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:969 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ -double frobenius_norm() const │ │ │ │ │ -frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:409 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_c_o_l_s │ │ │ │ │ -static constexpr int cols │ │ │ │ │ -The number of columns. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:705 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_p__ │ │ │ │ │ -K * p_ │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:835 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_r_o_w_I_n_d_e_x │ │ │ │ │ -size_type rowIndex() const │ │ │ │ │ -index of this row in surrounding matrix │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:806 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -R dereference() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1062 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -DiagonalRowVector & operator=(const K &k) │ │ │ │ │ -Assignment operator for scalar. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:870 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const DiagonalMatrix &other) const │ │ │ │ │ -incomparison operator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -value_type field_type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -void advance(int n) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1084 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:891 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ -void mmv(const X &x, Y &y) const │ │ │ │ │ -y -= A x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:333 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -DiagonalMatrix & operator/=(const K &k) │ │ │ │ │ -vector space division by scalar │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:253 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const_row_type const_reference │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_i_d_e_n_t_i_c_a_l │ │ │ │ │ -bool identical(const DiagonalMatrix< K, n > &other) const │ │ │ │ │ -Check if matrix is the same object as the other matrix. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -friend auto operator*(const DiagonalMatrix &matrixA, const DiagonalMatrix< │ │ │ │ │ -OtherScalar, n > &matrixB) │ │ │ │ │ -Matrix-matrix multiplication. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:468 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_:_:_r_e_a_l_I_n_d_e_x │ │ │ │ │ -size_type realIndex(int i) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:671 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const K & operator[](size_type i) const │ │ │ │ │ -same for read only access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:741 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r │ │ │ │ │ -DiagonalRowVector() │ │ │ │ │ -Constructor making uninitialized vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -row_type reference │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_o_p_e_r_a_t_o_r_& │ │ │ │ │ -DiagonalRowVectorConst * operator&() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:829 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const DiagonalRowVectorConst &y) const │ │ │ │ │ -Binary vector comparison. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:786 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ -double frobenius_norm2() const │ │ │ │ │ -square of frobenius norm, need for block recursion │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:415 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -constexpr DiagonalMatrix()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ -void mtv(const X &x, Y &y) const │ │ │ │ │ -y = A^T x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > │ │ │ │ │ -ConstIterator │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:917 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_:_:_i_d_e_n_t_i_c_a_l │ │ │ │ │ -bool identical(const DiagonalMatrixWrapper &other) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:682 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:382 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1073 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -std::ptrdiff_t index() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1096 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -const FieldVector< K, n > & diagonal() const │ │ │ │ │ -Get const reference to diagonal vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:543 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ │ -void invert() │ │ │ │ │ -Compute inverse. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:445 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_& │ │ │ │ │ -DiagonalRowVector * operator&() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:935 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -const K & diagonal(size_type i) const │ │ │ │ │ -Get const reference to diagonal entry. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:531 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of blocks in the vector (are of size 1 here) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:794 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -DiagonalMatrix(std::initializer_list< K > const &l) │ │ │ │ │ -Construct diagonal matrix from an initializer list. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::Iterator ColIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -K field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:852 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Return reference object as row replacement. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:519 │ │ │ │ │ -_D_u_n_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e_<_ _D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_<_ _K_,_ _n_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -DiagonalRowVectorConst< K, n > type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:951 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:897 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -DiagonalMatrix(const FieldVector< K, n > &diag) │ │ │ │ │ -Constructor initializing the diagonal with a vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for the index access and size operation. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:858 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:369 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -double infinity_norm() const │ │ │ │ │ -infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -DiagonalMatrix & operator+=(const DiagonalMatrix &y) │ │ │ │ │ -vector space addition │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:218 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -K block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ -void umhv(const X &x, Y &y) const │ │ │ │ │ -y += A^H x │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:321 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:172 │ │ │ │ │ -_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_,_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(DenseMatrix &denseMatrix, DiagonalMatrix< field, N > const │ │ │ │ │ -&rhs) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1108 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator(const MyType &other) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1026 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -end ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:766 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for the index access and size operation. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:718 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -DiagonalMatrix & operator=(const K &k) │ │ │ │ │ -Assignment from a scalar. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t │ │ │ │ │ -DiagonalRowVectorConst() │ │ │ │ │ -Constructor making uninitialized vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:727 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_r_e_a_l_I_n_d_e_x │ │ │ │ │ -size_type realIndex(int i) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:819 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const DiagonalMatrix< K, n > │ │ │ │ │ -&a) │ │ │ │ │ -Sends the matrix to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:508 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -K value_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -K block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:715 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_d_e_t_e_r_m_i_n_a_n_t │ │ │ │ │ -K determinant() const │ │ │ │ │ -calculates the determinant of this matrix │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:453 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< K >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:564 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -ConstIterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:780 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r │ │ │ │ │ -DiagonalMatrixWrapper() │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:663 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > │ │ │ │ │ -ConstIterator │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const DiagonalMatrix &other) const │ │ │ │ │ -comparison operator │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___t_y_p_e │ │ │ │ │ -DiagonalRowVectorConst< K, n > const_row_type │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -DiagonalRowVector< K, n > row_type │ │ │ │ │ -Each row is implemented by a field vector. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const MyType &other) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1052 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_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 diagonalmatrix.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -K block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:855 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -const K & diagonal() const │ │ │ │ │ -the diagonal value │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:812 │ │ │ │ │ -_D_U_N_E___T_H_R_O_W │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ │ +_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_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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 │ │ │ │ │ -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_:_:_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_:_:_N │ │ │ │ │ -constexpr size_type N() const │ │ │ │ │ -number of rows │ │ │ │ │ -DDeeffiinniittiioonn densematrix.hh:697 │ │ │ │ │ -_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_V_e_c_t_o_r │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r │ │ │ │ │ -you have to specialize this structure for any type that should be assignable to │ │ │ │ │ -a DenseMatrix │ │ │ │ │ -DDeeffiinniittiioonn densematrix.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -Error thrown if operations of a FieldMatrix fail. │ │ │ │ │ -DDeeffiinniittiioonn densematrix.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r │ │ │ │ │ +Interface for a class of dense vectors over a given field. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_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_:_:_t_w_o___n_o_r_m_2 │ │ │ │ │ FieldTraits< value_type >::real_type two_norm2() const │ │ │ │ │ square of two norm (sum over squared values of entries), need for block │ │ │ │ │ recursion │ │ │ │ │ DDeeffiinniittiioonn densevector.hh:650 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator const_iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:381 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:344 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ +ConstIterator find(size_type i) const │ │ │ │ │ +return iterator to given element or end() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:390 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_f_r_o_n_t │ │ │ │ │ +value_type & front() │ │ │ │ │ +return reference to first element │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:306 │ │ │ │ │ _D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_t_w_o___n_o_r_m │ │ │ │ │ FieldTraits< value_type >::real_type two_norm() const │ │ │ │ │ two norm sqrt(sum over squared values of entries) │ │ │ │ │ DDeeffiinniittiioonn densevector.hh:641 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +ConstIterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const DenseVector< Other > &x) const │ │ │ │ │ +Binary vector comparison. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:555 │ │ │ │ │ _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_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +Iterator beforeBegin() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:367 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +DenseIterator< const DenseVector, const value_type > ConstIterator │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +Traits::derived_type derived_type │ │ │ │ │ +type of derived vector class │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:247 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_f_r_o_n_t │ │ │ │ │ +const value_type & front() const │ │ │ │ │ +return reference to first element │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:312 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ +derived_type operator+(const DenseVector< Other > &b) const │ │ │ │ │ +Binary vector addition. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:439 │ │ │ │ │ +_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_:_:_d_i_m │ │ │ │ │ +size_type dim() const │ │ │ │ │ +dimension of the vector space │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:733 │ │ │ │ │ _D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ FieldTraits< vt >::real_type infinity_norm() const │ │ │ │ │ infinity norm (maximum of absolute values of entries) │ │ │ │ │ DDeeffiinniittiioonn densevector.hh:661 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:397 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_a_x_p_y │ │ │ │ │ +derived_type & axpy(const field_type &a, const DenseVector< Other > &x) │ │ │ │ │ +vector space axpy operation ( *this += a x ) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:575 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +derived_type & operator=(const value_type &k) │ │ │ │ │ +Assignment operator for scalar. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_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 densevector.hh:262 │ │ │ │ │ +_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_e_n_s_e_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +DenseIterator< DenseVector, value_type > Iterator │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +derived_type & operator-=(const DenseVector< Other > &x) │ │ │ │ │ +vector space subtraction │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:429 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_D_e_n_s_e_V_e_c_t_o_r │ │ │ │ │ +DenseVector(const DenseVector &)=default │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +derived_type & operator+=(const DenseVector< Other > &x) │ │ │ │ │ +vector space addition │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:419 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +std::enable_if< std::is_convertible< FieldType, field_type >::value, │ │ │ │ │ +derived_type >::type & operator*=(const FieldType &kk) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:523 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const DenseVector< Other > &x) const │ │ │ │ │ +Binary vector incomparison. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:567 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_a_c_k │ │ │ │ │ +const value_type & back() const │ │ │ │ │ +return reference to last element │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +begin ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:384 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +PromotionTraits< field_type, typenameDenseVector< Other >::field_type >:: │ │ │ │ │ +PromotedType operator*(const DenseVector< Other > &x) const │ │ │ │ │ +indefinite vector dot product which corresponds to Petsc's VecTDot │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:591 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_D_e_n_s_e_V_e_c_t_o_r │ │ │ │ │ +constexpr DenseVector()=default │ │ │ │ │ _D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_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 densevector.hh:677 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r_C_o_n_s_t │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:698 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_R_o_w_V_e_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:841 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x_W_r_a_p_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:650 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sparse vector-like containers. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:998 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator(const MyConstType &other) │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1031 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_t_a_i_n_e_r_W_r_a_p_p_e_r_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const MyConstType &other) const │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:1057 │ │ │ │ │ -_D_u_n_e_:_:_D_i_a_g_o_n_a_l_M_a_t_r_i_x │ │ │ │ │ -A diagonal matrix of static size. │ │ │ │ │ -DDeeffiinniittiioonn diagonalmatrix.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +DenseVector & operator=(const DenseVector &)=default │ │ │ │ │ +Assignment operator for other DenseVector of same type. │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +Traits::value_type block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +value_type & operator[](size_type i) │ │ │ │ │ +random access │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< value_type >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:253 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_b_a_c_k │ │ │ │ │ +value_type & back() │ │ │ │ │ +return reference to last element │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:318 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ +derived_type operator-() const │ │ │ │ │ +Vector negation. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:454 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +std::enable_if< std::is_convertible< FieldType, field_type >::value, │ │ │ │ │ +derived_type >::type & operator/=(const FieldType &kk) │ │ │ │ │ +vector space division by scalar │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:545 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m___r_e_a_l │ │ │ │ │ +FieldTraits< value_type >::real_type one_norm_real() const │ │ │ │ │ +simplified one norm (uses Manhattan norm for complex values) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:632 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_d_o_t │ │ │ │ │ +PromotionTraits< field_type, typenameDenseVector< Other >::field_type >:: │ │ │ │ │ +PromotedType dot(const DenseVector< Other > &x) const │ │ │ │ │ +vector dot product which corresponds to Petsc's VecDot │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:609 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ +Iterator find(size_type i) │ │ │ │ │ +return iterator to given element or end() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:373 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m │ │ │ │ │ +FieldTraits< value_type >::real_type one_norm() const │ │ │ │ │ +one norm (sum over absolute values of entries) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:622 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of blocks in the vector (are of size 1 here) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:727 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_e_m_p_t_y │ │ │ │ │ +bool empty() const │ │ │ │ │ +checks whether the container is empty │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:330 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_V_e_c_t_o_r_<_ _V_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_V_e_c_t_o_r_<_ _V_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type │ │ │ │ │ +field_type │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:27 │ │ │ │ │ +_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_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +SizeType index() const │ │ │ │ │ +return index │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:213 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const MutableIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r │ │ │ │ │ +DenseIterator(const MutableIterator &other) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const ConstIterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ +R elementAt(DifferenceType i) const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C │ │ │ │ │ +>::type, const typename std::remove_const< T >::type > other) const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:200 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r │ │ │ │ │ +DenseIterator(const ConstIterator &other) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type, │ │ │ │ │ +typename std::remove_const< T >::type > other) const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r │ │ │ │ │ +DenseIterator(C &cont, SizeType pos) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_D_i_f_f_e_r_e_n_c_e_T_y_p_e │ │ │ │ │ +std::ptrdiff_t DifferenceType │ │ │ │ │ +The type of the difference between two positions. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +R dereference() const │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +void advance(DifferenceType n) │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r_:_:_S_i_z_e_T_y_p_e │ │ │ │ │ +C::size_type SizeType │ │ │ │ │ +The type to index the underlying container. │ │ │ │ │ +DDeeffiinniittiioonn densevector.hh:147 │ │ │ │ │ _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_:_:_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_:_:_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:275 │ │ │ │ │ +_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:435 │ │ │ │ │ +_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_:_:_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 │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: float_cmp.cc File Reference │ │ │ │ +dune-common: vc.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,121 +69,25 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
float_cmp.cc File Reference
│ │ │ │ +
vc.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include "float_cmp.hh"
│ │ │ │ -#include <vector>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::FloatCmp::EpsilonType< T >
 Mapping of value type to epsilon type. More...
 
struct  Dune::FloatCmp::EpsilonType< std::vector< T, A > >
 Specialization of EpsilonType for std::vector. More...
 
struct  Dune::FloatCmp::EpsilonType< FieldVector< T, n > >
 Specialization of EpsilonType for Dune::FieldVector. More...
 
struct  Dune::FloatCmp::DefaultEpsilon< T, relativeWeak >
 
struct  Dune::FloatCmp::DefaultEpsilon< T, relativeStrong >
 
struct  Dune::FloatCmp::DefaultEpsilon< T, absolute >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::FloatCmp
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

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 T >
bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
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>
Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 
template<class I , class T >
Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
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
 
template<class I , class T , CmpStyle cstyle>
Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 
template<class I , class T >
Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Compatibility header for including <Vc/Vc>

│ │ │ │ +

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,126 +1,15 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -float_cmp.cc File Reference │ │ │ │ │ -#include "_f_l_o_a_t___c_m_p_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ +vc.hh File Reference │ │ │ │ │ +Compatibility header for including _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_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  Mapping of value type to epsilon type. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ -  Specialization of _E_p_s_i_l_o_n_T_y_p_e for std::vector. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _n_ _>_ _> │ │ │ │ │ -  Specialization of _E_p_s_i_l_o_n_T_y_p_e for _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -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_,_ _r_e_l_a_t_i_v_e_W_e_a_k_ _> │ │ │ │ │ -  │ │ │ │ │ -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_,_ _r_e_l_a_t_i_v_e_S_t_r_o_n_g_ _> │ │ │ │ │ -  │ │ │ │ │ -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_,_ _a_b_s_o_l_u_t_e_ _> │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_l_o_a_t_C_m_p │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -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 │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ - value()) │ │ │ │ │ -  │ │ │ │ │ -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_:_:_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()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >::value()) │ │ │ │ │ -  │ │ │ │ │ -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 │ │ │ │ │ -  │ │ │ │ │ -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()) │ │ │ │ │ -  │ │ │ │ │ -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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >::value()) │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Compatibility header for including │ │ │ │ │ +Certain versions (1.3.2) of Vc (_h_t_t_p_s_:_/_/_g_i_t_h_u_b_._c_o_m_/_V_c_D_e_v_e_l_/_V_c) have a problem │ │ │ │ │ +with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: float_cmp.cc Source File │ │ │ │ +dune-common: vc.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,628 +74,38 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
float_cmp.cc
│ │ │ │ +
vc.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#include "float_cmp.hh"
│ │ │ │ -
6
│ │ │ │ -
7#include <vector>
│ │ │ │ -
8#include <limits>
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <cstdlib>
│ │ │ │ - │ │ │ │ -
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
│ │ │ │ -
16 namespace FloatCmp {
│ │ │ │ -
17 // traits
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ +
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +
3#ifndef DUNE_COMMON_VC_HH
│ │ │ │ +
4#define DUNE_COMMON_VC_HH
│ │ │ │ +
5
│ │ │ │ +
15#if HAVE_VC
│ │ │ │ +
16
│ │ │ │ +
17// include Vc's macro definitions
│ │ │ │ +
18#include <Vc/global.h>
│ │ │ │
19
│ │ │ │ -
│ │ │ │ -
23 template<class T> struct EpsilonType {
│ │ │ │ -
25 typedef T Type;
│ │ │ │ -
26 };
│ │ │ │ -
│ │ │ │ -
28
│ │ │ │ -
33 template<class T, typename A>
│ │ │ │ -
│ │ │ │ -
34 struct EpsilonType<std::vector<T, A> > {
│ │ │ │ -
36 typedef typename EpsilonType<T>::Type Type;
│ │ │ │ -
37 };
│ │ │ │ -
│ │ │ │ -
39
│ │ │ │ -
44 template<class T, int n>
│ │ │ │ -
│ │ │ │ -
45 struct EpsilonType<FieldVector<T, n> > {
│ │ │ │ -
47 typedef typename EpsilonType<T>::Type Type;
│ │ │ │ -
48 };
│ │ │ │ -
│ │ │ │ -
49
│ │ │ │ -
50 // default epsilon
│ │ │ │ -
51 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
53 static typename EpsilonType<T>::Type value()
│ │ │ │ -
54 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
│ │ │ │ -
│ │ │ │ -
55 };
│ │ │ │ -
│ │ │ │ -
56 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
58 static typename EpsilonType<T>::Type value()
│ │ │ │ -
59 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
│ │ │ │ -
│ │ │ │ -
60 };
│ │ │ │ -
│ │ │ │ -
61 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
63 static typename EpsilonType<T>::Type value()
│ │ │ │ -
64 { return std::max(std::numeric_limits<typename EpsilonType<T>::Type>::epsilon(), 1e-6); }
│ │ │ │ -
│ │ │ │ -
65 };
│ │ │ │ -
│ │ │ │ -
66
│ │ │ │ -
67 namespace Impl {
│ │ │ │ -
68 // basic comparison
│ │ │ │ -
69 template<class T, CmpStyle style = defaultCmpStyle>
│ │ │ │ -
70 struct eq_t;
│ │ │ │ -
71 template<class T>
│ │ │ │ -
72 struct eq_t<T, relativeWeak> {
│ │ │ │ -
73 static bool eq(const T &first,
│ │ │ │ -
74 const T &second,
│ │ │ │ - │ │ │ │ -
76 {
│ │ │ │ -
77 using std::abs;
│ │ │ │ -
78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second));
│ │ │ │ -
79 }
│ │ │ │ -
80 };
│ │ │ │ -
81 template<class T>
│ │ │ │ -
82 struct eq_t<T, relativeStrong> {
│ │ │ │ -
83 static bool eq(const T &first,
│ │ │ │ -
84 const T &second,
│ │ │ │ - │ │ │ │ -
86 {
│ │ │ │ -
87 using std::abs;
│ │ │ │ -
88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second));
│ │ │ │ -
89 }
│ │ │ │ -
90 };
│ │ │ │ -
91 template<class T>
│ │ │ │ -
92 struct eq_t<T, absolute> {
│ │ │ │ -
93 static bool eq(const T &first,
│ │ │ │ -
94 const T &second,
│ │ │ │ - │ │ │ │ -
96 {
│ │ │ │ -
97 using std::abs;
│ │ │ │ -
98 return abs(first-second) <= epsilon;
│ │ │ │ -
99 }
│ │ │ │ -
100 };
│ │ │ │ -
101 template<class T, CmpStyle cstyle>
│ │ │ │ -
102 struct eq_t_std_vec {
│ │ │ │ -
103 typedef std::vector<T> V;
│ │ │ │ -
104 static bool eq(const V &first,
│ │ │ │ -
105 const V &second,
│ │ │ │ -
106 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
│ │ │ │ -
107 auto size = first.size();
│ │ │ │ -
108 if(size != second.size()) return false;
│ │ │ │ -
109 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ -
110 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
│ │ │ │ -
111 return false;
│ │ │ │ -
112 return true;
│ │ │ │ -
113 }
│ │ │ │ -
114 };
│ │ │ │ -
115 template< class T>
│ │ │ │ -
116 struct eq_t<std::vector<T>, relativeWeak> : eq_t_std_vec<T, relativeWeak> {};
│ │ │ │ -
117 template< class T>
│ │ │ │ -
118 struct eq_t<std::vector<T>, relativeStrong> : eq_t_std_vec<T, relativeStrong> {};
│ │ │ │ -
119 template< class T>
│ │ │ │ -
120 struct eq_t<std::vector<T>, absolute> : eq_t_std_vec<T, absolute> {};
│ │ │ │ -
121
│ │ │ │ -
122 template<class T, int n, CmpStyle cstyle>
│ │ │ │ -
123 struct eq_t_fvec {
│ │ │ │ -
124 typedef Dune::FieldVector<T, n> V;
│ │ │ │ -
125 static bool eq(const V &first,
│ │ │ │ -
126 const V &second,
│ │ │ │ -
127 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
│ │ │ │ -
128 for(int i = 0; i < n; ++i)
│ │ │ │ -
129 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
│ │ │ │ -
130 return false;
│ │ │ │ -
131 return true;
│ │ │ │ -
132 }
│ │ │ │ -
133 };
│ │ │ │ -
134 template< class T, int n >
│ │ │ │ -
135 struct eq_t< Dune::FieldVector<T, n>, relativeWeak> : eq_t_fvec<T, n, relativeWeak> {};
│ │ │ │ -
136 template< class T, int n >
│ │ │ │ -
137 struct eq_t< Dune::FieldVector<T, n>, relativeStrong> : eq_t_fvec<T, n, relativeStrong> {};
│ │ │ │ -
138 template< class T, int n >
│ │ │ │ -
139 struct eq_t< Dune::FieldVector<T, n>, absolute> : eq_t_fvec<T, n, absolute> {};
│ │ │ │ -
140 } // namespace Impl
│ │ │ │ -
141
│ │ │ │ -
142 // operations in functional style
│ │ │ │ -
143 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
144 bool eq(const T &first,
│ │ │ │ -
145 const T &second,
│ │ │ │ -
146 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
147 {
│ │ │ │ -
148 return Impl::eq_t<T, style>::eq(first, second, epsilon);
│ │ │ │ -
149 }
│ │ │ │ -
│ │ │ │ -
150 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
151 bool ne(const T &first,
│ │ │ │ -
152 const T &second,
│ │ │ │ -
153 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
154 {
│ │ │ │ -
155 return !eq<T, style>(first, second, epsilon);
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ -
157 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
158 bool gt(const T &first,
│ │ │ │ -
159 const T &second,
│ │ │ │ -
160 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
161 {
│ │ │ │ -
162 return first > second && ne<T, style>(first, second, epsilon);
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
164 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
165 bool lt(const T &first,
│ │ │ │ -
166 const T &second,
│ │ │ │ -
167 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
168 {
│ │ │ │ -
169 return first < second && ne<T, style>(first, second, epsilon);
│ │ │ │ -
170 }
│ │ │ │ -
│ │ │ │ -
171 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
172 bool ge(const T &first,
│ │ │ │ -
173 const T &second,
│ │ │ │ -
174 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
175 {
│ │ │ │ -
176 return first > second || eq<T, style>(first, second, epsilon);
│ │ │ │ -
177 }
│ │ │ │ -
│ │ │ │ -
178 template <class T, CmpStyle style>
│ │ │ │ -
│ │ │ │ -
179 bool le(const T &first,
│ │ │ │ -
180 const T &second,
│ │ │ │ -
181 typename EpsilonType<T>::Type epsilon)
│ │ │ │ -
182 {
│ │ │ │ -
183 return first < second || eq<T, style>(first, second, epsilon);
│ │ │ │ -
184 }
│ │ │ │ -
│ │ │ │ -
185
│ │ │ │ -
186 // default template arguments
│ │ │ │ -
187 template <class T>
│ │ │ │ -
│ │ │ │ -
188 bool eq(const T &first,
│ │ │ │ -
189 const T &second,
│ │ │ │ - │ │ │ │ -
191 {
│ │ │ │ -
192 return eq<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194 template <class T>
│ │ │ │ -
│ │ │ │ -
195 bool ne(const T &first,
│ │ │ │ -
196 const T &second,
│ │ │ │ - │ │ │ │ -
198 {
│ │ │ │ -
199 return ne<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
200 }
│ │ │ │ -
│ │ │ │ -
201 template <class T>
│ │ │ │ -
│ │ │ │ -
202 bool gt(const T &first,
│ │ │ │ -
203 const T &second,
│ │ │ │ - │ │ │ │ -
205 {
│ │ │ │ -
206 return gt<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208 template <class T>
│ │ │ │ -
│ │ │ │ -
209 bool lt(const T &first,
│ │ │ │ -
210 const T &second,
│ │ │ │ - │ │ │ │ -
212 {
│ │ │ │ -
213 return lt<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215 template <class T>
│ │ │ │ -
│ │ │ │ -
216 bool ge(const T &first,
│ │ │ │ -
217 const T &second,
│ │ │ │ - │ │ │ │ -
219 {
│ │ │ │ -
220 return ge<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
221 }
│ │ │ │ -
│ │ │ │ -
222 template <class T>
│ │ │ │ -
│ │ │ │ -
223 bool le(const T &first,
│ │ │ │ -
224 const T &second,
│ │ │ │ - │ │ │ │ -
226 {
│ │ │ │ -
227 return le<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ -
228 }
│ │ │ │ -
│ │ │ │ -
229
│ │ │ │ -
230 // rounding operations
│ │ │ │ -
231 namespace Impl {
│ │ │ │ -
232 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
│ │ │ │ -
233 struct round_t;
│ │ │ │ -
234 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
235 struct round_t<I, T, cstyle, downward> {
│ │ │ │ -
236 static I
│ │ │ │ -
237 round(const T &val,
│ │ │ │ - │ │ │ │ -
239 // first get an approximation
│ │ │ │ -
240 I lower = I(val);
│ │ │ │ -
241 I upper;
│ │ │ │ -
242 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
│ │ │ │ -
243 if(T(lower) > val) { upper = lower; lower--; }
│ │ │ │ -
244 else upper = lower+1;
│ │ │ │ -
245 if(le<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
│ │ │ │ -
246 return lower;
│ │ │ │ -
247 else return upper;
│ │ │ │ -
248 }
│ │ │ │ -
249 };
│ │ │ │ -
250 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
251 struct round_t<I, T, cstyle, upward> {
│ │ │ │ -
252 static I
│ │ │ │ -
253 round(const T &val,
│ │ │ │ - │ │ │ │ -
255 // first get an approximation
│ │ │ │ -
256 I lower = I(val);
│ │ │ │ -
257 I upper;
│ │ │ │ -
258 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
│ │ │ │ -
259 if(T(lower) > val) { upper = lower; lower--; }
│ │ │ │ -
260 else upper = lower+1;
│ │ │ │ -
261 if(lt<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
│ │ │ │ -
262 return lower;
│ │ │ │ -
263 else return upper;
│ │ │ │ -
264 }
│ │ │ │ -
265 };
│ │ │ │ -
266 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
267 struct round_t<I, T, cstyle, towardZero> {
│ │ │ │ -
268 static I
│ │ │ │ -
269 round(const T &val,
│ │ │ │ - │ │ │ │ -
271 if(val > T(0))
│ │ │ │ -
272 return round_t<I, T, cstyle, downward>::round(val, epsilon);
│ │ │ │ -
273 else return round_t<I, T, cstyle, upward>::round(val, epsilon);
│ │ │ │ -
274 }
│ │ │ │ -
275 };
│ │ │ │ -
276 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
277 struct round_t<I, T, cstyle, towardInf> {
│ │ │ │ -
278 static I
│ │ │ │ -
279 round(const T &val,
│ │ │ │ - │ │ │ │ -
281 if(val > T(0))
│ │ │ │ -
282 return round_t<I, T, cstyle, upward>::round(val, epsilon);
│ │ │ │ -
283 else return round_t<I, T, cstyle, downward>::round(val, epsilon);
│ │ │ │ -
284 }
│ │ │ │ -
285 };
│ │ │ │ -
286 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
287 struct round_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
│ │ │ │ -
288 static std::vector<I>
│ │ │ │ -
289 round(const T &val,
│ │ │ │ - │ │ │ │ -
291 unsigned int size = val.size();
│ │ │ │ -
292 std::vector<I> res(size);
│ │ │ │ -
293 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ -
294 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
│ │ │ │ -
295 return res;
│ │ │ │ -
296 }
│ │ │ │ -
297 };
│ │ │ │ -
298 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
299 struct round_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
│ │ │ │ - │ │ │ │ -
301 round(const T &val,
│ │ │ │ - │ │ │ │ - │ │ │ │ -
304 for(int i = 0; i < n; ++i)
│ │ │ │ -
305 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
│ │ │ │ -
306 return res;
│ │ │ │ -
307 }
│ │ │ │ -
308 };
│ │ │ │ -
309 } // end namespace Impl
│ │ │ │ -
310 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
│ │ │ │ -
311 I round(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
│ │ │ │ -
312 {
│ │ │ │ -
313 return Impl::round_t<I, T, cstyle, rstyle>::round(val, epsilon);
│ │ │ │ -
314 }
│ │ │ │ -
│ │ │ │ -
315 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
│ │ │ │ -
316 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
│ │ │ │ -
317 {
│ │ │ │ -
318 return round<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320 template<class I, class T, RoundingStyle rstyle>
│ │ │ │ -
321 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
│ │ │ │ -
322 {
│ │ │ │ -
323 return round<I, T, defaultCmpStyle, rstyle>(val, epsilon);
│ │ │ │ -
324 }
│ │ │ │ -
325 template<class I, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
327 {
│ │ │ │ -
328 return round<I, T, defaultCmpStyle>(val, epsilon);
│ │ │ │ -
329 }
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
331 // truncation
│ │ │ │ -
332 namespace Impl {
│ │ │ │ -
333 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
│ │ │ │ -
334 struct trunc_t;
│ │ │ │ -
335 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
336 struct trunc_t<I, T, cstyle, downward> {
│ │ │ │ -
337 static I
│ │ │ │ -
338 trunc(const T &val,
│ │ │ │ - │ │ │ │ -
340 // this should be optimized away unless needed
│ │ │ │ -
341 if(!std::numeric_limits<I>::is_signed)
│ │ │ │ -
342 // make sure this works for all useful cases even if I is an unsigned type
│ │ │ │ -
343 if(eq<T, cstyle>(val, T(0), epsilon)) return I(0);
│ │ │ │ -
344 // first get an approximation
│ │ │ │ -
345 I lower = I(val); // now |val-lower| < 1
│ │ │ │ -
346 // make sure we're really lower in case the cast truncated to an unexpected direction
│ │ │ │ -
347 if(T(lower) > val) lower--; // now val-lower < 1
│ │ │ │ -
348 // check whether lower + 1 is approximately val
│ │ │ │ -
349 if(eq<T, cstyle>(T(lower+1), val, epsilon))
│ │ │ │ -
350 return lower+1;
│ │ │ │ -
351 else return lower;
│ │ │ │ -
352 }
│ │ │ │ -
353 };
│ │ │ │ -
354 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
355 struct trunc_t<I, T, cstyle, upward> {
│ │ │ │ -
356 static I
│ │ │ │ -
357 trunc(const T &val,
│ │ │ │ - │ │ │ │ -
359 I upper = trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ -
360 if(ne<T, cstyle>(T(upper), val, epsilon)) ++upper;
│ │ │ │ -
361 return upper;
│ │ │ │ -
362 }
│ │ │ │ -
363 };
│ │ │ │ -
364 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
365 struct trunc_t<I, T, cstyle, towardZero> {
│ │ │ │ -
366 static I
│ │ │ │ -
367 trunc(const T &val,
│ │ │ │ - │ │ │ │ -
369 if(val > T(0)) return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ -
370 else return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
│ │ │ │ -
371 }
│ │ │ │ -
372 };
│ │ │ │ -
373 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
374 struct trunc_t<I, T, cstyle, towardInf> {
│ │ │ │ -
375 static I
│ │ │ │ -
376 trunc(const T &val,
│ │ │ │ - │ │ │ │ -
378 if(val > T(0)) return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
│ │ │ │ -
379 else return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ -
380 }
│ │ │ │ -
381 };
│ │ │ │ -
382 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
383 struct trunc_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
│ │ │ │ -
384 static std::vector<I>
│ │ │ │ -
385 trunc(const std::vector<T> &val,
│ │ │ │ - │ │ │ │ -
387 unsigned int size = val.size();
│ │ │ │ -
388 std::vector<I> res(size);
│ │ │ │ -
389 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ -
390 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
│ │ │ │ -
391 return res;
│ │ │ │ -
392 }
│ │ │ │ -
393 };
│ │ │ │ -
394 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
395 struct trunc_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
400 for(int i = 0; i < n; ++i)
│ │ │ │ -
401 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
│ │ │ │ -
402 return res;
│ │ │ │ -
403 }
│ │ │ │ -
404 };
│ │ │ │ -
405 } // namespace Impl
│ │ │ │ -
406 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ -
│ │ │ │ -
407 I trunc(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
│ │ │ │ -
408 {
│ │ │ │ -
409 return Impl::trunc_t<I, T, cstyle, rstyle>::trunc(val, epsilon);
│ │ │ │ -
410 }
│ │ │ │ -
│ │ │ │ -
411 template<class I, class T, CmpStyle cstyle>
│ │ │ │ -
│ │ │ │ -
412 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
│ │ │ │ -
413 {
│ │ │ │ -
414 return trunc<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
│ │ │ │ -
415 }
│ │ │ │ -
│ │ │ │ -
416 template<class I, class T, RoundingStyle rstyle>
│ │ │ │ -
417 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
│ │ │ │ -
418 {
│ │ │ │ -
419 return trunc<I, T, defaultCmpStyle, rstyle>(val, epsilon);
│ │ │ │ -
420 }
│ │ │ │ -
421 template<class I, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
423 {
│ │ │ │ -
424 return trunc<I, T, defaultCmpStyle>(val, epsilon);
│ │ │ │ -
425 }
│ │ │ │ -
│ │ │ │ -
426 } //namespace Dune
│ │ │ │ -
│ │ │ │ -
427
│ │ │ │ -
428 // oo interface
│ │ │ │ -
429 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
431 FloatCmpOps(EpsilonType epsilon) : epsilon_(epsilon) {}
│ │ │ │ -
│ │ │ │ -
432
│ │ │ │ -
433
│ │ │ │ -
434 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
437 {
│ │ │ │ -
438 return epsilon_;
│ │ │ │ -
439 }
│ │ │ │ -
│ │ │ │ -
440
│ │ │ │ -
441 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
442 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
444 {
│ │ │ │ -
445 epsilon_ = epsilon__;
│ │ │ │ -
446 }
│ │ │ │ -
│ │ │ │ -
447
│ │ │ │ -
448
│ │ │ │ -
449 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
451 eq(const ValueType &first, const ValueType &second) const
│ │ │ │ -
452 {
│ │ │ │ -
453 return Dune::FloatCmp::eq<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
454 }
│ │ │ │ -
│ │ │ │ -
455
│ │ │ │ -
456 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
458 ne(const ValueType &first, const ValueType &second) const
│ │ │ │ -
459 {
│ │ │ │ -
460 return Dune::FloatCmp::ne<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
461 }
│ │ │ │ -
│ │ │ │ -
462
│ │ │ │ -
463 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
465 gt(const ValueType &first, const ValueType &second) const
│ │ │ │ -
466 {
│ │ │ │ -
467 return Dune::FloatCmp::gt<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
468 }
│ │ │ │ -
│ │ │ │ -
469
│ │ │ │ -
470 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
472 lt(const ValueType &first, const ValueType &second) const
│ │ │ │ -
473 {
│ │ │ │ -
474 return Dune::FloatCmp::lt<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
475 }
│ │ │ │ -
│ │ │ │ -
476
│ │ │ │ -
477 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
479 ge(const ValueType &first, const ValueType &second) const
│ │ │ │ -
480 {
│ │ │ │ -
481 return Dune::FloatCmp::ge<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
482 }
│ │ │ │ -
│ │ │ │ -
483
│ │ │ │ -
484 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
486 le(const ValueType &first, const ValueType &second) const
│ │ │ │ -
487 {
│ │ │ │ -
488 return Dune::FloatCmp::le<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ -
489 }
│ │ │ │ -
│ │ │ │ -
490
│ │ │ │ -
491
│ │ │ │ -
492 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
493 template<class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
495 round(const ValueType &val) const
│ │ │ │ -
496 {
│ │ │ │ -
497 return Dune::FloatCmp::round<I, ValueType, cstyle, rstyle_>(val, epsilon_);
│ │ │ │ -
498 }
│ │ │ │ -
│ │ │ │ -
499
│ │ │ │ -
500 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ -
501 template<class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
503 trunc(const ValueType &val) const
│ │ │ │ -
504 {
│ │ │ │ -
505 return Dune::FloatCmp::trunc<I, ValueType, cstyle, rstyle_>(val, epsilon_);
│ │ │ │ -
506 }
│ │ │ │ -
│ │ │ │ -
507
│ │ │ │ -
508} //namespace Dune
│ │ │ │ -
Various ways to compare floating-point numbers.
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ -
bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for inequality using epsilon
Definition float_cmp.cc:151
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ -
@ 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
│ │ │ │ -
STL namespace.
│ │ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
│ │ │ │ -
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ -
Mapping of value type to epsilon type.
Definition float_cmp.cc:23
│ │ │ │ -
T Type
The epsilon type corresponding to value type T.
Definition float_cmp.cc:25
│ │ │ │ -
EpsilonType< T >::Type Type
The epsilon type corresponding to value type std::vector<T, A>
Definition float_cmp.cc:36
│ │ │ │ -
EpsilonType< T >::Type Type
The epsilon type corresponding to value type Dune::FieldVector<T, n>
Definition float_cmp.cc:47
│ │ │ │ -
static EpsilonType< T >::Type value()
Definition float_cmp.cc:53
│ │ │ │ -
static EpsilonType< T >::Type value()
Definition float_cmp.cc:58
│ │ │ │ -
static EpsilonType< T >::Type value()
Definition float_cmp.cc:63
│ │ │ │ -
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.
│ │ │ │ -
bool le(const ValueType &first, const ValueType &second) const
test if first lesser or equal second
Definition float_cmp.cc:486
│ │ │ │ -
FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value())
construct an operations object
Definition float_cmp.cc:431
│ │ │ │ -
bool eq(const ValueType &first, const ValueType &second) const
test for equality using epsilon
Definition float_cmp.cc:451
│ │ │ │ -
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
│ │ │ │ -
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
│ │ │ │ +
20// undefine the macro that signals C++17 support, if set
│ │ │ │ +
21#ifdef Vc_CXX17
│ │ │ │ +
22#undef Vc_CXX17
│ │ │ │ +
23#endif
│ │ │ │ +
24
│ │ │ │ +
25// include the rest of Vc
│ │ │ │ +
26#include <Vc/Vc>
│ │ │ │ +
27
│ │ │ │ +
28#endif // HAVE_VC
│ │ │ │ +
29
│ │ │ │ +
30#endif // DUNE_COMMON_VC_HH
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,712 +1,32 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -float_cmp.cc │ │ │ │ │ +vc.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ +1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ -4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#include "_f_l_o_a_t___c_m_p_._h_h" │ │ │ │ │ -6 │ │ │ │ │ -7#include │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14 │ │ │ │ │ -15 │ │ │ │ │ -_1_6 namespace FloatCmp { │ │ │ │ │ -17 // traits │ │ │ │ │ +2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +3#ifndef DUNE_COMMON_VC_HH │ │ │ │ │ +4#define DUNE_COMMON_VC_HH │ │ │ │ │ +5 │ │ │ │ │ +15#if HAVE_VC │ │ │ │ │ +16 │ │ │ │ │ +17// include Vc's macro definitions │ │ │ │ │ +18#include │ │ │ │ │ 19 │ │ │ │ │ -_2_3 template struct _E_p_s_i_l_o_n_T_y_p_e { │ │ │ │ │ -_2_5 typedef T _T_y_p_e; │ │ │ │ │ -26 }; │ │ │ │ │ -28 │ │ │ │ │ -33 template │ │ │ │ │ -_3_4 struct _E_p_s_i_l_o_n_T_y_p_e<_s_t_d::vector > { │ │ │ │ │ -_3_6 typedef typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _T_y_p_e; │ │ │ │ │ -37 }; │ │ │ │ │ -39 │ │ │ │ │ -44 template │ │ │ │ │ -_4_5 struct _E_p_s_i_l_o_n_T_y_p_e<_F_i_e_l_d_V_e_c_t_o_r > { │ │ │ │ │ -_4_7 typedef typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _T_y_p_e; │ │ │ │ │ -48 }; │ │ │ │ │ -49 │ │ │ │ │ -50 // default epsilon │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ -_5_3 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ -54 { return std::numeric_limits::Type>::epsilon()*8.; } │ │ │ │ │ -55 }; │ │ │ │ │ -56 template │ │ │ │ │ -_5_7 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ -_5_8 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ -59 { return std::numeric_limits::Type>::epsilon()*8.; } │ │ │ │ │ -60 }; │ │ │ │ │ -61 template │ │ │ │ │ -_6_2 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ -_6_3 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ -64 { return std::max(std::numeric_limits_:_:_T_y_p_e>:: │ │ │ │ │ -epsilon(), 1e-6); } │ │ │ │ │ -65 }; │ │ │ │ │ -66 │ │ │ │ │ -67 namespace Impl { │ │ │ │ │ -68 // basic comparison │ │ │ │ │ -69 template │ │ │ │ │ -70 struct eq_t; │ │ │ │ │ -71 template │ │ │ │ │ -72 struct eq_t { │ │ │ │ │ -73 static bool _e_q(const T &first, │ │ │ │ │ -74 const T &second, │ │ │ │ │ -75 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ -76 { │ │ │ │ │ -77 using std::abs; │ │ │ │ │ -78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second)); │ │ │ │ │ -79 } │ │ │ │ │ -80 }; │ │ │ │ │ -81 template │ │ │ │ │ -82 struct eq_t { │ │ │ │ │ -83 static bool _e_q(const T &first, │ │ │ │ │ -84 const T &second, │ │ │ │ │ -85 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ -86 { │ │ │ │ │ -87 using std::abs; │ │ │ │ │ -88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second)); │ │ │ │ │ -89 } │ │ │ │ │ -90 }; │ │ │ │ │ -91 template │ │ │ │ │ -92 struct eq_t { │ │ │ │ │ -93 static bool _e_q(const T &first, │ │ │ │ │ -94 const T &second, │ │ │ │ │ -95 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ -96 { │ │ │ │ │ -97 using std::abs; │ │ │ │ │ -98 return abs(first-second) <= epsilon; │ │ │ │ │ -99 } │ │ │ │ │ -100 }; │ │ │ │ │ -101 template │ │ │ │ │ -102 struct eq_t_std_vec { │ │ │ │ │ -103 typedef std::vector V; │ │ │ │ │ -104 static bool _e_q(const V &first, │ │ │ │ │ -105 const V &second, │ │ │ │ │ -106 typename _E_p_s_i_l_o_n_T_y_p_e_<_V_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_V_>_:_:_v_a_l_u_e()) { │ │ │ │ │ -107 auto _s_i_z_e = first.size(); │ │ │ │ │ -108 if(_s_i_z_e != second.size()) return false; │ │ │ │ │ -109 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ -110 if(!eq_t::eq(first[i], second[i], epsilon)) │ │ │ │ │ -111 return false; │ │ │ │ │ -112 return true; │ │ │ │ │ -113 } │ │ │ │ │ -114 }; │ │ │ │ │ -115 template< class T> │ │ │ │ │ -116 struct eq_t<_s_t_d::vector, _r_e_l_a_t_i_v_e_W_e_a_k> : eq_t_std_vec │ │ │ │ │ -{}; │ │ │ │ │ -117 template< class T> │ │ │ │ │ -118 struct eq_t<_s_t_d::vector, _r_e_l_a_t_i_v_e_S_t_r_o_n_g> : eq_t_std_vec {}; │ │ │ │ │ -119 template< class T> │ │ │ │ │ -120 struct eq_t<_s_t_d::vector, _a_b_s_o_l_u_t_e> : eq_t_std_vec {}; │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -123 struct eq_t_fvec { │ │ │ │ │ -124 typedef _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _n_> V; │ │ │ │ │ -125 static bool _e_q(const V &first, │ │ │ │ │ -126 const V &second, │ │ │ │ │ -127 typename _E_p_s_i_l_o_n_T_y_p_e_<_V_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_V_>_:_:_v_a_l_u_e()) { │ │ │ │ │ -128 for(int i = 0; i < n; ++i) │ │ │ │ │ -129 if(!eq_t::eq(first[i], second[i], epsilon)) │ │ │ │ │ -130 return false; │ │ │ │ │ -131 return true; │ │ │ │ │ -132 } │ │ │ │ │ -133 }; │ │ │ │ │ -134 template< class T, int n > │ │ │ │ │ -135 struct eq_t< _D_u_n_e::FieldVector, _r_e_l_a_t_i_v_e_W_e_a_k> : eq_t_fvec {}; │ │ │ │ │ -136 template< class T, int n > │ │ │ │ │ -137 struct eq_t< _D_u_n_e::FieldVector, _r_e_l_a_t_i_v_e_S_t_r_o_n_g> : eq_t_fvec {}; │ │ │ │ │ -138 template< class T, int n > │ │ │ │ │ -139 struct eq_t< _D_u_n_e::FieldVector, _a_b_s_o_l_u_t_e> : eq_t_fvec │ │ │ │ │ -{}; │ │ │ │ │ -140 } // namespace Impl │ │ │ │ │ -141 │ │ │ │ │ -142 // operations in functional style │ │ │ │ │ -143 template │ │ │ │ │ -_1_4_4 bool _e_q(const T &first, │ │ │ │ │ -145 const T &second, │ │ │ │ │ -146 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -147 { │ │ │ │ │ -148 return Impl::eq_t::eq(first, second, epsilon); │ │ │ │ │ -149 } │ │ │ │ │ -150 template │ │ │ │ │ -_1_5_1 bool _n_e(const T &first, │ │ │ │ │ -152 const T &second, │ │ │ │ │ -153 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -154 { │ │ │ │ │ -155 return !eq(first, second, epsilon); │ │ │ │ │ -156 } │ │ │ │ │ -157 template │ │ │ │ │ -_1_5_8 bool _g_t(const T &first, │ │ │ │ │ -159 const T &second, │ │ │ │ │ -160 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -161 { │ │ │ │ │ -162 return first > second && ne(first, second, epsilon); │ │ │ │ │ -163 } │ │ │ │ │ -164 template │ │ │ │ │ -_1_6_5 bool _l_t(const T &first, │ │ │ │ │ -166 const T &second, │ │ │ │ │ -167 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -168 { │ │ │ │ │ -169 return first < second && ne(first, second, epsilon); │ │ │ │ │ -170 } │ │ │ │ │ -171 template │ │ │ │ │ -_1_7_2 bool _g_e(const T &first, │ │ │ │ │ -173 const T &second, │ │ │ │ │ -174 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -175 { │ │ │ │ │ -176 return first > second || eq(first, second, epsilon); │ │ │ │ │ -177 } │ │ │ │ │ -178 template │ │ │ │ │ -_1_7_9 bool _l_e(const T &first, │ │ │ │ │ -180 const T &second, │ │ │ │ │ -181 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ -182 { │ │ │ │ │ -183 return first < second || eq(first, second, epsilon); │ │ │ │ │ -184 } │ │ │ │ │ -185 │ │ │ │ │ -186 // default template arguments │ │ │ │ │ -187 template │ │ │ │ │ -_1_8_8 bool _e_q(const T &first, │ │ │ │ │ -189 const T &second, │ │ │ │ │ -190 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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -191 { │ │ │ │ │ -192 return eq(first, second, epsilon); │ │ │ │ │ -193 } │ │ │ │ │ -194 template │ │ │ │ │ -_1_9_5 bool _n_e(const T &first, │ │ │ │ │ -196 const T &second, │ │ │ │ │ -197 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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -198 { │ │ │ │ │ -199 return ne(first, second, epsilon); │ │ │ │ │ -200 } │ │ │ │ │ -201 template │ │ │ │ │ -_2_0_2 bool _g_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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -205 { │ │ │ │ │ -206 return gt(first, second, epsilon); │ │ │ │ │ -207 } │ │ │ │ │ -208 template │ │ │ │ │ -_2_0_9 bool _l_t(const T &first, │ │ │ │ │ -210 const T &second, │ │ │ │ │ -211 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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -212 { │ │ │ │ │ -213 return lt(first, second, epsilon); │ │ │ │ │ -214 } │ │ │ │ │ -215 template │ │ │ │ │ -_2_1_6 bool _g_e(const T &first, │ │ │ │ │ -217 const T &second, │ │ │ │ │ -218 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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -219 { │ │ │ │ │ -220 return ge(first, second, epsilon); │ │ │ │ │ -221 } │ │ │ │ │ -222 template │ │ │ │ │ -_2_2_3 bool _l_e(const T &first, │ │ │ │ │ -224 const T &second, │ │ │ │ │ -225 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_, │ │ │ │ │ -_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -226 { │ │ │ │ │ -227 return le(first, second, epsilon); │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -230 // rounding operations │ │ │ │ │ -231 namespace Impl { │ │ │ │ │ -232 template │ │ │ │ │ -233 struct round_t; │ │ │ │ │ -234 template │ │ │ │ │ -235 struct round_t { │ │ │ │ │ -236 static I │ │ │ │ │ -237 _r_o_u_n_d(const T &val, │ │ │ │ │ -238 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 │ │ │ │ │ -())) { │ │ │ │ │ -239 // first get an approximation │ │ │ │ │ -240 I lower = I(val); │ │ │ │ │ -241 I upper; │ │ │ │ │ -242 if(eq(T(lower), val, epsilon)) return lower; │ │ │ │ │ -243 if(T(lower) > val) { upper = lower; lower--; } │ │ │ │ │ -244 else upper = lower+1; │ │ │ │ │ -245 if(le(val - T(lower), T(upper) - val, epsilon)) │ │ │ │ │ -246 return lower; │ │ │ │ │ -247 else return upper; │ │ │ │ │ -248 } │ │ │ │ │ -249 }; │ │ │ │ │ -250 template │ │ │ │ │ -251 struct round_t { │ │ │ │ │ -252 static I │ │ │ │ │ -253 _r_o_u_n_d(const T &val, │ │ │ │ │ -254 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 // first get an approximation │ │ │ │ │ -256 I lower = I(val); │ │ │ │ │ -257 I upper; │ │ │ │ │ -258 if(eq(T(lower), val, epsilon)) return lower; │ │ │ │ │ -259 if(T(lower) > val) { upper = lower; lower--; } │ │ │ │ │ -260 else upper = lower+1; │ │ │ │ │ -261 if(lt(val - T(lower), T(upper) - val, epsilon)) │ │ │ │ │ -262 return lower; │ │ │ │ │ -263 else return upper; │ │ │ │ │ -264 } │ │ │ │ │ -265 }; │ │ │ │ │ -266 template │ │ │ │ │ -267 struct round_t { │ │ │ │ │ -268 static I │ │ │ │ │ -269 _r_o_u_n_d(const T &val, │ │ │ │ │ -270 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 │ │ │ │ │ -())) { │ │ │ │ │ -271 if(val > T(0)) │ │ │ │ │ -272 return round_t::round(val, epsilon); │ │ │ │ │ -273 else return round_t::round(val, epsilon); │ │ │ │ │ -274 } │ │ │ │ │ -275 }; │ │ │ │ │ -276 template │ │ │ │ │ -277 struct round_t { │ │ │ │ │ -278 static I │ │ │ │ │ -279 _r_o_u_n_d(const T &val, │ │ │ │ │ -280 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 │ │ │ │ │ -())) { │ │ │ │ │ -281 if(val > T(0)) │ │ │ │ │ -282 return round_t::round(val, epsilon); │ │ │ │ │ -283 else return round_t::round(val, epsilon); │ │ │ │ │ -284 } │ │ │ │ │ -285 }; │ │ │ │ │ -286 template │ │ │ │ │ -287 struct round_t<_s_t_d::vector, std::vector, cstyle, rstyle> { │ │ │ │ │ -288 static std::vector │ │ │ │ │ -289 _r_o_u_n_d(const T &val, │ │ │ │ │ -290 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 │ │ │ │ │ -())) { │ │ │ │ │ -291 unsigned int _s_i_z_e = val.size(); │ │ │ │ │ -292 std::vector res(_s_i_z_e); │ │ │ │ │ -293 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ -294 res[i] = round_t::round(val[i], epsilon); │ │ │ │ │ -295 return res; │ │ │ │ │ -296 } │ │ │ │ │ -297 }; │ │ │ │ │ -298 template │ │ │ │ │ -299 struct round_t<_D_u_n_e::FieldVector, _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r, cstyle, │ │ │ │ │ -rstyle> { │ │ │ │ │ -300 static _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> │ │ │ │ │ -301 _r_o_u_n_d(const T &val, │ │ │ │ │ -302 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 │ │ │ │ │ -())) { │ │ │ │ │ -303 _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> res; │ │ │ │ │ -304 for(int i = 0; i < n; ++i) │ │ │ │ │ -305 res[i] = round_t::round(val[i], epsilon); │ │ │ │ │ -306 return res; │ │ │ │ │ -307 } │ │ │ │ │ -308 }; │ │ │ │ │ -309 } // end namespace Impl │ │ │ │ │ -310 template │ │ │ │ │ -_3_1_1 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 /*= │ │ │ │ │ -DefaultEpsilon::value()*/) │ │ │ │ │ -312 { │ │ │ │ │ -313 return Impl::round_t::round(val, epsilon); │ │ │ │ │ -314 } │ │ │ │ │ -315 template │ │ │ │ │ -_3_1_6 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()) │ │ │ │ │ -317 { │ │ │ │ │ -318 return round(val, epsilon); │ │ │ │ │ -319 } │ │ │ │ │ -320 template │ │ │ │ │ -321 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -322 { │ │ │ │ │ -323 return round(val, epsilon); │ │ │ │ │ -324 } │ │ │ │ │ -325 template │ │ │ │ │ -_3_2_6 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -327 { │ │ │ │ │ -328 return round(val, epsilon); │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -331 // truncation │ │ │ │ │ -332 namespace Impl { │ │ │ │ │ -333 template │ │ │ │ │ -334 struct trunc_t; │ │ │ │ │ -335 template │ │ │ │ │ -336 struct trunc_t { │ │ │ │ │ -337 static I │ │ │ │ │ -338 _t_r_u_n_c(const T &val, │ │ │ │ │ -339 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 │ │ │ │ │ -())) { │ │ │ │ │ -340 // this should be optimized away unless needed │ │ │ │ │ -341 if(!std::numeric_limits::is_signed) │ │ │ │ │ -342 // make sure this works for all useful cases even if I is an unsigned type │ │ │ │ │ -343 if(eq(val, T(0), epsilon)) return I(0); │ │ │ │ │ -344 // first get an approximation │ │ │ │ │ -345 I lower = I(val); // now |val-lower| < 1 │ │ │ │ │ -346 // make sure we're really lower in case the cast truncated to an unexpected │ │ │ │ │ -direction │ │ │ │ │ -347 if(T(lower) > val) lower--; // now val-lower < 1 │ │ │ │ │ -348 // check whether lower + 1 is approximately val │ │ │ │ │ -349 if(eq(T(lower+1), val, epsilon)) │ │ │ │ │ -350 return lower+1; │ │ │ │ │ -351 else return lower; │ │ │ │ │ -352 } │ │ │ │ │ -353 }; │ │ │ │ │ -354 template │ │ │ │ │ -355 struct trunc_t { │ │ │ │ │ -356 static I │ │ │ │ │ -357 _t_r_u_n_c(const T &val, │ │ │ │ │ -358 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 │ │ │ │ │ -())) { │ │ │ │ │ -359 I upper = trunc_t::trunc(val, epsilon); │ │ │ │ │ -360 if(ne(T(upper), val, epsilon)) ++upper; │ │ │ │ │ -361 return upper; │ │ │ │ │ -362 } │ │ │ │ │ -363 }; │ │ │ │ │ -364 template │ │ │ │ │ -365 struct trunc_t { │ │ │ │ │ -366 static I │ │ │ │ │ -367 _t_r_u_n_c(const T &val, │ │ │ │ │ -368 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 │ │ │ │ │ -())) { │ │ │ │ │ -369 if(val > T(0)) return trunc_t::trunc(val, epsilon); │ │ │ │ │ -370 else return trunc_t::trunc(val, epsilon); │ │ │ │ │ -371 } │ │ │ │ │ -372 }; │ │ │ │ │ -373 template │ │ │ │ │ -374 struct trunc_t { │ │ │ │ │ -375 static I │ │ │ │ │ -376 _t_r_u_n_c(const T &val, │ │ │ │ │ -377 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 │ │ │ │ │ -())) { │ │ │ │ │ -378 if(val > T(0)) return trunc_t::trunc(val, epsilon); │ │ │ │ │ -379 else return trunc_t::trunc(val, epsilon); │ │ │ │ │ -380 } │ │ │ │ │ -381 }; │ │ │ │ │ -382 template │ │ │ │ │ -383 struct trunc_t<_s_t_d::vector, std::vector, cstyle, rstyle> { │ │ │ │ │ -384 static std::vector │ │ │ │ │ -385 _t_r_u_n_c(const std::vector &val, │ │ │ │ │ -386 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 │ │ │ │ │ -())) { │ │ │ │ │ -387 unsigned int _s_i_z_e = val.size(); │ │ │ │ │ -388 std::vector res(_s_i_z_e); │ │ │ │ │ -389 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ -390 res[i] = trunc_t::trunc(val[i], epsilon); │ │ │ │ │ -391 return res; │ │ │ │ │ -392 } │ │ │ │ │ -393 }; │ │ │ │ │ -394 template │ │ │ │ │ -395 struct trunc_t<_D_u_n_e::FieldVector, _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r, cstyle, │ │ │ │ │ -rstyle> { │ │ │ │ │ -396 static _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> │ │ │ │ │ -397 _t_r_u_n_c(const _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _n_> &val, │ │ │ │ │ -398 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 │ │ │ │ │ -())) { │ │ │ │ │ -399 _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> res; │ │ │ │ │ -400 for(int i = 0; i < n; ++i) │ │ │ │ │ -401 res[i] = trunc_t::trunc(val[i], epsilon); │ │ │ │ │ -402 return res; │ │ │ │ │ -403 } │ │ │ │ │ -404 }; │ │ │ │ │ -405 } // namespace Impl │ │ │ │ │ -406 template │ │ │ │ │ -_4_0_7 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 /*= │ │ │ │ │ -DefaultEpsilon::value()*/) │ │ │ │ │ -408 { │ │ │ │ │ -409 return Impl::trunc_t::trunc(val, epsilon); │ │ │ │ │ -410 } │ │ │ │ │ -411 template │ │ │ │ │ -_4_1_2 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()) │ │ │ │ │ -413 { │ │ │ │ │ -414 return trunc(val, epsilon); │ │ │ │ │ -415 } │ │ │ │ │ -416 template │ │ │ │ │ -417 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -418 { │ │ │ │ │ -419 return trunc(val, epsilon); │ │ │ │ │ -420 } │ │ │ │ │ -421 template │ │ │ │ │ -_4_2_2 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ -423 { │ │ │ │ │ -424 return trunc(val, epsilon); │ │ │ │ │ -425 } │ │ │ │ │ -426 } //namespace Dune │ │ │ │ │ -427 │ │ │ │ │ -428 // oo interface │ │ │ │ │ -429 template │ │ │ │ │ -_4_3_0 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -431_ _F_l_o_a_t_C_m_p_O_p_s(_E_p_s_i_l_o_n_T_y_p_e epsilon) : epsilon_(epsilon) {} │ │ │ │ │ -432 │ │ │ │ │ -433 │ │ │ │ │ -434 template │ │ │ │ │ -435 typename _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_E_p_s_i_l_o_n_T_y_p_e │ │ │ │ │ -_4_3_6 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_e_p_s_i_l_o_n() const │ │ │ │ │ -437 { │ │ │ │ │ -438 return epsilon_; │ │ │ │ │ -439 } │ │ │ │ │ -440 │ │ │ │ │ -441 template │ │ │ │ │ -442 void │ │ │ │ │ -_4_4_3 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_e_p_s_i_l_o_n(_E_p_s_i_l_o_n_T_y_p_e epsilon__) │ │ │ │ │ -444 { │ │ │ │ │ -445 epsilon_ = epsilon__; │ │ │ │ │ -446 } │ │ │ │ │ -447 │ │ │ │ │ -448 │ │ │ │ │ -449 template │ │ │ │ │ -_4_5_0 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -451_ _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 │ │ │ │ │ -452 { │ │ │ │ │ -453 return Dune::FloatCmp::eq(first, second, epsilon_); │ │ │ │ │ -454 } │ │ │ │ │ -455 │ │ │ │ │ -456 template │ │ │ │ │ -_4_5_7 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -458_ _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 │ │ │ │ │ -459 { │ │ │ │ │ -460 return Dune::FloatCmp::ne(first, second, epsilon_); │ │ │ │ │ -461 } │ │ │ │ │ -462 │ │ │ │ │ -463 template │ │ │ │ │ -_4_6_4 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -465_ _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 │ │ │ │ │ -466 { │ │ │ │ │ -467 return Dune::FloatCmp::gt(first, second, epsilon_); │ │ │ │ │ -468 } │ │ │ │ │ -469 │ │ │ │ │ -470 template │ │ │ │ │ -_4_7_1 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -472_ _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 │ │ │ │ │ -473 { │ │ │ │ │ -474 return Dune::FloatCmp::lt(first, second, epsilon_); │ │ │ │ │ -475 } │ │ │ │ │ -476 │ │ │ │ │ -477 template │ │ │ │ │ -_4_7_8 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -479_ _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 │ │ │ │ │ -480 { │ │ │ │ │ -481 return Dune::FloatCmp::ge(first, second, epsilon_); │ │ │ │ │ -482 } │ │ │ │ │ -483 │ │ │ │ │ -484 template │ │ │ │ │ -_4_8_5 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -486_ _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 │ │ │ │ │ -487 { │ │ │ │ │ -488 return Dune::FloatCmp::le(first, second, epsilon_); │ │ │ │ │ -489 } │ │ │ │ │ -490 │ │ │ │ │ -491 │ │ │ │ │ -492 template │ │ │ │ │ -493 template │ │ │ │ │ -_4_9_4 I _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -495_ _r_o_u_n_d(const _V_a_l_u_e_T_y_p_e &val) const │ │ │ │ │ -496 { │ │ │ │ │ -497 return Dune::FloatCmp::round(val, epsilon_); │ │ │ │ │ -498 } │ │ │ │ │ -499 │ │ │ │ │ -500 template │ │ │ │ │ -501 template │ │ │ │ │ -_5_0_2 I _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ -503_ _t_r_u_n_c(const _V_a_l_u_e_T_y_p_e &val) const │ │ │ │ │ -504 { │ │ │ │ │ -505 return Dune::FloatCmp::trunc(val, epsilon_); │ │ │ │ │ -506 } │ │ │ │ │ -507 │ │ │ │ │ -508} //namespace Dune │ │ │ │ │ -_f_l_o_a_t___c_m_p_._h_h │ │ │ │ │ -Various ways to compare floating-point numbers. │ │ │ │ │ -_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. │ │ │ │ │ -_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_:_:_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_:_:_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_:_:_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 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_s_i_z_e │ │ │ │ │ -constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std:: │ │ │ │ │ -integer_sequence< T, II... >) │ │ │ │ │ -Return the size of the sequence. │ │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e │ │ │ │ │ -Mapping of value type to epsilon type. │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:23 │ │ │ │ │ -_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_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -EpsilonType< T >::Type Type │ │ │ │ │ -The epsilon type corresponding to value type std::vector │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:36 │ │ │ │ │ -_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _n_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -EpsilonType< T >::Type Type │ │ │ │ │ -The epsilon type corresponding to value type Dune::FieldVector │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:47 │ │ │ │ │ -_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_,_ _r_e_l_a_t_i_v_e_W_e_a_k_ _>_:_:_v_a_l_u_e │ │ │ │ │ -static EpsilonType< T >::Type value() │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:53 │ │ │ │ │ -_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_,_ _r_e_l_a_t_i_v_e_S_t_r_o_n_g_ _>_:_:_v_a_l_u_e │ │ │ │ │ -static EpsilonType< T >::Type value() │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:58 │ │ │ │ │ -_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_,_ _a_b_s_o_l_u_t_e_ _>_:_:_v_a_l_u_e │ │ │ │ │ -static EpsilonType< T >::Type value() │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:63 │ │ │ │ │ -_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_:_:_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_:_:_F_l_o_a_t_C_m_p_O_p_s │ │ │ │ │ -FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value()) │ │ │ │ │ -construct an operations object │ │ │ │ │ -DDeeffiinniittiioonn float_cmp.cc:431 │ │ │ │ │ -_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_:_:_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_:_:_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 │ │ │ │ │ +20// undefine the macro that signals C++17 support, if set │ │ │ │ │ +21#ifdef Vc_CXX17 │ │ │ │ │ +22#undef Vc_CXX17 │ │ │ │ │ +23#endif │ │ │ │ │ +24 │ │ │ │ │ +25// include the rest of Vc │ │ │ │ │ +26#include │ │ │ │ │ +27 │ │ │ │ │ +28#endif // HAVE_VC │ │ │ │ │ +29 │ │ │ │ │ +30#endif // DUNE_COMMON_VC_HH │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_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: debugalign.hh File Reference │ │ │ │ +dune-common: debugstream.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,378 +72,62 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
debugalign.hh File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
debugstream.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>
│ │ │ │ + │ │ │ │ +

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

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

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::AlignedBase< align, Impl >
 CRTP base mixin class to check alignment. More...
struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
 
struct  Dune::IsNumber< AlignedNumberImpl::AlignedNumber< T, align > >
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
 
class  Dune::AlignedNumberImpl::AlignedNumber< T, align >
 aligned wrappers for arithmetic types More...
class  Dune::DebugStreamError
 standard exception for the debugstream More...
 
struct  Dune::Simd::Overloads::ScalarType< AlignedNumber< T, align > >
class  Dune::StreamWrap
 
struct  Dune::Simd::Overloads::RebindType< U, AlignedNumber< T, align > >
class  Dune::DebugStreamState
 Intermediate class to implement tie-operation of DebugStream. More...
 
struct  Dune::Simd::Overloads::LaneCount< AlignedNumber< T, align > >
class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
 Generic class to implement debug output streams. 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
 
typedef unsigned int Dune::DebugLevel
 Type for debug levels.
 
│ │ │ │ -

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

│ │ │ │ +

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,388 +1,47 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _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 | _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_:_:_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_:_:_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_:_:_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_ _>_ _> │ │ │ │ │ +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_:_:_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_._._. │ │ │ │ │ + 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_:_:_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_ _>_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_S_t_r_e_a_m_W_r_a_p │ │ │ │ │   │ │ │ │ │ -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_ _>_ _> │ │ │ │ │ + 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_:_:_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_ _>_ _> │ │ │ │ │ + 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. │ │ │ │ │   │ │ │ │ │ -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 │ │ │ │ │ +typedef unsigned int  _D_u_n_e_:_:_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ +  Type for debug levels. │ │ │ │ │   │ │ │ │ │ -********** 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 ********** │ │ │ │ │ +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/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.hh Source File │ │ │ │ +dune-common: debugstream.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,657 +74,333 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
debugalign.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 © 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
│ │ │ │ -
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 void* aligned_p = (void*)p;
│ │ │ │ -
59 std::size_t space = align*2;
│ │ │ │ -
60 return p == std::align(align, align, aligned_p, space);
│ │ │ │ -
61 }
│ │ │ │ -
│ │ │ │ -
62
│ │ │ │ -
64 template<std::size_t align, class Impl>
│ │ │ │ -
│ │ │ │ -
65 struct alignas(align) AlignedBase
│ │ │ │ -
66 {
│ │ │ │ -
│ │ │ │ -
75 static void* operator new(std::size_t count, void* ptr) {
│ │ │ │ -
76 if(!isAligned(ptr, align))
│ │ │ │ -
77 violatedAlignment(className<Impl>().c_str(), align, ptr);
│ │ │ │ -
78 return ::operator new(count*sizeof(Impl), ptr);
│ │ │ │ -
79 }
│ │ │ │ -
│ │ │ │ -
80
│ │ │ │ -
│ │ │ │ -
89 static void* operator new[](std::size_t count, void* ptr) {
│ │ │ │ -
90 if(!isAligned(ptr, align))
│ │ │ │ -
91 violatedAlignment(className<Impl>().c_str(), align, ptr);
│ │ │ │ -
92 return ::operator new[](count*sizeof(Impl), ptr);
│ │ │ │ -
93 }
│ │ │ │ -
│ │ │ │ -
94 };
│ │ │ │ -
│ │ │ │ -
95
│ │ │ │ -
97 static constexpr auto debugAlignment = 2*alignof(std::max_align_t);
│ │ │ │ -
98
│ │ │ │ -
│ │ │ │ -
99 namespace AlignedNumberImpl {
│ │ │ │ -
100
│ │ │ │ -
101 template<class T, std::size_t align = debugAlignment>
│ │ │ │ -
102 class AlignedNumber;
│ │ │ │ -
103
│ │ │ │ -
104 } // namespace AlignedNumberImpl
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ - │ │ │ │ -
107
│ │ │ │ -
108 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
109 struct IsNumber<AlignedNumberImpl::AlignedNumber<T,align>>
│ │ │ │ -
110 : public std::true_type {};
│ │ │ │ -
│ │ │ │ -
111
│ │ │ │ -
113 template<std::size_t align = debugAlignment, class T>
│ │ │ │ -
114 AlignedNumber<T, align> aligned(T value) { return { std::move(value) }; }
│ │ │ │ -
115
│ │ │ │ -
116 // The purpose of this namespace is to move the `<cmath>` function overloads
│ │ │ │ -
117 // out of namespace `Dune`. This avoids problems where people called
│ │ │ │ -
118 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using
│ │ │ │ -
119 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find
│ │ │ │ -
120 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`,
│ │ │ │ -
121 // which does not have an overload for `double`.
│ │ │ │ -
122 namespace AlignedNumberImpl {
│ │ │ │ -
123
│ │ │ │ -
125 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
127 : public AlignedBase<align, AlignedNumber<T, align> >
│ │ │ │ -
128 {
│ │ │ │ -
129 T value_;
│ │ │ │ -
130
│ │ │ │ -
131 public:
│ │ │ │ -
132 AlignedNumber() = default;
│ │ │ │ -
133 AlignedNumber(T value) : value_(std::move(value)) {}
│ │ │ │ -
134 template<class U, std::size_t uAlign,
│ │ │ │ -
135 class = std::enable_if_t<(align >= uAlign) &&
│ │ │ │ -
136 std::is_convertible<U, T>::value> >
│ │ │ │ -
137 AlignedNumber(const AlignedNumber<U, uAlign> &o) : value_(U(o)) {}
│ │ │ │ -
138
│ │ │ │ -
139 // accessors
│ │ │ │ -
140 template<class U,
│ │ │ │ -
141 class = std::enable_if_t<std::is_convertible<T, U>::value> >
│ │ │ │ -
142 explicit operator U() const { return value_; }
│ │ │ │ -
143
│ │ │ │ -
144 const T &value() const { return value_; }
│ │ │ │ -
145 T &value() { return value_; }
│ │ │ │ +
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
│ │ │ │ -
147 // I/O
│ │ │ │ -
148 template<class charT, class Traits>
│ │ │ │ -
149 friend std::basic_istream<charT, Traits>&
│ │ │ │ +
148 class DebugStreamError : public IOError {};
│ │ │ │ +
149
│ │ │ │
│ │ │ │ -
150 operator>>(std::basic_istream<charT, Traits>& str, AlignedNumber &u)
│ │ │ │ -
151 {
│ │ │ │ -
152 return str >> u.value_;
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
155 template<class charT, class Traits>
│ │ │ │ -
│ │ │ │ -
156 friend std::basic_ostream<charT, Traits>&
│ │ │ │ -
157 operator<<(std::basic_ostream<charT, Traits>& str,
│ │ │ │ -
158 const AlignedNumber &u)
│ │ │ │ -
159 {
│ │ │ │ -
160 return str << u.value_;
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
163 // The trick with `template<class U = T, class = std::void_t<expr(U)> >` is
│ │ │ │ -
164 // needed because at least g++-4.9 seems to evaluates a default argument
│ │ │ │ -
165 // in `template<class = std::void_t<expr(T))> >` as soon as possible and will
│ │ │ │ -
166 // error out if `expr(T)` is invalid. E.g. for `expr(T)` =
│ │ │ │ -
167 // `decltype(--std::declval<T&>())`, instantiating `AlignedNumber<bool>`
│ │ │ │ -
168 // will result in an unrecoverable error (`--` cannot be applied to a
│ │ │ │ -
169 // `bool`).
│ │ │ │ -
170
│ │ │ │ -
171 // Increment, decrement
│ │ │ │ -
172 template<class U = T, class = std::void_t<decltype(++std::declval<U&>())> >
│ │ │ │ -
173 AlignedNumber &operator++() { ++value_; return *this; }
│ │ │ │ -
174
│ │ │ │ -
175 template<class U = T, class = std::void_t<decltype(--std::declval<U&>())> >
│ │ │ │ -
176 AlignedNumber &operator--() { --value_; return *this; }
│ │ │ │ -
177
│ │ │ │ -
178 template<class U = T, class = std::void_t<decltype(std::declval<U&>()++)> >
│ │ │ │ -
179 decltype(auto) operator++(int) { return aligned<align>(value_++); }
│ │ │ │ -
180
│ │ │ │ -
181 template<class U = T, class = std::void_t<decltype(std::declval<U&>()--)> >
│ │ │ │ -
182 decltype(auto) operator--(int) { return aligned<align>(value_--); }
│ │ │ │ -
183
│ │ │ │ -
184 // unary operators
│ │ │ │ -
185 template<class U = T,
│ │ │ │ -
186 class = std::void_t<decltype(+std::declval<const U&>())> >
│ │ │ │ -
187 decltype(auto) operator+() const { return aligned<align>(+value_); }
│ │ │ │ -
188
│ │ │ │ -
189 template<class U = T,
│ │ │ │ -
190 class = std::void_t<decltype(-std::declval<const U&>())> >
│ │ │ │ -
191 decltype(auto) operator-() const { return aligned<align>(-value_); }
│ │ │ │ -
192
│ │ │ │ -
193 /*
│ │ │ │ -
194 * silence warnings from GCC about using `~` on a bool
│ │ │ │ -
195 * (when instantiated for T=bool)
│ │ │ │ -
196 */
│ │ │ │ -
197#if __GNUC__ >= 7
│ │ │ │ -
198# pragma GCC diagnostic push
│ │ │ │ -
199# pragma GCC diagnostic ignored "-Wbool-operation"
│ │ │ │ -
200#endif
│ │ │ │ -
201#ifdef __clang__
│ │ │ │ -
202# pragma clang diagnostic push
│ │ │ │ -
203# pragma clang diagnostic ignored "-Wbool-operation"
│ │ │ │ -
204#endif
│ │ │ │ -
205 template<class U = T,
│ │ │ │ -
206 class = std::void_t<decltype(~std::declval<const U&>())> >
│ │ │ │ -
207 decltype(auto) operator~() const { return aligned<align>(~value_); }
│ │ │ │ -
208#if __GNUC__ >= 7
│ │ │ │ -
209# pragma GCC diagnostic pop
│ │ │ │ -
210#endif
│ │ │ │ -
211#ifdef __clang__
│ │ │ │ -
212# pragma clang diagnostic pop
│ │ │ │ -
213#endif
│ │ │ │ -
214
│ │ │ │ -
215 template<class U = T,
│ │ │ │ -
216 class = std::void_t<decltype(!std::declval<const U&>())> >
│ │ │ │ -
217 decltype(auto) operator!() const { return aligned<align>(!value_); }
│ │ │ │ -
218
│ │ │ │ -
219 // assignment operators
│ │ │ │ -
│ │ │ │ -
220#define DUNE_ASSIGN_OP(OP) \
│ │ │ │ -
221 template<class U, std::size_t uAlign, \
│ │ │ │ -
222 class = std::enable_if_t< \
│ │ │ │ -
223 ( uAlign <= align && \
│ │ │ │ -
224 sizeof(std::declval<T&>() OP std::declval<U>()) ) \
│ │ │ │ -
225 > > \
│ │ │ │ -
226 AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
227 { \
│ │ │ │ -
228 value_ OP U(u); \
│ │ │ │ -
229 return *this; \
│ │ │ │ -
230 } \
│ │ │ │ -
231 \
│ │ │ │ -
232 template<class U, \
│ │ │ │ -
233 class = std::void_t<decltype(std::declval<T&>() OP \
│ │ │ │ -
234 std::declval<U>())> > \
│ │ │ │ -
235 AlignedNumber &operator OP(const U &u) \
│ │ │ │ -
236 { \
│ │ │ │ -
237 value_ OP u; \
│ │ │ │ -
238 return *this; \
│ │ │ │ -
239 } \
│ │ │ │ -
240 \
│ │ │ │ -
241 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
242
│ │ │ │ - │ │ │ │ - │ │ │ │ -
245
│ │ │ │ - │ │ │ │ -
247 DUNE_ASSIGN_OP(/=);
│ │ │ │ -
248 DUNE_ASSIGN_OP(%=);
│ │ │ │ -
249
│ │ │ │ - │ │ │ │ -
251 DUNE_ASSIGN_OP(&=);
│ │ │ │ -
252 DUNE_ASSIGN_OP(|=);
│ │ │ │ -
253
│ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ +
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#undef DUNE_ASSIGN_OP
│ │ │ │ -
258 };
│ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
259
│ │ │ │ -
260 // binary operators
│ │ │ │ -
│ │ │ │ -
261#define DUNE_BINARY_OP(OP) \
│ │ │ │ -
262 template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
│ │ │ │ -
263 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
264 OP std::declval<U>())> > \
│ │ │ │ -
265 decltype(auto) \
│ │ │ │ -
266 operator OP(const AlignedNumber<T, tAlign> &t, \
│ │ │ │ -
267 const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
268 { \
│ │ │ │ -
269 /* can't use std::max(); not constexpr */ \
│ │ │ │ -
270 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
│ │ │ │ -
271 } \
│ │ │ │ -
272 \
│ │ │ │ -
273 template<class T, class U, std::size_t uAlign, \
│ │ │ │ -
274 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
275 OP std::declval<U>())> > \
│ │ │ │ -
276 decltype(auto) \
│ │ │ │ -
277 operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
278 { \
│ │ │ │ -
279 return aligned<uAlign>(t OP U(u)); \
│ │ │ │ -
280 } \
│ │ │ │ -
281 \
│ │ │ │ -
282 template<class T, std::size_t tAlign, class U, \
│ │ │ │ -
283 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
284 OP std::declval<U>())> > \
│ │ │ │ -
285 decltype(auto) \
│ │ │ │ -
286 operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
│ │ │ │ -
287 { \
│ │ │ │ -
288 return aligned<tAlign>(T(t) OP u); \
│ │ │ │ -
289 } \
│ │ │ │ -
290 \
│ │ │ │ -
291 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ -
292
│ │ │ │ - │ │ │ │ - │ │ │ │ -
295
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
299
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │
303
│ │ │ │ - │ │ │ │ - │ │ │ │ -
306
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
313
│ │ │ │ - │ │ │ │ -
315 DUNE_BINARY_OP(||);
│ │ │ │ -
316
│ │ │ │ -
317#undef DUNE_BINARY_OP
│ │ │ │ +
│ │ │ │ +
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
│ │ │ │ -
320 //
│ │ │ │ -
321 // Overloads for the functions provided by the standard library
│ │ │ │ -
322 //
│ │ │ │ -
323#define DUNE_UNARY_FUNC(name) \
│ │ │ │ -
324 template<class T, std::size_t align> \
│ │ │ │ -
325 decltype(auto) name(const AlignedNumber<T, align> &u) \
│ │ │ │ -
326 { \
│ │ │ │ -
327 using std::name; \
│ │ │ │ -
328 return aligned<align>(name(T(u))); \
│ │ │ │ -
329 } \
│ │ │ │ -
330 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
331
│ │ │ │ -
332 //
│ │ │ │ -
333 // <cmath> functions
│ │ │ │ -
334 //
│ │ │ │ -
335
│ │ │ │ -
336 // note: only unary functions are provided at the moment. Getting all the
│ │ │ │ -
337 // overloads right for functions with more than one argument is tricky.
│ │ │ │ -
338 // All <cmath> functions appear in the list below in the order they are
│ │ │ │ -
339 // listed in in the standard, but the unimplemented ones are commented
│ │ │ │ -
340 // out.
│ │ │ │ -
341
│ │ │ │ -
342 // note: abs is provided by both <cstdlib> (for integer) and <cmath> (for
│ │ │ │ -
343 // floating point). This overload works for both.
│ │ │ │ -
344 DUNE_UNARY_FUNC(abs);
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
350 // atan2
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
354 // copysign
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
363 // fdim
│ │ │ │ - │ │ │ │ -
365 // fma
│ │ │ │ -
366 // fmax
│ │ │ │ -
367 // fmin
│ │ │ │ -
368 // fmod
│ │ │ │ -
369 // frexp
│ │ │ │ -
370 // hypos
│ │ │ │ - │ │ │ │ -
372 // ldexp
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
383 // modf
│ │ │ │ -
384 DUNE_UNARY_FUNC(nearbyint);
│ │ │ │ -
385 // nextafter
│ │ │ │ -
386 // nexttoward
│ │ │ │ -
387 // pow
│ │ │ │ -
388 // remainder
│ │ │ │ -
389 // remquo
│ │ │ │ - │ │ │ │ - │ │ │ │ -
392 // scalbln
│ │ │ │ -
393 // scalbn
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
401
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
407
│ │ │ │ -
408 // isgreater
│ │ │ │ -
409 // isgreaterequal
│ │ │ │ -
410 // isless
│ │ │ │ -
411 // islessequal
│ │ │ │ -
412 // islessgreater
│ │ │ │ -
413 // isunordered
│ │ │ │ -
414
│ │ │ │ -
415 //
│ │ │ │ -
416 // <complex> functions
│ │ │ │ -
417 //
│ │ │ │ -
418
│ │ │ │ -
419 // not all functions are implemented, and unlike for <cmath>, no
│ │ │ │ -
420 // comprehensive list is provided
│ │ │ │ - │ │ │ │ -
422
│ │ │ │ -
423#undef DUNE_UNARY_FUNC
│ │ │ │ -
424
│ │ │ │ -
425 // We need to overload min() and max() since they require types to be
│ │ │ │ -
426 // LessThanComparable, which requires `a<b` to be "convertible to bool".
│ │ │ │ -
427 // That wording seems to be a leftover from C++03, and today is probably
│ │ │ │ -
428 // equivalent to "implicitly convertible". There is also issue 2114
│ │ │ │ -
429 // <https://cplusplus.github.io/LWG/issue2114> in the standard (still open
│ │ │ │ -
430 // as of 2018-07-06), which strives to require both "implicitly" and
│ │ │ │ -
431 // "contextually" convertible -- plus a few other things.
│ │ │ │ -
432 //
│ │ │ │ -
433 // We do not want our debug type to automatically decay to the underlying
│ │ │ │ -
434 // type, so we do not want to make the conversion non-explicit. So the
│ │ │ │ -
435 // only option left is to overload min() and max().
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
438 auto max(const AlignedNumber<T, align> &a,
│ │ │ │ - │ │ │ │ -
440 {
│ │ │ │ -
441 using std::max;
│ │ │ │ -
442 return aligned<align>(max(T(a), T(b)));
│ │ │ │ -
443 }
│ │ │ │ -
│ │ │ │ -
444
│ │ │ │ -
445 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
446 auto max(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ -
447 {
│ │ │ │ -
448 using std::max;
│ │ │ │ -
449 return aligned<align>(max(a, T(b)));
│ │ │ │ -
450 }
│ │ │ │ -
│ │ │ │ -
451
│ │ │ │ -
452 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
453 auto max(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ -
454 {
│ │ │ │ -
455 using std::max;
│ │ │ │ -
456 return aligned<align>(max(T(a), b));
│ │ │ │ -
457 }
│ │ │ │ -
│ │ │ │ -
458
│ │ │ │ -
459 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
460 auto min(const AlignedNumber<T, align> &a,
│ │ │ │ - │ │ │ │ -
462 {
│ │ │ │ -
463 using std::min;
│ │ │ │ -
464 return aligned<align>(min(T(a), T(b)));
│ │ │ │ -
465 }
│ │ │ │ -
│ │ │ │ -
466
│ │ │ │ -
467 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
468 auto min(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ -
469 {
│ │ │ │ -
470 using std::min;
│ │ │ │ -
471 return aligned<align>(min(a, T(b)));
│ │ │ │ -
472 }
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
474 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
475 auto min(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ -
476 {
│ │ │ │ -
477 using std::min;
│ │ │ │ -
478 return aligned<align>(min(T(a), b));
│ │ │ │ -
479 }
│ │ │ │ -
│ │ │ │ -
480
│ │ │ │ -
481 } // namespace AlignedNumberImpl
│ │ │ │ -
482
│ │ │ │ -
483 // SIMD-like functions from "conditional.hh"
│ │ │ │ -
484 template<class T, std::size_t align>
│ │ │ │ -
485 AlignedNumber<T, align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
488 {
│ │ │ │ -
489 return b ? v1 : v2;
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491
│ │ │ │ -
492 // SIMD-like functions from "rangeutilities.hh"
│ │ │ │ -
493 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
495 {
│ │ │ │ -
496 return T(val);
│ │ │ │ -
497 }
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
499 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
501 {
│ │ │ │ -
502 return T(val);
│ │ │ │ -
503 }
│ │ │ │ -
│ │ │ │ -
504
│ │ │ │ -
505 template<std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
507 {
│ │ │ │ -
508 return bool(val);
│ │ │ │ -
509 }
│ │ │ │ -
│ │ │ │ -
510
│ │ │ │ -
511 template<std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
513 {
│ │ │ │ -
514 return bool(val);
│ │ │ │ -
515 }
│ │ │ │ -
│ │ │ │ -
516
│ │ │ │ -
517 // SIMD-like functionality from "simd/interface.hh"
│ │ │ │ -
│ │ │ │ -
518 namespace Simd {
│ │ │ │ -
│ │ │ │ -
519 namespace Overloads {
│ │ │ │ -
520
│ │ │ │ -
521 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
523
│ │ │ │ -
524 template<class U, class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
525 struct RebindType<U, AlignedNumber<T, align> > {
│ │ │ │ - │ │ │ │ -
527 };
│ │ │ │ -
│ │ │ │ -
528
│ │ │ │ -
529 template<class T, std::size_t align>
│ │ │ │ -
530 struct LaneCount<AlignedNumber<T, align> > : index_constant<1> {};
│ │ │ │ -
531
│ │ │ │ -
532 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
534 {
│ │ │ │ -
535 assert(l == 0);
│ │ │ │ -
536 return v.value();
│ │ │ │ -
537 }
│ │ │ │ -
│ │ │ │ -
538
│ │ │ │ -
539 template<class T, std::size_t align>
│ │ │ │ -
│ │ │ │ -
540 T lane(ADLTag<5>, std::size_t l, const AlignedNumber<T, align> &v)
│ │ │ │ -
541 {
│ │ │ │ -
542 assert(l == 0);
│ │ │ │ -
543 return v.value();
│ │ │ │ -
544 }
│ │ │ │ -
│ │ │ │ -
545
│ │ │ │ -
546 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
549 const AlignedNumber<T, align> &ifTrue,
│ │ │ │ -
550 const AlignedNumber<T, align> &ifFalse)
│ │ │ │ -
551 {
│ │ │ │ -
552 return mask ? ifTrue : ifFalse;
│ │ │ │ -
553 }
│ │ │ │ -
│ │ │ │ -
554
│ │ │ │ -
555 template<std::size_t align>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
557 {
│ │ │ │ -
558 return bool(mask);
│ │ │ │ -
559 }
│ │ │ │ -
│ │ │ │ -
560
│ │ │ │ -
561 } // namespace Overloads
│ │ │ │ -
│ │ │ │ -
562
│ │ │ │ -
563 } // namespace Simd
│ │ │ │ -
│ │ │ │ -
564
│ │ │ │ -
565} // namespace Dune
│ │ │ │ -
566
│ │ │ │ -
567#endif // DUNE_DEBUGALIGN_HH
│ │ │ │ -
#define DUNE_BINARY_OP(OP)
Definition debugalign.hh:261
│ │ │ │ -
#define DUNE_UNARY_FUNC(name)
│ │ │ │ -
#define DUNE_ASSIGN_OP(OP)
Definition debugalign.hh:220
│ │ │ │ - │ │ │ │ -
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
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:29
│ │ │ │ -
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.
│ │ │ │ +
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
│ │ │ │ -
void violatedAlignment(const char *className, std::size_t expectedAlignment, const void *address)
called when an alignment violation is detected
Definition debugalign.cc:36
│ │ │ │ -
bool any_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:506
│ │ │ │ -
bool all_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:512
│ │ │ │ -
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:97
│ │ │ │ -
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:114
│ │ │ │ -
ViolatedAlignmentHandler & violatedAlignmentHandler()
access the handler called by violatedAlignment()
Definition debugalign.cc:30
│ │ │ │ -
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:494
│ │ │ │ -
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:500
│ │ │ │ -
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition debugalign.hh:556
│ │ │ │ -
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition debugalign.hh:533
│ │ │ │ -
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
│ │ │ │ -
aligned wrappers for arithmetic types
Definition debugalign.hh:128
│ │ │ │ - │ │ │ │ - │ │ │ │ -
decltype(auto) operator+() const
Definition debugalign.hh:187
│ │ │ │ - │ │ │ │ -
decltype(auto) operator--(int)
Definition debugalign.hh:182
│ │ │ │ -
DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=
│ │ │ │ -
decltype(auto) operator++(int)
Definition debugalign.hh:179
│ │ │ │ -
decltype(auto) operator!() const
Definition debugalign.hh:217
│ │ │ │ -
T & value()
Definition debugalign.hh:145
│ │ │ │ -
const T & value() const
Definition debugalign.hh:144
│ │ │ │ -
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:150
│ │ │ │ - │ │ │ │ - │ │ │ │ -
decltype(auto) operator~() const
Definition debugalign.hh:207
│ │ │ │ -
AlignedNumber(T value)
Definition debugalign.hh:133
│ │ │ │ -
AlignedNumber(const AlignedNumber< U, uAlign > &o)
Definition debugalign.hh:137
│ │ │ │ -
decltype(auto) operator-() const
Definition debugalign.hh:191
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ +
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,701 +1,375 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -debugalign.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 © 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 │ │ │ │ │ -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 { │ │ │ │ │ -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 void* aligned_p = (void*)p; │ │ │ │ │ -59 std::size_t space = align*2; │ │ │ │ │ -60 return p == std::align(align, align, aligned_p, space); │ │ │ │ │ -61 } │ │ │ │ │ -62 │ │ │ │ │ -64 template │ │ │ │ │ -_6_5 struct alignas(align) _A_l_i_g_n_e_d_B_a_s_e │ │ │ │ │ -66 { │ │ │ │ │ -_7_5 static void* operator new(std::size_t count, void* ptr) { │ │ │ │ │ -76 if(!_i_s_A_l_i_g_n_e_d(ptr, align)) │ │ │ │ │ -77 _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t(className().c_str(), align, ptr); │ │ │ │ │ -78 return ::operator new(count*sizeof(Impl), ptr); │ │ │ │ │ -79 } │ │ │ │ │ -80 │ │ │ │ │ -_8_9 static void* operator new[](std::size_t count, void* ptr) { │ │ │ │ │ -90 if(!_i_s_A_l_i_g_n_e_d(ptr, align)) │ │ │ │ │ -91 _v_i_o_l_a_t_e_d_A_l_i_g_n_m_e_n_t(className().c_str(), align, ptr); │ │ │ │ │ -92 return ::operator new[](count*sizeof(Impl), ptr); │ │ │ │ │ -93 } │ │ │ │ │ -94 }; │ │ │ │ │ -95 │ │ │ │ │ -_9_7 static constexpr auto _d_e_b_u_g_A_l_i_g_n_m_e_n_t = 2*alignof(std::max_align_t); │ │ │ │ │ -98 │ │ │ │ │ -_9_9 namespace AlignedNumberImpl { │ │ │ │ │ -100 │ │ │ │ │ -101 template │ │ │ │ │ -102 class _A_l_i_g_n_e_d_N_u_m_b_e_r; │ │ │ │ │ -103 │ │ │ │ │ -104 } // namespace AlignedNumberImpl │ │ │ │ │ -105 │ │ │ │ │ -106 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; │ │ │ │ │ -107 │ │ │ │ │ -108 template │ │ │ │ │ -_1_0_9 struct _I_s_N_u_m_b_e_r> │ │ │ │ │ -110 : public std::true_type {}; │ │ │ │ │ -111 │ │ │ │ │ -113 template │ │ │ │ │ -_1_1_4 _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) }; } │ │ │ │ │ -115 │ │ │ │ │ -116 // The purpose of this namespace is to move the `` function │ │ │ │ │ -overloads │ │ │ │ │ -117 // out of namespace `Dune`. This avoids problems where people called │ │ │ │ │ -118 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using │ │ │ │ │ -119 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find │ │ │ │ │ -120 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`, │ │ │ │ │ -121 // which does not have an overload for `double`. │ │ │ │ │ -122 namespace AlignedNumberImpl { │ │ │ │ │ -123 │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 class _A_l_i_g_n_e_d_N_u_m_b_e_r │ │ │ │ │ -127 : public _A_l_i_g_n_e_d_B_a_s_e > │ │ │ │ │ -128 { │ │ │ │ │ -129 T value_; │ │ │ │ │ -130 │ │ │ │ │ -131 public: │ │ │ │ │ -_1_3_2 _A_l_i_g_n_e_d_N_u_m_b_e_r() = default; │ │ │ │ │ -_1_3_3 _A_l_i_g_n_e_d_N_u_m_b_e_r(T value) : value_(_s_t_d::move(value)) {} │ │ │ │ │ -134 template= uAlign) && │ │ │ │ │ -136 std::is_convertible::value> > │ │ │ │ │ -_1_3_7 _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)) {} │ │ │ │ │ -138 │ │ │ │ │ -139 // accessors │ │ │ │ │ -140 template::value> > │ │ │ │ │ -_1_4_2 explicit operator U() const { return value_; } │ │ │ │ │ -143 │ │ │ │ │ -_1_4_4 const T &_v_a_l_u_e() const { return value_; } │ │ │ │ │ -_1_4_5 T &_v_a_l_u_e() { return value_; } │ │ │ │ │ +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; │ │ │ │ │ +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 │ │ │ │ │ -147 // I/O │ │ │ │ │ -148 template │ │ │ │ │ -149 friend std::basic_istream& │ │ │ │ │ -_1_5_0 _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) │ │ │ │ │ -151 { │ │ │ │ │ -152 return str >> u.value_; │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -155 template │ │ │ │ │ -_1_5_6 friend std::basic_ostream& │ │ │ │ │ -157 _o_p_e_r_a_t_o_r_<_<(std::basic_ostream& str, │ │ │ │ │ -158 const _A_l_i_g_n_e_d_N_u_m_b_e_r &u) │ │ │ │ │ -159 { │ │ │ │ │ -160 return str << u.value_; │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -163 // The trick with `template >` is │ │ │ │ │ -164 // needed because at least g++-4.9 seems to evaluates a default argument │ │ │ │ │ -165 // in `template >` as soon as possible and │ │ │ │ │ -will │ │ │ │ │ -166 // error out if `expr(T)` is invalid. E.g. for `expr(T)` = │ │ │ │ │ -167 // `decltype(--std::declval())`, instantiating `AlignedNumber` │ │ │ │ │ -168 // will result in an unrecoverable error (`--` cannot be applied to a │ │ │ │ │ -169 // `bool`). │ │ │ │ │ -170 │ │ │ │ │ -171 // Increment, decrement │ │ │ │ │ -172 template())> > │ │ │ │ │ -_1_7_3 _A_l_i_g_n_e_d_N_u_m_b_e_r &operator++() { ++value_; return *this; } │ │ │ │ │ -174 │ │ │ │ │ -175 template())> > │ │ │ │ │ -_1_7_6 _A_l_i_g_n_e_d_N_u_m_b_e_r &operator--() { --value_; return *this; } │ │ │ │ │ -177 │ │ │ │ │ -178 template()++)> > │ │ │ │ │ -_1_7_9 decltype(auto) _o_p_e_r_a_t_o_r_+_+(int) { return aligned(value_++); } │ │ │ │ │ -180 │ │ │ │ │ -181 template()--)> > │ │ │ │ │ -_1_8_2 decltype(auto) _o_p_e_r_a_t_o_r_-_-(int) { return aligned(value_--); } │ │ │ │ │ -183 │ │ │ │ │ -184 // unary operators │ │ │ │ │ -185 template())> > │ │ │ │ │ -_1_8_7 decltype(auto) _o_p_e_r_a_t_o_r_+() const { return aligned(+value_); } │ │ │ │ │ -188 │ │ │ │ │ -189 template())> > │ │ │ │ │ -_1_9_1 decltype(auto) _o_p_e_r_a_t_o_r_-() const { return aligned(-value_); } │ │ │ │ │ -192 │ │ │ │ │ -193 /* │ │ │ │ │ -194 * silence warnings from GCC about using `~` on a bool │ │ │ │ │ -195 * (when instantiated for T=bool) │ │ │ │ │ -196 */ │ │ │ │ │ -197#if __GNUC__ >= 7 │ │ │ │ │ -198# pragma GCC diagnostic push │ │ │ │ │ -199# pragma GCC diagnostic ignored "-Wbool-operation" │ │ │ │ │ -200#endif │ │ │ │ │ -201#ifdef __clang__ │ │ │ │ │ -202# pragma clang diagnostic push │ │ │ │ │ -203# pragma clang diagnostic ignored "-Wbool-operation" │ │ │ │ │ -204#endif │ │ │ │ │ -205 template())> > │ │ │ │ │ -_2_0_7 decltype(auto) _o_p_e_r_a_t_o_r_~() const { return aligned(~value_); } │ │ │ │ │ -208#if __GNUC__ >= 7 │ │ │ │ │ -209# pragma GCC diagnostic pop │ │ │ │ │ -210#endif │ │ │ │ │ -211#ifdef __clang__ │ │ │ │ │ -212# pragma clang diagnostic pop │ │ │ │ │ -213#endif │ │ │ │ │ -214 │ │ │ │ │ -215 template())> > │ │ │ │ │ -_2_1_7 decltype(auto) _o_p_e_r_a_t_o_r_!() const { return aligned(!value_); } │ │ │ │ │ -218 │ │ │ │ │ -219 // assignment operators │ │ │ │ │ -_2_2_0#define DUNE_ASSIGN_OP(OP) \ │ │ │ │ │ -221 template() OP std::declval()) ) \ │ │ │ │ │ -225 > > \ │ │ │ │ │ -226 AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ -227 { \ │ │ │ │ │ -228 value_ OP U(u); \ │ │ │ │ │ -229 return *this; \ │ │ │ │ │ -230 } \ │ │ │ │ │ -231 \ │ │ │ │ │ -232 template() OP \ │ │ │ │ │ -234 std::declval())> > \ │ │ │ │ │ -235 AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ -236 { \ │ │ │ │ │ -237 value_ OP u; \ │ │ │ │ │ -238 return *this; \ │ │ │ │ │ -239 } \ │ │ │ │ │ -240 \ │ │ │ │ │ -241 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -242 │ │ │ │ │ -_2_4_3 _D_U_N_E___A_S_S_I_G_N___O_P(+=); │ │ │ │ │ -_2_4_4 _D_U_N_E___A_S_S_I_G_N___O_P(-=); │ │ │ │ │ -245 │ │ │ │ │ -_2_4_6 _D_U_N_E___A_S_S_I_G_N___O_P(*=); │ │ │ │ │ -247 _D_U_N_E___A_S_S_I_G_N___O_P(/=); │ │ │ │ │ -248 _D_U_N_E___A_S_S_I_G_N___O_P(%=); │ │ │ │ │ -249 │ │ │ │ │ -_2_5_0 _D_U_N_E___A_S_S_I_G_N___O_P(^=); │ │ │ │ │ -251 _D_U_N_E___A_S_S_I_G_N___O_P(&=); │ │ │ │ │ -252 _D_U_N_E___A_S_S_I_G_N___O_P(|=); │ │ │ │ │ -253 │ │ │ │ │ -_2_5_4 _D_U_N_E___A_S_S_I_G_N___O_P(<<=); │ │ │ │ │ -_2_5_5 _D_U_N_E___A_S_S_I_G_N___O_P(>>=); │ │ │ │ │ +_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#undef DUNE_ASSIGN_OP │ │ │ │ │ -258 }; │ │ │ │ │ -259 │ │ │ │ │ -260 // binary operators │ │ │ │ │ -_2_6_1#define DUNE_BINARY_OP(OP) \ │ │ │ │ │ -262 template() \ │ │ │ │ │ -264 OP std::declval())> > \ │ │ │ │ │ -265 decltype(auto) \ │ │ │ │ │ -266 operator OP(const AlignedNumber &t, \ │ │ │ │ │ -267 const AlignedNumber &u) \ │ │ │ │ │ -268 { \ │ │ │ │ │ -269 /* can't use std::max(); not constexpr */ \ │ │ │ │ │ -270 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \ │ │ │ │ │ -271 } \ │ │ │ │ │ -272 \ │ │ │ │ │ -273 template() \ │ │ │ │ │ -275 OP std::declval())> > \ │ │ │ │ │ -276 decltype(auto) \ │ │ │ │ │ -277 operator OP(const T &t, const AlignedNumber &u) \ │ │ │ │ │ -278 { \ │ │ │ │ │ -279 return aligned(t OP U(u)); \ │ │ │ │ │ -280 } \ │ │ │ │ │ -281 \ │ │ │ │ │ -282 template() \ │ │ │ │ │ -284 OP std::declval())> > \ │ │ │ │ │ -285 decltype(auto) \ │ │ │ │ │ -286 operator OP(const AlignedNumber &t, const U &u) \ │ │ │ │ │ -287 { \ │ │ │ │ │ -288 return aligned(T(t) OP u); \ │ │ │ │ │ -289 } \ │ │ │ │ │ -290 \ │ │ │ │ │ -291 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -292 │ │ │ │ │ -_2_9_3 _D_U_N_E___B_I_N_A_R_Y___O_P(+); │ │ │ │ │ -_2_9_4 _D_U_N_E___B_I_N_A_R_Y___O_P(-); │ │ │ │ │ -295 │ │ │ │ │ -_2_9_6 _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(/); │ │ │ │ │ -298 _D_U_N_E___B_I_N_A_R_Y___O_P(%); │ │ │ │ │ -299 │ │ │ │ │ -_3_0_0 _D_U_N_E___B_I_N_A_R_Y___O_P(^); │ │ │ │ │ -301 _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(|); │ │ │ │ │ +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_4 _D_U_N_E___B_I_N_A_R_Y___O_P(<<); │ │ │ │ │ -_3_0_5 _D_U_N_E___B_I_N_A_R_Y___O_P(>>); │ │ │ │ │ -306 │ │ │ │ │ -_3_0_7 _D_U_N_E___B_I_N_A_R_Y___O_P(==); │ │ │ │ │ -_3_0_8 _D_U_N_E___B_I_N_A_R_Y___O_P(!=); │ │ │ │ │ -309 _D_U_N_E___B_I_N_A_R_Y___O_P(<); │ │ │ │ │ -310 _D_U_N_E___B_I_N_A_R_Y___O_P(>); │ │ │ │ │ -_3_1_1 _D_U_N_E___B_I_N_A_R_Y___O_P(<=); │ │ │ │ │ -_3_1_2 _D_U_N_E___B_I_N_A_R_Y___O_P(>=); │ │ │ │ │ -313 │ │ │ │ │ -_3_1_4 _D_U_N_E___B_I_N_A_R_Y___O_P(&&); │ │ │ │ │ -315 _D_U_N_E___B_I_N_A_R_Y___O_P(||); │ │ │ │ │ -316 │ │ │ │ │ -317#undef DUNE_BINARY_OP │ │ │ │ │ +_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 │ │ │ │ │ -320 // │ │ │ │ │ -321 // Overloads for the functions provided by the standard library │ │ │ │ │ -322 // │ │ │ │ │ -323#define DUNE_UNARY_FUNC(name) \ │ │ │ │ │ -324 template \ │ │ │ │ │ -325 decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ -326 { \ │ │ │ │ │ -327 using std::name; \ │ │ │ │ │ -328 return aligned(name(T(u))); \ │ │ │ │ │ -329 } \ │ │ │ │ │ -330 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -331 │ │ │ │ │ -332 // │ │ │ │ │ -333 // functions │ │ │ │ │ -334 // │ │ │ │ │ -335 │ │ │ │ │ -336 // note: only unary functions are provided at the moment. Getting all the │ │ │ │ │ -337 // overloads right for functions with more than one argument is tricky. │ │ │ │ │ -338 // All functions appear in the list below in the order they are │ │ │ │ │ -339 // listed in in the standard, but the unimplemented ones are commented │ │ │ │ │ -340 // out. │ │ │ │ │ -341 │ │ │ │ │ -342 // note: abs is provided by both (for integer) and (for │ │ │ │ │ -343 // floating point). This overload works for both. │ │ │ │ │ -344 _D_U_N_E___U_N_A_R_Y___F_U_N_C(abs); │ │ │ │ │ -_3_4_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acos); │ │ │ │ │ -_3_4_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(acosh); │ │ │ │ │ -_3_4_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asin); │ │ │ │ │ -_3_4_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(asinh); │ │ │ │ │ -_3_4_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atan); │ │ │ │ │ -350 // atan2 │ │ │ │ │ -_3_5_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(atanh); │ │ │ │ │ -_3_5_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cbrt); │ │ │ │ │ -_3_5_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(ceil); │ │ │ │ │ -354 // copysign │ │ │ │ │ -_3_5_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cos); │ │ │ │ │ -_3_5_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(cosh); │ │ │ │ │ -_3_5_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erf); │ │ │ │ │ -_3_5_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(erfc); │ │ │ │ │ -_3_5_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(exp); │ │ │ │ │ -_3_6_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(exp2); │ │ │ │ │ -_3_6_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(expm1); │ │ │ │ │ -_3_6_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(fabs); │ │ │ │ │ -363 // fdim │ │ │ │ │ -_3_6_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(floor); │ │ │ │ │ -365 // fma │ │ │ │ │ -366 // fmax │ │ │ │ │ -367 // fmin │ │ │ │ │ -368 // fmod │ │ │ │ │ -369 // frexp │ │ │ │ │ -370 // hypos │ │ │ │ │ -_3_7_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(ilogb); │ │ │ │ │ -372 // ldexp │ │ │ │ │ -_3_7_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lgamma); │ │ │ │ │ -_3_7_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(llrint); │ │ │ │ │ -_3_7_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(llround); │ │ │ │ │ -_3_7_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log); │ │ │ │ │ -_3_7_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log10); │ │ │ │ │ -_3_7_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log1p); │ │ │ │ │ -_3_7_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(log2); │ │ │ │ │ -_3_8_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(logb); │ │ │ │ │ -_3_8_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lrint); │ │ │ │ │ -_3_8_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(lround); │ │ │ │ │ -383 // modf │ │ │ │ │ -_3_8_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(nearbyint); │ │ │ │ │ -385 // nextafter │ │ │ │ │ -386 // nexttoward │ │ │ │ │ -387 // pow │ │ │ │ │ -388 // remainder │ │ │ │ │ -389 // remquo │ │ │ │ │ -_3_9_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(rint); │ │ │ │ │ -_3_9_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(round); │ │ │ │ │ -392 // scalbln │ │ │ │ │ -393 // scalbn │ │ │ │ │ -_3_9_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sin); │ │ │ │ │ -_3_9_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sinh); │ │ │ │ │ -_3_9_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(sqrt); │ │ │ │ │ -_3_9_7 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tan); │ │ │ │ │ -_3_9_8 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tanh); │ │ │ │ │ -_3_9_9 _D_U_N_E___U_N_A_R_Y___F_U_N_C(tgamma); │ │ │ │ │ -_4_0_0 _D_U_N_E___U_N_A_R_Y___F_U_N_C(trunc); │ │ │ │ │ -401 │ │ │ │ │ -_4_0_2 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isfinite); │ │ │ │ │ -_4_0_3 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isinf); │ │ │ │ │ -_4_0_4 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isnan); │ │ │ │ │ -_4_0_5 _D_U_N_E___U_N_A_R_Y___F_U_N_C(isnormal); │ │ │ │ │ -_4_0_6 _D_U_N_E___U_N_A_R_Y___F_U_N_C(signbit); │ │ │ │ │ -407 │ │ │ │ │ -408 // isgreater │ │ │ │ │ -409 // isgreaterequal │ │ │ │ │ -410 // isless │ │ │ │ │ -411 // islessequal │ │ │ │ │ -412 // islessgreater │ │ │ │ │ -413 // isunordered │ │ │ │ │ -414 │ │ │ │ │ -415 // │ │ │ │ │ -416 // functions │ │ │ │ │ -417 // │ │ │ │ │ -418 │ │ │ │ │ -419 // not all functions are implemented, and unlike for , no │ │ │ │ │ -420 // comprehensive list is provided │ │ │ │ │ -_4_2_1 _D_U_N_E___U_N_A_R_Y___F_U_N_C(real); │ │ │ │ │ -422 │ │ │ │ │ -423#undef DUNE_UNARY_FUNC │ │ │ │ │ -424 │ │ │ │ │ -425 // We need to overload min() and max() since they require types to be │ │ │ │ │ -426 // LessThanComparable, which requires `a in the standard (still open │ │ │ │ │ -430 // as of 2018-07-06), which strives to require both "implicitly" and │ │ │ │ │ -431 // "contextually" convertible -- plus a few other things. │ │ │ │ │ -432 // │ │ │ │ │ -433 // We do not want our debug type to automatically decay to the underlying │ │ │ │ │ -434 // type, so we do not want to make the conversion non-explicit. So the │ │ │ │ │ -435 // only option left is to overload min() and max(). │ │ │ │ │ +_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 template │ │ │ │ │ -_4_3_8 auto max(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, │ │ │ │ │ -439 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -440 { │ │ │ │ │ -441 using std::max; │ │ │ │ │ -442 return aligned(max(T(a), T(b))); │ │ │ │ │ -443 } │ │ │ │ │ -444 │ │ │ │ │ -445 template │ │ │ │ │ -_4_4_6 auto max(const T &a, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -447 { │ │ │ │ │ -448 using std::max; │ │ │ │ │ -449 return aligned(max(a, T(b))); │ │ │ │ │ -450 } │ │ │ │ │ -451 │ │ │ │ │ -452 template │ │ │ │ │ -_4_5_3 auto max(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, const T &b) │ │ │ │ │ -454 { │ │ │ │ │ -455 using std::max; │ │ │ │ │ -456 return aligned(max(T(a), b)); │ │ │ │ │ -457 } │ │ │ │ │ -458 │ │ │ │ │ -459 template │ │ │ │ │ -_4_6_0 auto min(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, │ │ │ │ │ -461 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -462 { │ │ │ │ │ -463 using std::min; │ │ │ │ │ -464 return aligned(min(T(a), T(b))); │ │ │ │ │ -465 } │ │ │ │ │ -466 │ │ │ │ │ -467 template │ │ │ │ │ -_4_6_8 auto min(const T &a, const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &b) │ │ │ │ │ -469 { │ │ │ │ │ -470 using std::min; │ │ │ │ │ -471 return aligned(min(a, T(b))); │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -474 template │ │ │ │ │ -_4_7_5 auto min(const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &a, const T &b) │ │ │ │ │ -476 { │ │ │ │ │ -477 using std::min; │ │ │ │ │ -478 return aligned(min(T(a), b)); │ │ │ │ │ -479 } │ │ │ │ │ -480 │ │ │ │ │ -481 } // namespace AlignedNumberImpl │ │ │ │ │ -482 │ │ │ │ │ -483 // SIMD-like functions from "conditional.hh" │ │ │ │ │ -484 template │ │ │ │ │ -485 AlignedNumber │ │ │ │ │ -_4_8_6 _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, │ │ │ │ │ -487 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) │ │ │ │ │ -488 { │ │ │ │ │ -489 return b ? v1 : v2; │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -492 // SIMD-like functions from "rangeutilities.hh" │ │ │ │ │ -493 template │ │ │ │ │ -_4_9_4 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) │ │ │ │ │ -495 { │ │ │ │ │ -496 return T(val); │ │ │ │ │ -497 } │ │ │ │ │ -498 │ │ │ │ │ -499 template │ │ │ │ │ -_5_0_0 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) │ │ │ │ │ -501 { │ │ │ │ │ -502 return T(val); │ │ │ │ │ -503 } │ │ │ │ │ -504 │ │ │ │ │ -505 template │ │ │ │ │ -_5_0_6 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) │ │ │ │ │ -507 { │ │ │ │ │ -508 return bool(val); │ │ │ │ │ -509 } │ │ │ │ │ -510 │ │ │ │ │ -511 template │ │ │ │ │ -_5_1_2 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) │ │ │ │ │ -513 { │ │ │ │ │ -514 return bool(val); │ │ │ │ │ -515 } │ │ │ │ │ -516 │ │ │ │ │ -517 // SIMD-like functionality from "simd/interface.hh" │ │ │ │ │ -_5_1_8 namespace Simd { │ │ │ │ │ -_5_1_9 namespace Overloads { │ │ │ │ │ -520 │ │ │ │ │ -521 template │ │ │ │ │ -_5_2_2 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; }; │ │ │ │ │ -523 │ │ │ │ │ -524 template │ │ │ │ │ -_5_2_5 struct _R_e_b_i_n_d_T_y_p_e > { │ │ │ │ │ -_5_2_6 using _t_y_p_e = _A_l_i_g_n_e_d_N_u_m_b_e_r_<_U_,_ _a_l_i_g_n_>; │ │ │ │ │ -527 }; │ │ │ │ │ -528 │ │ │ │ │ -529 template │ │ │ │ │ -_5_3_0 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> {}; │ │ │ │ │ -531 │ │ │ │ │ -532 template │ │ │ │ │ -_5_3_3 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) │ │ │ │ │ -534 { │ │ │ │ │ -535 assert(l == 0); │ │ │ │ │ -536 return v._v_a_l_u_e(); │ │ │ │ │ -537 } │ │ │ │ │ -538 │ │ │ │ │ -539 template │ │ │ │ │ -_5_4_0 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) │ │ │ │ │ -541 { │ │ │ │ │ -542 assert(l == 0); │ │ │ │ │ -543 return v._v_a_l_u_e(); │ │ │ │ │ -544 } │ │ │ │ │ -545 │ │ │ │ │ -546 template │ │ │ │ │ -547 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> & │ │ │ │ │ -_5_4_8 _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, │ │ │ │ │ -549 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &ifTrue, │ │ │ │ │ -550 const _A_l_i_g_n_e_d_N_u_m_b_e_r_<_T_,_ _a_l_i_g_n_> &ifFalse) │ │ │ │ │ -551 { │ │ │ │ │ -552 return _m_a_s_k ? ifTrue : ifFalse; │ │ │ │ │ -553 } │ │ │ │ │ -554 │ │ │ │ │ -555 template │ │ │ │ │ -_5_5_6 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) │ │ │ │ │ -557 { │ │ │ │ │ -558 return bool(_m_a_s_k); │ │ │ │ │ -559 } │ │ │ │ │ -560 │ │ │ │ │ -561 } // namespace Overloads │ │ │ │ │ -562 │ │ │ │ │ -563 } // namespace Simd │ │ │ │ │ -564 │ │ │ │ │ -565} // namespace Dune │ │ │ │ │ -566 │ │ │ │ │ -567#endif // DUNE_DEBUGALIGN_HH │ │ │ │ │ -_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ -#define DUNE_BINARY_OP(OP) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:261 │ │ │ │ │ -_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:220 │ │ │ │ │ -_i_n_d_i_c_e_s_._h_h │ │ │ │ │ -_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. │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_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:29 │ │ │ │ │ -_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. │ │ │ │ │ +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_:_:_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:36 │ │ │ │ │ -_D_u_n_e_:_:_a_n_y___t_r_u_e │ │ │ │ │ -bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:506 │ │ │ │ │ -_D_u_n_e_:_:_a_l_l___t_r_u_e │ │ │ │ │ -bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:512 │ │ │ │ │ -_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:97 │ │ │ │ │ -_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:114 │ │ │ │ │ -_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:30 │ │ │ │ │ -_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:494 │ │ │ │ │ -_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:500 │ │ │ │ │ -_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:556 │ │ │ │ │ -_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:533 │ │ │ │ │ -_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_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:128 │ │ │ │ │ -_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:187 │ │ │ │ │ -_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:182 │ │ │ │ │ -_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:179 │ │ │ │ │ -_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:217 │ │ │ │ │ -_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:145 │ │ │ │ │ -_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:144 │ │ │ │ │ -_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:150 │ │ │ │ │ -_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:207 │ │ │ │ │ -_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:133 │ │ │ │ │ -_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: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_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -decltype(auto) operator-() const │ │ │ │ │ -DDeeffiinniittiioonn debugalign.hh:191 │ │ │ │ │ -_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:522 │ │ │ │ │ -_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_:_:_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/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: matvectraits.hh File Reference │ │ │ │ +dune-common: ios_state.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,36 +72,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
matvectraits.hh File Reference
│ │ │ │ +
ios_state.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

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

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::DenseMatVecTraits< T >
class  Dune::ios_base_all_saver
 Utility class for storing and resetting stream attributes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ +

Utility class for storing and resetting stream attributes.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,23 +1,26 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -matvectraits.hh File Reference │ │ │ │ │ -Documentation of the traits classes you need to write for each implementation │ │ │ │ │ -of DenseVector or DenseMatrix. _M_o_r_e_._._. │ │ │ │ │ +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 │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Documentation of the traits classes you need to write for each implementation │ │ │ │ │ -of DenseVector or DenseMatrix. │ │ │ │ │ +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/a00017_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: matvectraits.hh Source File │ │ │ │ +dune-common: ios_state.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,37 +74,55 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
matvectraits.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 © 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
│ │ │ │ +
5#ifndef DUNE_COMMON_IOS_STATE_HH
│ │ │ │ +
6#define DUNE_COMMON_IOS_STATE_HH
│ │ │ │
7
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13
│ │ │ │ -
22
│ │ │ │ -
24
│ │ │ │ -
26
│ │ │ │ -
30 template<class T>
│ │ │ │ - │ │ │ │ -
32
│ │ │ │ -
33} // end namespace Dune
│ │ │ │ -
34
│ │ │ │ -
35#endif // DUNE_FTRAITS_HH
│ │ │ │ +
8#include <ios>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34 {
│ │ │ │ +
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:20
│ │ │ │ +
void restore()
Restore flags now.
Definition ios_state.cc:25
│ │ │ │ +
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
│ │ │ │ -
Definition matvectraits.hh:31
│ │ │ │ +
Utility class for storing and resetting stream attributes.
Definition ios_state.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,34 +1,60 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -matvectraits.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 © 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 │ │ │ │ │ +5#ifndef DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ +6#define DUNE_COMMON_IOS_STATE_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 │ │ │ │ │ +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 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:20 │ │ │ │ │ +_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:25 │ │ │ │ │ +_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_:_:_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_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/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dotproduct.hh File Reference │ │ │ │ +dune-common: interfaces.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,54 +71,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
dotproduct.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
interfaces.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include "ftraits.hh"
│ │ │ │ -#include "typetraits.hh"
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::IsVector< T, class >
 
struct  Dune::IsVector< T, std::void_t< typename T::field_type > >
struct  Dune::Cloneable
 An interface class for cloneable objects. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

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

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 interfaces for detection of specific behavior.

│ │ │ │ +
Author
Robert Kloefkorn
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,48 +1,24 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _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" │ │ │ │ │ +_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_V_e_c_t_o_r_<_ _T_,_ _c_l_a_s_s_ _> │ │ │ │ │ -  │ │ │ │ │ -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_ _>_ _> │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ -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. │ │ │ │ │ -  │ │ │ │ │ ********** 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 interfaces for detection of specific behavior. │ │ │ │ │ Author │ │ │ │ │ - Jö Fahlke, Matthias Wohlmuth │ │ │ │ │ + Robert Kloefkorn │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: interfaces.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,82 +74,42 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
dotproduct.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 © 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_INTERFACES_HH
│ │ │ │ +
6#define DUNE_INTERFACES_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 {};
│ │ │ │ -
│ │ │ │ -
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 }
│ │ │ │ -
│ │ │ │ -
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 }
│ │ │ │ -
79
│ │ │ │ -
87 template<class A, class B>
│ │ │ │ -
88 auto
│ │ │ │ -
│ │ │ │ -
89 dotT(const A & a, const B & b) -> decltype(a*b)
│ │ │ │ -
90 {
│ │ │ │ -
91 return a*b;
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
95} // end namespace DUNE
│ │ │ │ -
96
│ │ │ │ -
97#endif // DUNE_DOTPRODUCT_HH
│ │ │ │ -
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
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:89
│ │ │ │ -
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.
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14
│ │ │ │ +
│ │ │ │ +
16 struct Cloneable {
│ │ │ │ +
17
│ │ │ │ +
23 virtual Cloneable* clone() const = 0;
│ │ │ │ +
24
│ │ │ │ +
26 virtual ~Cloneable() = default;
│ │ │ │ +
27
│ │ │ │ +
28 };
│ │ │ │ +
│ │ │ │ +
29
│ │ │ │ +
30} // end namespace Dune
│ │ │ │ +
31#endif
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Definition dotproduct.hh:27
│ │ │ │ -
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ │ +
An interface class for cloneable objects.
Definition interfaces.hh:16
│ │ │ │ +
virtual ~Cloneable()=default
Destructor.
│ │ │ │ +
virtual Cloneable * clone() const =0
Clones the object clone needs to be redefined by an implementation class, with the return type covari...
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,99 +1,43 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -dotproduct.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 © 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_INTERFACES_HH │ │ │ │ │ +6#define DUNE_INTERFACES_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 {}; │ │ │ │ │ -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 } │ │ │ │ │ -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 } │ │ │ │ │ -79 │ │ │ │ │ -87 template │ │ │ │ │ -88 auto │ │ │ │ │ -_8_9 _d_o_t_T(const A & a, const B & b) -> decltype(a*b) │ │ │ │ │ -90 { │ │ │ │ │ -91 return a*b; │ │ │ │ │ -92 } │ │ │ │ │ -93 │ │ │ │ │ -95} // end namespace DUNE │ │ │ │ │ -96 │ │ │ │ │ -97#endif // DUNE_DOTPRODUCT_HH │ │ │ │ │ -_f_t_r_a_i_t_s_._h_h │ │ │ │ │ -Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -_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:89 │ │ │ │ │ -_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. │ │ │ │ │ +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() = default; │ │ │ │ │ +27 │ │ │ │ │ +28 }; │ │ │ │ │ +29 │ │ │ │ │ +30} // end namespace Dune │ │ │ │ │ +31#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_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()=default │ │ │ │ │ +Destructor. │ │ │ │ │ +_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/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrix.hh File Reference │ │ │ │ +dune-common: assertandreturn.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,106 +70,28 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Macros
│ │ │ │ +
assertandreturn.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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

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

Go to the source code of this file.

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

│ │ │ │ -Classes

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

│ │ │ │ -Namespaces

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

│ │ │ │ -Functions

template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
 invert scalar without changing the original matrix
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
 invert scalar without changing the original matrix
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
 invert 2x2 Matrix without changing the original matrix
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
 invert 3x3 Matrix without changing the original matrix
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
 invert 3x3 Matrix without changing the original matrix
 
template<class K , int m, int n, int p>
static void Dune::FMatrixHelp::multMatrix (const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
 calculates ret = A * B
 
template<typename K , int rows, int cols>
static void Dune::FMatrixHelp::multTransposedMatrix (const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
 calculates ret= A_t*A
 
template<typename K , int rows, int cols>
static void Dune::FMatrixHelp::multAssignTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
 calculates ret = matrix^T * x
 
template<typename K , int rows, int cols>
static FieldVector< K, rows > Dune::FMatrixHelp::mult (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
 calculates ret = matrix * x
 
template<typename K , int rows, int cols>
static FieldVector< K, cols > Dune::FMatrixHelp::multTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
 calculates ret = matrix^T * x
 

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

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,117 +1,17 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -fmatrix.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 │ │ │ │ │ -compile-time given number 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_/_d_e_n_s_e_m_a_t_r_i_x_._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_/_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> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_r_i_x_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include "_f_m_a_t_r_i_x_e_v_._h_h" │ │ │ │ │ +_M_a_c_r_o_s │ │ │ │ │ +assertandreturn.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_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _> │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _> │ │ │ │ │ -  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_:_:_F_M_a_t_r_i_x_H_e_l_p │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 > &matrix, _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - 1, 1 > &inverse) │ │ │ │ │ -  invert scalar without changing the original │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ - (const _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 > &matrix, │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 > &inverse) │ │ │ │ │ -  invert scalar without changing the original │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 2, 2 > &matrix, _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - 2, 2 > &inverse) │ │ │ │ │ -  invert 2x2 Matrix without changing the original │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ - (const _F_i_e_l_d_M_a_t_r_i_x< K, 2, 2 > &matrix, │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 2, 2 > &inverse) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 3, 3 > &matrix, _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - 3, 3 > &inverse) │ │ │ │ │ -  invert 3x3 Matrix without changing the original │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static K  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ - (const _F_i_e_l_d_M_a_t_r_i_x< K, 3, 3 > &matrix, │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, 3, 3 > &inverse) │ │ │ │ │ -  invert 3x3 Matrix without changing the original │ │ │ │ │ - matrix │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_M_a_t_r_i_x (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &A, const _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - n, p > &B, _F_i_e_l_d_M_a_t_r_i_x< K, m, p > &ret) │ │ │ │ │ -  calculates ret = A * B │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_T_r_a_n_s_p_o_s_e_d_M_a_t_r_i_x (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, rows, cols > &matrix, │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, cols, cols > &ret) │ │ │ │ │ -  calculates ret= A_t*A │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static void  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_A_s_s_i_g_n_T_r_a_n_s_p_o_s_e_d (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, rows, cols > &matrix, const │ │ │ │ │ - _F_i_e_l_d_V_e_c_t_o_r< K, rows > &x, _F_i_e_l_d_V_e_c_t_o_r< K, cols │ │ │ │ │ - > &ret) │ │ │ │ │ -  calculates ret = matrix^T * x │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static _F_i_e_l_d_V_e_c_t_o_r< K, rows >  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t (const _F_i_e_l_d_M_a_t_r_i_x< K, │ │ │ │ │ - rows, cols > &matrix, const _F_i_e_l_d_V_e_c_t_o_r< K, cols │ │ │ │ │ - > &x) │ │ │ │ │ -  calculates ret = matrix * x │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static _F_i_e_l_d_V_e_c_t_o_r< K, cols >  _D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_T_r_a_n_s_p_o_s_e_d (const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, rows, cols > &matrix, const │ │ │ │ │ - _F_i_e_l_d_V_e_c_t_o_r< K, rows > &x) │ │ │ │ │ -  calculates ret = matrix^T * x │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implements a matrix constructed from a given type representing a field and │ │ │ │ │ -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/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrix.hh Source File │ │ │ │ +dune-common: assertandreturn.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,896 +74,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
fmatrix.hh
│ │ │ │ +
assertandreturn.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_FMATRIX_HH
│ │ │ │ -
6#define DUNE_FMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_ASSERTANDRETURN_HH
│ │ │ │ +
6#define DUNE_COMMON_ASSERTANDRETURN_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <algorithm>
│ │ │ │ -
12#include <initializer_list>
│ │ │ │ +
8#ifndef DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN
│ │ │ │ +
9#warning "The file assertandreturn.hh is deprecated. Since c++14 constexpr functions allow more \
│ │ │ │ +
10than a single return statement and thus this utility is useless. Will be removed after \
│ │ │ │ +
11Dune 2.10 release."
│ │ │ │ +
12#endif // DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN
│ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23namespace Dune
│ │ │ │ -
24{
│ │ │ │ -
25
│ │ │ │ -
26 namespace Impl
│ │ │ │ -
27 {
│ │ │ │ -
28
│ │ │ │ -
29 template<class M>
│ │ │ │ -
30 class ColumnVectorView
│ │ │ │ -
31 {
│ │ │ │ -
32 public:
│ │ │ │ +
14#include <cassert>
│ │ │ │ +
15
│ │ │ │ +
17
│ │ │ │ +
26#ifdef NDEBUG
│ │ │ │ +
27 #define DUNE_ASSERT_AND_RETURN(C,X) X
│ │ │ │ +
28#else
│ │ │ │ +
29 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
│ │ │ │ +
30#endif
│ │ │ │ +
31
│ │ │ │ +
32
│ │ │ │
33
│ │ │ │ -
34 using value_type = typename M::value_type;
│ │ │ │ -
35 using size_type = typename M::size_type;
│ │ │ │ -
36
│ │ │ │ -
37 constexpr ColumnVectorView(M& matrix, size_type col) :
│ │ │ │ -
38 matrix_(matrix),
│ │ │ │ -
39 col_(col)
│ │ │ │ -
40 {}
│ │ │ │ -
41
│ │ │ │ -
42 constexpr size_type N () const {
│ │ │ │ -
43 return matrix_.N();
│ │ │ │ -
44 }
│ │ │ │ -
45
│ │ │ │ -
46 template<class M_ = M,
│ │ │ │ -
47 std::enable_if_t<std::is_same_v<M_,M> and not std::is_const_v<M_>, int> = 0>
│ │ │ │ -
48 constexpr value_type& operator[] (size_type row) {
│ │ │ │ -
49 return matrix_[row][col_];
│ │ │ │ -
50 }
│ │ │ │ -
51
│ │ │ │ -
52 constexpr const value_type& operator[] (size_type row) const {
│ │ │ │ -
53 return matrix_[row][col_];
│ │ │ │ -
54 }
│ │ │ │ -
55
│ │ │ │ -
56 protected:
│ │ │ │ -
57 M& matrix_;
│ │ │ │ -
58 const size_type col_;
│ │ │ │ -
59 };
│ │ │ │ -
60
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
63 template<typename M>
│ │ │ │ -
64 struct FieldTraits< Impl::ColumnVectorView<M> >
│ │ │ │ -
65 {
│ │ │ │ - │ │ │ │ -
67 using real_type = typename FieldTraits<M>::real_type;
│ │ │ │ -
68 };
│ │ │ │ -
69
│ │ │ │ -
81 template< class K, int ROWS, int COLS = ROWS > class FieldMatrix;
│ │ │ │ -
82
│ │ │ │ -
83
│ │ │ │ -
84 template< class K, int ROWS, int COLS >
│ │ │ │ -
│ │ │ │ -
85 struct DenseMatVecTraits< FieldMatrix<K,ROWS,COLS> >
│ │ │ │ -
86 {
│ │ │ │ - │ │ │ │ -
88
│ │ │ │ -
89 // each row is implemented by a field vector
│ │ │ │ - │ │ │ │ -
91
│ │ │ │ - │ │ │ │ - │ │ │ │ -
94
│ │ │ │ -
95 typedef std::array<row_type,ROWS> container_type;
│ │ │ │ -
96 typedef K value_type;
│ │ │ │ -
97 typedef typename container_type::size_type size_type;
│ │ │ │ -
98 };
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
100 template< class K, int ROWS, int COLS >
│ │ │ │ -
│ │ │ │ -
101 struct FieldTraits< FieldMatrix<K,ROWS,COLS> >
│ │ │ │ -
102 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
105 };
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
115 template<class K, int ROWS, int COLS>
│ │ │ │ -
│ │ │ │ -
116 class FieldMatrix : public DenseMatrix< FieldMatrix<K,ROWS,COLS> >
│ │ │ │ -
117 {
│ │ │ │ -
118 std::array< FieldVector<K,COLS>, ROWS > _data;
│ │ │ │ - │ │ │ │ -
120 public:
│ │ │ │ -
121
│ │ │ │ -
123 constexpr static int rows = ROWS;
│ │ │ │ -
125 constexpr static int cols = COLS;
│ │ │ │ -
126
│ │ │ │ -
127 typedef typename Base::size_type size_type;
│ │ │ │ -
128 typedef typename Base::row_type row_type;
│ │ │ │ -
129
│ │ │ │ - │ │ │ │ - │ │ │ │ -
132
│ │ │ │ -
133 //===== constructors
│ │ │ │ -
136 constexpr FieldMatrix() = default;
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ -
140 constexpr FieldMatrix(std::initializer_list<Dune::FieldVector<K, cols> > const &l) {
│ │ │ │ -
141 assert(l.size() == rows); // Actually, this is not needed any more!
│ │ │ │ -
142 for(std::size_t i=0; i<std::min(static_cast<std::size_t>(ROWS), l.size()); ++i)
│ │ │ │ -
143 _data[i] = std::data(l)[i];
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
145
│ │ │ │ -
146 template <class T,
│ │ │ │ -
147 typename = std::enable_if_t<HasDenseMatrixAssigner<FieldMatrix, T>::value>>
│ │ │ │ -
│ │ │ │ -
148 FieldMatrix(T const& rhs)
│ │ │ │ -
149 {
│ │ │ │ -
150 *this = rhs;
│ │ │ │ -
151 }
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
153 using Base::operator=;
│ │ │ │ -
154
│ │ │ │ - │ │ │ │ -
157
│ │ │ │ -
159 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
161 {
│ │ │ │ -
162 _data = x._data;
│ │ │ │ -
163 return *this;
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
167 template <typename T, int rows, int cols>
│ │ │ │ - │ │ │ │ -
169
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
172 {
│ │ │ │ - │ │ │ │ -
174 for( int i = 0; i < ROWS; ++i )
│ │ │ │ -
175 for( int j = 0; j < COLS; ++j )
│ │ │ │ -
176 AT[j][i] = (*this)[i][j];
│ │ │ │ -
177 return AT;
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
181 template <class OtherScalar>
│ │ │ │ -
│ │ │ │ -
182 friend auto operator+ ( const FieldMatrix& matrixA,
│ │ │ │ - │ │ │ │ -
184 {
│ │ │ │ - │ │ │ │ -
186
│ │ │ │ -
187 for (size_type i = 0; i < ROWS; ++i)
│ │ │ │ -
188 for (size_type j = 0; j < COLS; ++j)
│ │ │ │ -
189 result[i][j] = matrixA[i][j] + matrixB[i][j];
│ │ │ │ -
190
│ │ │ │ -
191 return result;
│ │ │ │ -
192 }
│ │ │ │ -
│ │ │ │ -
193
│ │ │ │ -
195 template <class OtherScalar>
│ │ │ │ -
│ │ │ │ -
196 friend auto operator- ( const FieldMatrix& matrixA,
│ │ │ │ - │ │ │ │ -
198 {
│ │ │ │ - │ │ │ │ -
200
│ │ │ │ -
201 for (size_type i = 0; i < ROWS; ++i)
│ │ │ │ -
202 for (size_type j = 0; j < COLS; ++j)
│ │ │ │ -
203 result[i][j] = matrixA[i][j] - matrixB[i][j];
│ │ │ │ -
204
│ │ │ │ -
205 return result;
│ │ │ │ -
206 }
│ │ │ │ -
│ │ │ │ -
207
│ │ │ │ -
209 template <class Scalar,
│ │ │ │ -
210 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
211 friend auto operator* ( const FieldMatrix& matrix, Scalar scalar)
│ │ │ │ -
212 {
│ │ │ │ - │ │ │ │ -
214
│ │ │ │ -
215 for (size_type i = 0; i < ROWS; ++i)
│ │ │ │ -
216 for (size_type j = 0; j < COLS; ++j)
│ │ │ │ -
217 result[i][j] = matrix[i][j] * scalar;
│ │ │ │ -
218
│ │ │ │ -
219 return result;
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
223 template <class Scalar,
│ │ │ │ -
224 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
225 friend auto operator* ( Scalar scalar, const FieldMatrix& matrix)
│ │ │ │ -
226 {
│ │ │ │ - │ │ │ │ -
228
│ │ │ │ -
229 for (size_type i = 0; i < ROWS; ++i)
│ │ │ │ -
230 for (size_type j = 0; j < COLS; ++j)
│ │ │ │ -
231 result[i][j] = scalar * matrix[i][j];
│ │ │ │ -
232
│ │ │ │ -
233 return result;
│ │ │ │ -
234 }
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
237 template <class Scalar,
│ │ │ │ -
238 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
239 friend auto operator/ ( const FieldMatrix& matrix, Scalar scalar)
│ │ │ │ -
240 {
│ │ │ │ - │ │ │ │ -
242
│ │ │ │ -
243 for (size_type i = 0; i < ROWS; ++i)
│ │ │ │ -
244 for (size_type j = 0; j < COLS; ++j)
│ │ │ │ -
245 result[i][j] = matrix[i][j] / scalar;
│ │ │ │ -
246
│ │ │ │ -
247 return result;
│ │ │ │ -
248 }
│ │ │ │ -
│ │ │ │ -
249
│ │ │ │ -
252 template <class OtherScalar, int otherCols>
│ │ │ │ -
│ │ │ │ -
253 friend auto operator* ( const FieldMatrix& matrixA,
│ │ │ │ - │ │ │ │ -
255 {
│ │ │ │ - │ │ │ │ -
257
│ │ │ │ -
258 for (size_type i = 0; i < matrixA.mat_rows(); ++i)
│ │ │ │ -
259 for (size_type j = 0; j < matrixB.mat_cols(); ++j)
│ │ │ │ -
260 {
│ │ │ │ -
261 result[i][j] = 0;
│ │ │ │ -
262 for (size_type k = 0; k < matrixA.mat_cols(); ++k)
│ │ │ │ -
263 result[i][j] += matrixA[i][k] * matrixB[k][j];
│ │ │ │ -
264 }
│ │ │ │ -
265
│ │ │ │ -
266 return result;
│ │ │ │ -
267 }
│ │ │ │ -
│ │ │ │ -
268
│ │ │ │ -
275 template <class OtherMatrix, std::enable_if_t<
│ │ │ │ -
276 Impl::IsStaticSizeMatrix_v<OtherMatrix>
│ │ │ │ -
277 and not Impl::IsFieldMatrix_v<OtherMatrix>
│ │ │ │ -
278 , int> = 0>
│ │ │ │ -
│ │ │ │ -
279 friend auto operator* ( const FieldMatrix& matrixA,
│ │ │ │ -
280 const OtherMatrix& matrixB)
│ │ │ │ -
281 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
284 for (std::size_t j=0; j<rows; ++j)
│ │ │ │ -
285 matrixB.mtv(matrixA[j], result[j]);
│ │ │ │ -
286 return result;
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
295 template <class OtherMatrix, std::enable_if_t<
│ │ │ │ -
296 Impl::IsStaticSizeMatrix_v<OtherMatrix>
│ │ │ │ -
297 and not Impl::IsFieldMatrix_v<OtherMatrix>
│ │ │ │ -
298 , int> = 0>
│ │ │ │ -
│ │ │ │ -
299 friend auto operator* ( const OtherMatrix& matrixA,
│ │ │ │ -
300 const FieldMatrix& matrixB)
│ │ │ │ -
301 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
304 for (std::size_t j=0; j<cols; ++j)
│ │ │ │ -
305 {
│ │ │ │ -
306 auto B_j = Impl::ColumnVectorView(matrixB, j);
│ │ │ │ -
307 auto result_j = Impl::ColumnVectorView(result, j);
│ │ │ │ -
308 matrixA.mv(B_j, result_j);
│ │ │ │ -
309 }
│ │ │ │ -
310 return result;
│ │ │ │ -
311 }
│ │ │ │ -
│ │ │ │ -
312
│ │ │ │ -
314 template<int l>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
316 {
│ │ │ │ - │ │ │ │ -
318
│ │ │ │ -
319 for (size_type i=0; i<l; i++) {
│ │ │ │ -
320 for (size_type j=0; j<cols; j++) {
│ │ │ │ -
321 C[i][j] = 0;
│ │ │ │ -
322 for (size_type k=0; k<rows; k++)
│ │ │ │ -
323 C[i][j] += M[i][k]*(*this)[k][j];
│ │ │ │ -
324 }
│ │ │ │ -
325 }
│ │ │ │ -
326 return C;
│ │ │ │ -
327 }
│ │ │ │ -
│ │ │ │ -
328
│ │ │ │ - │ │ │ │ -
330
│ │ │ │ -
332 template <int r, int c>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
334 {
│ │ │ │ -
335 static_assert(r == c, "Cannot rightmultiply with non-square matrix");
│ │ │ │ -
336 static_assert(r == cols, "Size mismatch");
│ │ │ │ - │ │ │ │ -
338
│ │ │ │ -
339 for (size_type i=0; i<rows; i++)
│ │ │ │ -
340 for (size_type j=0; j<cols; j++) {
│ │ │ │ -
341 (*this)[i][j] = 0;
│ │ │ │ -
342 for (size_type k=0; k<cols; k++)
│ │ │ │ -
343 (*this)[i][j] += C[i][k]*M[k][j];
│ │ │ │ -
344 }
│ │ │ │ -
345 return *this;
│ │ │ │ -
346 }
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ -
349 template<int l>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
351 {
│ │ │ │ - │ │ │ │ -
353
│ │ │ │ -
354 for (size_type i=0; i<rows; i++) {
│ │ │ │ -
355 for (size_type j=0; j<l; j++) {
│ │ │ │ -
356 C[i][j] = 0;
│ │ │ │ -
357 for (size_type k=0; k<cols; k++)
│ │ │ │ -
358 C[i][j] += (*this)[i][k]*M[k][j];
│ │ │ │ -
359 }
│ │ │ │ -
360 }
│ │ │ │ -
361 return C;
│ │ │ │ -
362 }
│ │ │ │ -
│ │ │ │ -
363
│ │ │ │ -
364 // make this thing a matrix
│ │ │ │ -
365 static constexpr size_type mat_rows() { return ROWS; }
│ │ │ │ -
366 static constexpr size_type mat_cols() { return COLS; }
│ │ │ │ -
367
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
369 {
│ │ │ │ -
370 DUNE_ASSERT_BOUNDS(i < ROWS);
│ │ │ │ -
371 return _data[i];
│ │ │ │ -
372 }
│ │ │ │ -
│ │ │ │ -
373
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
375 {
│ │ │ │ -
376 DUNE_ASSERT_BOUNDS(i < ROWS);
│ │ │ │ -
377 return _data[i];
│ │ │ │ -
378 }
│ │ │ │ -
│ │ │ │ -
379 };
│ │ │ │ -
│ │ │ │ -
380
│ │ │ │ -
381#ifndef DOXYGEN // hide specialization
│ │ │ │ -
384 template<class K>
│ │ │ │ -
385 class FieldMatrix<K,1,1> : public DenseMatrix< FieldMatrix<K,1,1> >
│ │ │ │ -
386 {
│ │ │ │ -
387 FieldVector<K,1> _data;
│ │ │ │ -
388 typedef DenseMatrix< FieldMatrix<K,1,1> > Base;
│ │ │ │ -
389 public:
│ │ │ │ -
390 // standard constructor and everything is sufficient ...
│ │ │ │ -
391
│ │ │ │ -
392 //===== type definitions and constants
│ │ │ │ -
393
│ │ │ │ -
395 typedef typename Base::size_type size_type;
│ │ │ │ -
396
│ │ │ │ -
399 constexpr static int blocklevel = 1;
│ │ │ │ -
400
│ │ │ │ -
401 typedef typename Base::row_type row_type;
│ │ │ │ -
402
│ │ │ │ -
403 typedef typename Base::row_reference row_reference;
│ │ │ │ - │ │ │ │ -
405
│ │ │ │ -
408 constexpr static int rows = 1;
│ │ │ │ -
411 constexpr static int cols = 1;
│ │ │ │ -
412
│ │ │ │ -
413 //===== constructors
│ │ │ │ -
416 constexpr FieldMatrix() = default;
│ │ │ │ -
417
│ │ │ │ -
420 FieldMatrix(std::initializer_list<Dune::FieldVector<K, 1>> const &l)
│ │ │ │ -
421 {
│ │ │ │ -
422 std::copy_n(l.begin(), std::min(static_cast< std::size_t >( 1 ), l.size()), &_data);
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ -
425 template <class T,
│ │ │ │ -
426 typename = std::enable_if_t<HasDenseMatrixAssigner<FieldMatrix, T>::value>>
│ │ │ │ -
427 FieldMatrix(T const& rhs)
│ │ │ │ -
428 {
│ │ │ │ -
429 *this = rhs;
│ │ │ │ -
430 }
│ │ │ │ -
431
│ │ │ │ -
432 using Base::operator=;
│ │ │ │ -
433
│ │ │ │ -
435 FieldMatrix<K, 1, 1> transposed() const
│ │ │ │ -
436 {
│ │ │ │ -
437 return *this;
│ │ │ │ -
438 }
│ │ │ │ -
439
│ │ │ │ -
441 template <class OtherScalar>
│ │ │ │ -
442 friend auto operator+ ( const FieldMatrix& matrixA,
│ │ │ │ -
443 const FieldMatrix<OtherScalar,1,1>& matrixB)
│ │ │ │ -
444 {
│ │ │ │ -
445 return FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,1>{matrixA[0][0] + matrixB[0][0]};
│ │ │ │ -
446 }
│ │ │ │ -
447
│ │ │ │ -
449 template <class Scalar,
│ │ │ │ -
450 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
451 friend auto operator+ ( const FieldMatrix& matrix,
│ │ │ │ -
452 const Scalar& scalar)
│ │ │ │ -
453 {
│ │ │ │ -
454 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1>{matrix[0][0] + scalar};
│ │ │ │ -
455 }
│ │ │ │ -
456
│ │ │ │ -
458 template <class Scalar,
│ │ │ │ -
459 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
460 friend auto operator+ ( const Scalar& scalar,
│ │ │ │ -
461 const FieldMatrix& matrix)
│ │ │ │ -
462 {
│ │ │ │ -
463 return FieldMatrix<typename PromotionTraits<Scalar,K>::PromotedType,1,1>{scalar + matrix[0][0]};
│ │ │ │ -
464 }
│ │ │ │ -
465
│ │ │ │ -
467 template <class OtherScalar>
│ │ │ │ -
468 friend auto operator- ( const FieldMatrix& matrixA,
│ │ │ │ -
469 const FieldMatrix<OtherScalar,1,1>& matrixB)
│ │ │ │ -
470 {
│ │ │ │ -
471 return FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,1>{matrixA[0][0] - matrixB[0][0]};
│ │ │ │ -
472 }
│ │ │ │ -
473
│ │ │ │ -
475 template <class Scalar,
│ │ │ │ -
476 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
477 friend auto operator- ( const FieldMatrix& matrix,
│ │ │ │ -
478 const Scalar& scalar)
│ │ │ │ -
479 {
│ │ │ │ -
480 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1>{matrix[0][0] - scalar};
│ │ │ │ -
481 }
│ │ │ │ -
482
│ │ │ │ -
484 template <class Scalar,
│ │ │ │ -
485 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
486 friend auto operator- ( const Scalar& scalar,
│ │ │ │ -
487 const FieldMatrix& matrix)
│ │ │ │ -
488 {
│ │ │ │ -
489 return FieldMatrix<typename PromotionTraits<Scalar,K>::PromotedType,1,1>{scalar - matrix[0][0]};
│ │ │ │ -
490 }
│ │ │ │ -
491
│ │ │ │ -
493 template <class Scalar,
│ │ │ │ -
494 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
495 friend auto operator* ( const FieldMatrix& matrix, Scalar scalar)
│ │ │ │ -
496 {
│ │ │ │ -
497 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {matrix[0][0] * scalar};
│ │ │ │ -
498 }
│ │ │ │ -
499
│ │ │ │ -
501 template <class Scalar,
│ │ │ │ -
502 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
503 friend auto operator* ( Scalar scalar, const FieldMatrix& matrix)
│ │ │ │ -
504 {
│ │ │ │ -
505 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {scalar * matrix[0][0]};
│ │ │ │ -
506 }
│ │ │ │ -
507
│ │ │ │ -
509 template <class Scalar,
│ │ │ │ -
510 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
511 friend auto operator/ ( const FieldMatrix& matrix, Scalar scalar)
│ │ │ │ -
512 {
│ │ │ │ -
513 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {matrix[0][0] / scalar};
│ │ │ │ -
514 }
│ │ │ │ -
515
│ │ │ │ -
516 //===== solve
│ │ │ │ -
517
│ │ │ │ -
520 template <class OtherScalar, int otherCols>
│ │ │ │ -
521 friend auto operator* ( const FieldMatrix& matrixA,
│ │ │ │ -
522 const FieldMatrix<OtherScalar, 1, otherCols>& matrixB)
│ │ │ │ -
523 {
│ │ │ │ -
524 FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,otherCols> result;
│ │ │ │ -
525
│ │ │ │ -
526 for (size_type j = 0; j < matrixB.mat_cols(); ++j)
│ │ │ │ -
527 result[0][j] = matrixA[0][0] * matrixB[0][j];
│ │ │ │ -
528
│ │ │ │ -
529 return result;
│ │ │ │ -
530 }
│ │ │ │ -
531
│ │ │ │ -
538 template <class OtherMatrix, std::enable_if_t<
│ │ │ │ -
539 Impl::IsStaticSizeMatrix_v<OtherMatrix>
│ │ │ │ -
540 and not Impl::IsFieldMatrix_v<OtherMatrix>
│ │ │ │ -
541 and (OtherMatrix::rows==1)
│ │ │ │ -
542 , int> = 0>
│ │ │ │ -
543 friend auto operator* ( const FieldMatrix& matrixA,
│ │ │ │ -
544 const OtherMatrix& matrixB)
│ │ │ │ -
545 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
548 for (std::size_t j=0; j<rows; ++j)
│ │ │ │ -
549 matrixB.mtv(matrixA[j], result[j]);
│ │ │ │ -
550 return result;
│ │ │ │ -
551 }
│ │ │ │ -
552
│ │ │ │ -
559 template <class OtherMatrix, std::enable_if_t<
│ │ │ │ -
560 Impl::IsStaticSizeMatrix_v<OtherMatrix>
│ │ │ │ -
561 and not Impl::IsFieldMatrix_v<OtherMatrix>
│ │ │ │ -
562 and (OtherMatrix::cols==1)
│ │ │ │ -
563 , int> = 0>
│ │ │ │ -
564 friend auto operator* ( const OtherMatrix& matrixA,
│ │ │ │ -
565 const FieldMatrix& matrixB)
│ │ │ │ -
566 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
569 for (std::size_t j=0; j<cols; ++j)
│ │ │ │ -
570 {
│ │ │ │ -
571 auto B_j = Impl::ColumnVectorView(matrixB, j);
│ │ │ │ -
572 auto result_j = Impl::ColumnVectorView(result, j);
│ │ │ │ -
573 matrixA.mv(B_j, result_j);
│ │ │ │ -
574 }
│ │ │ │ -
575 return result;
│ │ │ │ -
576 }
│ │ │ │ -
577
│ │ │ │ -
579 template<int l>
│ │ │ │ -
580 FieldMatrix<K,l,1> leftmultiplyany (const FieldMatrix<K,l,1>& M) const
│ │ │ │ -
581 {
│ │ │ │ -
582 FieldMatrix<K,l,1> C;
│ │ │ │ -
583 for (size_type j=0; j<l; j++)
│ │ │ │ -
584 C[j][0] = M[j][0]*(*this)[0][0];
│ │ │ │ -
585 return C;
│ │ │ │ -
586 }
│ │ │ │ -
587
│ │ │ │ - │ │ │ │ -
590 {
│ │ │ │ -
591 _data[0] *= M[0][0];
│ │ │ │ -
592 return *this;
│ │ │ │ -
593 }
│ │ │ │ -
594
│ │ │ │ -
596 template<int l>
│ │ │ │ -
597 FieldMatrix<K,1,l> rightmultiplyany (const FieldMatrix<K,1,l>& M) const
│ │ │ │ -
598 {
│ │ │ │ -
599 FieldMatrix<K,1,l> C;
│ │ │ │ -
600
│ │ │ │ -
601 for (size_type j=0; j<l; j++)
│ │ │ │ -
602 C[0][j] = M[0][j]*_data[0];
│ │ │ │ -
603 return C;
│ │ │ │ -
604 }
│ │ │ │ -
605
│ │ │ │ -
606 // make this thing a matrix
│ │ │ │ -
607 static constexpr size_type mat_rows() { return 1; }
│ │ │ │ -
608 static constexpr size_type mat_cols() { return 1; }
│ │ │ │ -
609
│ │ │ │ -
610 row_reference mat_access ([[maybe_unused]] size_type i)
│ │ │ │ -
611 {
│ │ │ │ -
612 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ -
613 return _data;
│ │ │ │ -
614 }
│ │ │ │ -
615
│ │ │ │ -
616 const_row_reference mat_access ([[maybe_unused]] size_type i) const
│ │ │ │ -
617 {
│ │ │ │ -
618 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ -
619 return _data;
│ │ │ │ -
620 }
│ │ │ │ -
621
│ │ │ │ -
623 FieldMatrix& operator+= (const K& k)
│ │ │ │ -
624 {
│ │ │ │ -
625 _data[0] += k;
│ │ │ │ -
626 return (*this);
│ │ │ │ -
627 }
│ │ │ │ -
628
│ │ │ │ -
630 FieldMatrix& operator-= (const K& k)
│ │ │ │ -
631 {
│ │ │ │ -
632 _data[0] -= k;
│ │ │ │ -
633 return (*this);
│ │ │ │ -
634 }
│ │ │ │ -
635
│ │ │ │ -
637 FieldMatrix& operator*= (const K& k)
│ │ │ │ -
638 {
│ │ │ │ -
639 _data[0] *= k;
│ │ │ │ -
640 return (*this);
│ │ │ │ -
641 }
│ │ │ │ -
642
│ │ │ │ -
644 FieldMatrix& operator/= (const K& k)
│ │ │ │ -
645 {
│ │ │ │ -
646 _data[0] /= k;
│ │ │ │ -
647 return (*this);
│ │ │ │ -
648 }
│ │ │ │ -
649
│ │ │ │ -
650 //===== conversion operator
│ │ │ │ -
651
│ │ │ │ -
652 operator const K& () const { return _data[0]; }
│ │ │ │ -
653
│ │ │ │ -
654 };
│ │ │ │ -
655
│ │ │ │ -
657 template<typename K>
│ │ │ │ -
658 std::ostream& operator<< (std::ostream& s, const FieldMatrix<K,1,1>& a)
│ │ │ │ -
659 {
│ │ │ │ -
660 s << a[0][0];
│ │ │ │ -
661 return s;
│ │ │ │ -
662 }
│ │ │ │ -
663
│ │ │ │ -
664#endif // DOXYGEN
│ │ │ │ -
665
│ │ │ │ -
│ │ │ │ -
666 namespace FMatrixHelp {
│ │ │ │ -
667
│ │ │ │ -
669 template <typename K>
│ │ │ │ -
│ │ │ │ -
670 static inline K invertMatrix (const FieldMatrix<K,1,1> &matrix, FieldMatrix<K,1,1> &inverse)
│ │ │ │ -
671 {
│ │ │ │ -
672 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
673 inverse[0][0] = real_type(1.0)/matrix[0][0];
│ │ │ │ -
674 return matrix[0][0];
│ │ │ │ -
675 }
│ │ │ │ -
│ │ │ │ -
676
│ │ │ │ -
678 template <typename K>
│ │ │ │ -
│ │ │ │ -
679 static inline K invertMatrix_retTransposed (const FieldMatrix<K,1,1> &matrix, FieldMatrix<K,1,1> &inverse)
│ │ │ │ -
680 {
│ │ │ │ -
681 return invertMatrix(matrix,inverse);
│ │ │ │ -
682 }
│ │ │ │ -
│ │ │ │ -
683
│ │ │ │ -
684
│ │ │ │ -
686 template <typename K>
│ │ │ │ -
│ │ │ │ -
687 static inline K invertMatrix (const FieldMatrix<K,2,2> &matrix, FieldMatrix<K,2,2> &inverse)
│ │ │ │ -
688 {
│ │ │ │ -
689 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
690 // code generated by maple
│ │ │ │ -
691 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
│ │ │ │ -
692 K det_1 = real_type(1.0)/det;
│ │ │ │ -
693 inverse[0][0] = matrix[1][1] * det_1;
│ │ │ │ -
694 inverse[0][1] = - matrix[0][1] * det_1;
│ │ │ │ -
695 inverse[1][0] = - matrix[1][0] * det_1;
│ │ │ │ -
696 inverse[1][1] = matrix[0][0] * det_1;
│ │ │ │ -
697 return det;
│ │ │ │ -
698 }
│ │ │ │ -
│ │ │ │ -
699
│ │ │ │ -
702 template <typename K>
│ │ │ │ -
│ │ │ │ -
703 static inline K invertMatrix_retTransposed (const FieldMatrix<K,2,2> &matrix, FieldMatrix<K,2,2> &inverse)
│ │ │ │ -
704 {
│ │ │ │ -
705 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
706 // code generated by maple
│ │ │ │ -
707 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
│ │ │ │ -
708 K det_1 = real_type(1.0)/det;
│ │ │ │ -
709 inverse[0][0] = matrix[1][1] * det_1;
│ │ │ │ -
710 inverse[1][0] = - matrix[0][1] * det_1;
│ │ │ │ -
711 inverse[0][1] = - matrix[1][0] * det_1;
│ │ │ │ -
712 inverse[1][1] = matrix[0][0] * det_1;
│ │ │ │ -
713 return det;
│ │ │ │ -
714 }
│ │ │ │ -
│ │ │ │ -
715
│ │ │ │ -
717 template <typename K>
│ │ │ │ -
│ │ │ │ -
718 static inline K invertMatrix (const FieldMatrix<K,3,3> &matrix, FieldMatrix<K,3,3> &inverse)
│ │ │ │ -
719 {
│ │ │ │ -
720 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
721 // code generated by maple
│ │ │ │ -
722 K t4 = matrix[0][0] * matrix[1][1];
│ │ │ │ -
723 K t6 = matrix[0][0] * matrix[1][2];
│ │ │ │ -
724 K t8 = matrix[0][1] * matrix[1][0];
│ │ │ │ -
725 K t10 = matrix[0][2] * matrix[1][0];
│ │ │ │ -
726 K t12 = matrix[0][1] * matrix[2][0];
│ │ │ │ -
727 K t14 = matrix[0][2] * matrix[2][0];
│ │ │ │ -
728
│ │ │ │ -
729 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
│ │ │ │ -
730 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
│ │ │ │ -
731 K t17 = real_type(1.0)/det;
│ │ │ │ -
732
│ │ │ │ -
733 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
│ │ │ │ -
734 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
│ │ │ │ -
735 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
│ │ │ │ -
736 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
│ │ │ │ -
737 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
│ │ │ │ -
738 inverse[1][2] = -(t6-t10) * t17;
│ │ │ │ -
739 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
│ │ │ │ -
740 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
│ │ │ │ -
741 inverse[2][2] = (t4-t8) * t17;
│ │ │ │ -
742
│ │ │ │ -
743 return det;
│ │ │ │ -
744 }
│ │ │ │ -
│ │ │ │ -
745
│ │ │ │ -
747 template <typename K>
│ │ │ │ -
│ │ │ │ -
748 static inline K invertMatrix_retTransposed (const FieldMatrix<K,3,3> &matrix, FieldMatrix<K,3,3> &inverse)
│ │ │ │ -
749 {
│ │ │ │ -
750 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
751 // code generated by maple
│ │ │ │ -
752 K t4 = matrix[0][0] * matrix[1][1];
│ │ │ │ -
753 K t6 = matrix[0][0] * matrix[1][2];
│ │ │ │ -
754 K t8 = matrix[0][1] * matrix[1][0];
│ │ │ │ -
755 K t10 = matrix[0][2] * matrix[1][0];
│ │ │ │ -
756 K t12 = matrix[0][1] * matrix[2][0];
│ │ │ │ -
757 K t14 = matrix[0][2] * matrix[2][0];
│ │ │ │ -
758
│ │ │ │ -
759 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
│ │ │ │ -
760 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
│ │ │ │ -
761 K t17 = real_type(1.0)/det;
│ │ │ │ -
762
│ │ │ │ -
763 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
│ │ │ │ -
764 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
│ │ │ │ -
765 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
│ │ │ │ -
766 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
│ │ │ │ -
767 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
│ │ │ │ -
768 inverse[2][1] = -(t6-t10) * t17;
│ │ │ │ -
769 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
│ │ │ │ -
770 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
│ │ │ │ -
771 inverse[2][2] = (t4-t8) * t17;
│ │ │ │ -
772
│ │ │ │ -
773 return det;
│ │ │ │ -
774 }
│ │ │ │ -
│ │ │ │ -
775
│ │ │ │ -
777 template< class K, int m, int n, int p >
│ │ │ │ -
│ │ │ │ -
778 static inline void multMatrix ( const FieldMatrix< K, m, n > &A,
│ │ │ │ -
779 const FieldMatrix< K, n, p > &B,
│ │ │ │ - │ │ │ │ -
781 {
│ │ │ │ -
782 typedef typename FieldMatrix< K, m, p > :: size_type size_type;
│ │ │ │ -
783
│ │ │ │ -
784 for( size_type i = 0; i < m; ++i )
│ │ │ │ -
785 {
│ │ │ │ -
786 for( size_type j = 0; j < p; ++j )
│ │ │ │ -
787 {
│ │ │ │ -
788 ret[ i ][ j ] = K( 0 );
│ │ │ │ -
789 for( size_type k = 0; k < n; ++k )
│ │ │ │ -
790 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
│ │ │ │ -
791 }
│ │ │ │ -
792 }
│ │ │ │ -
793 }
│ │ │ │ -
│ │ │ │ -
794
│ │ │ │ -
796 template <typename K, int rows, int cols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
798 {
│ │ │ │ -
799 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
│ │ │ │ -
800
│ │ │ │ -
801 for(size_type i=0; i<cols; i++)
│ │ │ │ -
802 for(size_type j=0; j<cols; j++)
│ │ │ │ -
803 {
│ │ │ │ -
804 ret[i][j]=0.0;
│ │ │ │ -
805 for(size_type k=0; k<rows; k++)
│ │ │ │ -
806 ret[i][j]+=matrix[k][i]*matrix[k][j];
│ │ │ │ -
807 }
│ │ │ │ -
808 }
│ │ │ │ -
│ │ │ │ -
809
│ │ │ │ - │ │ │ │ -
811
│ │ │ │ -
813 template <typename K, int rows, int cols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
815 {
│ │ │ │ -
816 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
│ │ │ │ -
817
│ │ │ │ -
818 for(size_type i=0; i<cols; ++i)
│ │ │ │ -
819 {
│ │ │ │ -
820 ret[i] = 0.0;
│ │ │ │ -
821 for(size_type j=0; j<rows; ++j)
│ │ │ │ -
822 ret[i] += matrix[j][i]*x[j];
│ │ │ │ -
823 }
│ │ │ │ -
824 }
│ │ │ │ -
│ │ │ │ -
825
│ │ │ │ -
827 template <typename K, int rows, int cols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
829 {
│ │ │ │ - │ │ │ │ -
831 multAssign(matrix,x,ret);
│ │ │ │ -
832 return ret;
│ │ │ │ -
833 }
│ │ │ │ -
│ │ │ │ -
834
│ │ │ │ -
836 template <typename K, int rows, int cols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
838 {
│ │ │ │ - │ │ │ │ -
840 multAssignTransposed( matrix, x, ret );
│ │ │ │ -
841 return ret;
│ │ │ │ -
842 }
│ │ │ │ -
│ │ │ │ -
843
│ │ │ │ -
844 } // end namespace FMatrixHelp
│ │ │ │ -
│ │ │ │ -
845
│ │ │ │ -
848} // end namespace
│ │ │ │ -
849
│ │ │ │ -
850#include "fmatrixev.hh"
│ │ │ │ -
851#endif
│ │ │ │ - │ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ -
Various precision settings for calculations with FieldMatrix and FieldVector.
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ -
Eigenvalue computations for the FieldMatrix class.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ -
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ -
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition simd/interface.hh:235
│ │ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
calculates ret = matrix * x
Definition densematrix.hh:1169
│ │ │ │ -
static FieldVector< K, cols > multTransposed(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
calculates ret = matrix^T * x
Definition fmatrix.hh:837
│ │ │ │ -
static K invertMatrix_retTransposed(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
invert scalar without changing the original matrix
Definition fmatrix.hh:679
│ │ │ │ -
static void multMatrix(const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
calculates ret = A * B
Definition fmatrix.hh:778
│ │ │ │ -
static K invertMatrix(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
invert scalar without changing the original matrix
Definition fmatrix.hh:670
│ │ │ │ -
static FieldVector< K, rows > mult(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
calculates ret = matrix * x
Definition fmatrix.hh:828
│ │ │ │ -
static void multTransposedMatrix(const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
calculates ret= A_t*A
Definition fmatrix.hh:797
│ │ │ │ -
static void multAssignTransposed(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
calculates ret = matrix^T * x
Definition fmatrix.hh:814
│ │ │ │ -
A dense n x m matrix.
Definition densematrix.hh:140
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition densematrix.hh:387
│ │ │ │ -
constexpr size_type M() const
number of columns
Definition densematrix.hh:703
│ │ │ │ -
FieldMatrix< K, ROWS, COLS > & rightmultiply(const DenseMatrix< M2 > &M)
Multiplies M from the right to this matrix.
Definition densematrix.hh:645
│ │ │ │ -
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
│ │ │ │ -
derived_type & operator-=(const DenseMatrix< Other > &x)
vector space subtraction
Definition densematrix.hh:312
│ │ │ │ -
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition densematrix.hh:178
│ │ │ │ -
Traits::row_type row_type
The type used to represent a row (must fulfill the Dune::DenseVector interface)
Definition densematrix.hh:169
│ │ │ │ -
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
│ │ │ │ -
Traits::row_reference row_reference
The type used to represent a reference to a row (usually row_type &)
Definition densematrix.hh:172
│ │ │ │ -
derived_type & operator+=(const DenseMatrix< Other > &x)
vector space addition
Definition densematrix.hh:289
│ │ │ │ -
A dense n x m matrix.
Definition fmatrix.hh:117
│ │ │ │ -
static constexpr size_type mat_cols()
Definition fmatrix.hh:366
│ │ │ │ -
constexpr FieldMatrix()=default
Default constructor.
│ │ │ │ -
Base::const_row_reference const_row_reference
Definition fmatrix.hh:131
│ │ │ │ -
FieldMatrix & operator=(const FieldMatrix< T, ROWS, COLS > &x)
copy assignment from FieldMatrix over a different field
Definition fmatrix.hh:160
│ │ │ │ -
FieldMatrix< K, rows, l > rightmultiplyany(const FieldMatrix< K, cols, l > &M) const
Multiplies M from the right to this matrix, this matrix is not modified.
Definition fmatrix.hh:350
│ │ │ │ -
Base::row_type row_type
Definition fmatrix.hh:128
│ │ │ │ -
Base::size_type size_type
Definition fmatrix.hh:127
│ │ │ │ -
FieldMatrix< K, l, cols > leftmultiplyany(const FieldMatrix< K, l, rows > &M) const
Multiplies M from the left to this matrix, this matrix is not modified.
Definition fmatrix.hh:315
│ │ │ │ -
FieldMatrix & rightmultiply(const FieldMatrix< K, r, c > &M)
Multiplies M from the right to this matrix.
Definition fmatrix.hh:333
│ │ │ │ -
FieldMatrix(T const &rhs)
Definition fmatrix.hh:148
│ │ │ │ -
friend auto operator*(const FieldMatrix &matrix, Scalar scalar)
vector space multiplication with scalar
Definition fmatrix.hh:211
│ │ │ │ -
FieldMatrix & operator=(FieldMatrix< T, rows, cols > const &)=delete
no copy assignment from FieldMatrix of different size
│ │ │ │ -
Base::row_reference row_reference
Definition fmatrix.hh:130
│ │ │ │ -
constexpr FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > const &l)
Constructor initializing the matrix from a list of vector.
Definition fmatrix.hh:140
│ │ │ │ -
row_reference mat_access(size_type i)
Definition fmatrix.hh:368
│ │ │ │ -
static constexpr int rows
The number of rows.
Definition fmatrix.hh:123
│ │ │ │ -
FieldMatrix< K, COLS, ROWS > transposed() const
Return transposed of the matrix as FieldMatrix.
Definition fmatrix.hh:171
│ │ │ │ -
static constexpr size_type mat_rows()
Definition fmatrix.hh:365
│ │ │ │ -
static constexpr int cols
The number of columns.
Definition fmatrix.hh:125
│ │ │ │ -
friend auto operator/(const FieldMatrix &matrix, Scalar scalar)
vector space division by scalar
Definition fmatrix.hh:239
│ │ │ │ -
friend auto operator+(const FieldMatrix &matrixA, const FieldMatrix< OtherScalar, ROWS, COLS > &matrixB)
vector space addition – two-argument version
Definition fmatrix.hh:182
│ │ │ │ -
FieldMatrix & operator=(const FieldMatrix &)=default
copy assignment operator
│ │ │ │ -
friend auto operator-(const FieldMatrix &matrixA, const FieldMatrix< OtherScalar, ROWS, COLS > &matrixB)
vector space subtraction – two-argument version
Definition fmatrix.hh:196
│ │ │ │ -
const_row_reference mat_access(size_type i) const
Definition fmatrix.hh:374
│ │ │ │ -
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ -
std::array< row_type, ROWS > container_type
Definition fmatrix.hh:95
│ │ │ │ -
FieldMatrix< K, ROWS, COLS > derived_type
Definition fmatrix.hh:87
│ │ │ │ - │ │ │ │ -
const row_type & const_row_reference
Definition fmatrix.hh:93
│ │ │ │ -
FieldVector< K, COLS > row_type
Definition fmatrix.hh:90
│ │ │ │ -
container_type::size_type size_type
Definition fmatrix.hh:97
│ │ │ │ -
row_type & row_reference
Definition fmatrix.hh:92
│ │ │ │ -
FieldTraits< K >::field_type field_type
Definition fmatrix.hh:103
│ │ │ │ -
FieldTraits< K >::real_type real_type
Definition fmatrix.hh:104
│ │ │ │ -
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
│ │ │ │ -
decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
Definition promotiontraits.hh:28
│ │ │ │ +
34#endif // DUNE_COMMON_ASSERTANDRETURN_HH
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1061 +1,39 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -fmatrix.hh │ │ │ │ │ +assertandreturn.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_FMATRIX_HH │ │ │ │ │ -6#define DUNE_FMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_ASSERTANDRETURN_HH │ │ │ │ │ +6#define DUNE_COMMON_ASSERTANDRETURN_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +8#ifndef DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN │ │ │ │ │ +9#warning "The file assertandreturn.hh is deprecated. Since c++14 constexpr │ │ │ │ │ +functions allow more \ │ │ │ │ │ +10than a single return statement and thus this utility is useless. Will be │ │ │ │ │ +removed after \ │ │ │ │ │ +11Dune 2.10 release." │ │ │ │ │ +12#endif // DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN │ │ │ │ │ 13 │ │ │ │ │ -14#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> │ │ │ │ │ -15#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_n_s_e_m_a_t_r_i_x_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_r_e_c_i_s_i_o_n_._h_h> │ │ │ │ │ -19#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> │ │ │ │ │ -20#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_r_i_x_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e │ │ │ │ │ -24{ │ │ │ │ │ -25 │ │ │ │ │ -26 namespace Impl │ │ │ │ │ -27 { │ │ │ │ │ -28 │ │ │ │ │ -29 template │ │ │ │ │ -30 class ColumnVectorView │ │ │ │ │ -31 { │ │ │ │ │ -32 public: │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +17 │ │ │ │ │ +26#ifdef NDEBUG │ │ │ │ │ +27 #define DUNE_ASSERT_AND_RETURN(C,X) X │ │ │ │ │ +28#else │ │ │ │ │ +_2_9 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return │ │ │ │ │ +0;}() : 0), X │ │ │ │ │ +30#endif │ │ │ │ │ +31 │ │ │ │ │ +32 │ │ │ │ │ 33 │ │ │ │ │ -34 using value_type = typename M::value_type; │ │ │ │ │ -35 using size_type = typename M::size_type; │ │ │ │ │ -36 │ │ │ │ │ -37 constexpr ColumnVectorView(M& matrix, size_type col) : │ │ │ │ │ -38 matrix_(matrix), │ │ │ │ │ -39 col_(col) │ │ │ │ │ -40 {} │ │ │ │ │ -41 │ │ │ │ │ -42 constexpr size_type N () const { │ │ │ │ │ -43 return matrix_.N(); │ │ │ │ │ -44 } │ │ │ │ │ -45 │ │ │ │ │ -46 template and not std::is_const_v, int> = 0> │ │ │ │ │ -48 constexpr value_type& operator[] (size_type row) { │ │ │ │ │ -49 return matrix_[row][col_]; │ │ │ │ │ -50 } │ │ │ │ │ -51 │ │ │ │ │ -52 constexpr const value_type& operator[] (size_type row) const { │ │ │ │ │ -53 return matrix_[row][col_]; │ │ │ │ │ -54 } │ │ │ │ │ -55 │ │ │ │ │ -56 protected: │ │ │ │ │ -57 M& matrix_; │ │ │ │ │ -58 const size_type col_; │ │ │ │ │ -59 }; │ │ │ │ │ -60 │ │ │ │ │ -61 } │ │ │ │ │ -62 │ │ │ │ │ -63 template │ │ │ │ │ -64 struct FieldTraits< Impl::ColumnVectorView > │ │ │ │ │ -65 { │ │ │ │ │ -66 using _f_i_e_l_d___t_y_p_e = typename _F_i_e_l_d_T_r_a_i_t_s_<_M_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -67 using _r_e_a_l___t_y_p_e = typename _F_i_e_l_d_T_r_a_i_t_s_<_M_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -68 }; │ │ │ │ │ -69 │ │ │ │ │ -81 template< class K, int ROWS, int COLS = ROWS > class FieldMatrix; │ │ │ │ │ -82 │ │ │ │ │ -83 │ │ │ │ │ -84 template< class K, int ROWS, int COLS > │ │ │ │ │ -_8_5 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s< _F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -86 { │ │ │ │ │ -_8_7 typedef _F_i_e_l_d_M_a_t_r_i_x_<_K_,_R_O_W_S_,_C_O_L_S_> _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ │ -88 │ │ │ │ │ -89 // each row is implemented by a field vector │ │ │ │ │ -_9_0 typedef _F_i_e_l_d_V_e_c_t_o_r_<_K_,_C_O_L_S_> _r_o_w___t_y_p_e; │ │ │ │ │ -91 │ │ │ │ │ -_9_2 typedef _r_o_w___t_y_p_e &_r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_9_3 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; │ │ │ │ │ -94 │ │ │ │ │ -_9_5 typedef std::array _c_o_n_t_a_i_n_e_r___t_y_p_e; │ │ │ │ │ -_9_6 typedef K _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_9_7 typedef typename container_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -98 }; │ │ │ │ │ -99 │ │ │ │ │ -100 template< class K, int ROWS, int COLS > │ │ │ │ │ -_1_0_1 struct _F_i_e_l_d_T_r_a_i_t_s< _F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -102 { │ │ │ │ │ -_1_0_3 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; │ │ │ │ │ -_1_0_4 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; │ │ │ │ │ -105 }; │ │ │ │ │ -106 │ │ │ │ │ -115 template │ │ │ │ │ -_1_1_6 class _F_i_e_l_d_M_a_t_r_i_x : public _D_e_n_s_e_M_a_t_r_i_x< FieldMatrix > │ │ │ │ │ -117 { │ │ │ │ │ -118 std::array< FieldVector, ROWS > _data; │ │ │ │ │ -119 typedef _D_e_n_s_e_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_K_,_R_O_W_S_,_C_O_L_S_> > _B_a_s_e; │ │ │ │ │ -120 public: │ │ │ │ │ -121 │ │ │ │ │ -_1_2_3 constexpr static int _r_o_w_s = ROWS; │ │ │ │ │ -_1_2_5 constexpr static int _c_o_l_s = COLS; │ │ │ │ │ -126 │ │ │ │ │ -_1_2_7 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -_1_2_8 typedef typename _B_a_s_e_:_:_r_o_w___t_y_p_e _r_o_w___t_y_p_e; │ │ │ │ │ -129 │ │ │ │ │ -_1_3_0 typedef typename _B_a_s_e_:_:_r_o_w___r_e_f_e_r_e_n_c_e _r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_1_3_1 typedef typename _B_a_s_e_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e _c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -132 │ │ │ │ │ -133 //===== constructors │ │ │ │ │ -_1_3_6 constexpr _F_i_e_l_d_M_a_t_r_i_x() = default; │ │ │ │ │ -137 │ │ │ │ │ -_1_4_0 constexpr _F_i_e_l_d_M_a_t_r_i_x(std::initializer_list<_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _c_o_l_s_> > │ │ │ │ │ -const &l) { │ │ │ │ │ -141 assert(l.size() == _r_o_w_s); // Actually, this is not needed any more! │ │ │ │ │ -142 for(std::size_t i=0; i(ROWS), l.size()); │ │ │ │ │ -++i) │ │ │ │ │ -143 _data[i] = std::data(l)[i]; │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -146 template ::value>> │ │ │ │ │ -_1_4_8 _F_i_e_l_d_M_a_t_r_i_x(T const& rhs) │ │ │ │ │ -149 { │ │ │ │ │ -150 *this = rhs; │ │ │ │ │ -151 } │ │ │ │ │ -152 │ │ │ │ │ -153 using Base::operator=; │ │ │ │ │ -154 │ │ │ │ │ -_1_5_6 _F_i_e_l_d_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=(const _F_i_e_l_d_M_a_t_r_i_x&) = default; │ │ │ │ │ -157 │ │ │ │ │ -159 template │ │ │ │ │ -_1_6_0 _F_i_e_l_d_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=(const _F_i_e_l_d_M_a_t_r_i_x_<_T_,_ _R_O_W_S_,_ _C_O_L_S_>& x) │ │ │ │ │ -161 { │ │ │ │ │ -162 _data = x._data; │ │ │ │ │ -163 return *this; │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -167 template │ │ │ │ │ -_1_6_8 _F_i_e_l_d_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=(_F_i_e_l_d_M_a_t_r_i_x_<_T_,_r_o_w_s_,_c_o_l_s_> const&) = delete; │ │ │ │ │ -169 │ │ │ │ │ -_1_7_1 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _C_O_L_S_,_ _R_O_W_S_> _t_r_a_n_s_p_o_s_e_d() const │ │ │ │ │ -172 { │ │ │ │ │ -173 _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_K_,_ _C_O_L_S_,_ _R_O_W_S_> AT; │ │ │ │ │ -174 for( int i = 0; i < ROWS; ++i ) │ │ │ │ │ -175 for( int j = 0; j < COLS; ++j ) │ │ │ │ │ -176 AT[j][i] = (*this)[i][j]; │ │ │ │ │ -177 return AT; │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -181 template │ │ │ │ │ -_1_8_2 friend auto _o_p_e_r_a_t_o_r_+_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -183 const _F_i_e_l_d_M_a_t_r_i_x_<_O_t_h_e_r_S_c_a_l_a_r_,_R_O_W_S_,_C_O_L_S_>& matrixB) │ │ │ │ │ -184 { │ │ │ │ │ -185 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_O_t_h_e_r_S_c_a_l_a_r_>_:_: │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,COLS> result; │ │ │ │ │ -186 │ │ │ │ │ -187 for (_s_i_z_e___t_y_p_e i = 0; i < ROWS; ++i) │ │ │ │ │ -188 for (_s_i_z_e___t_y_p_e j = 0; j < COLS; ++j) │ │ │ │ │ -189 result[i][j] = matrixA[i][j] + matrixB[i][j]; │ │ │ │ │ -190 │ │ │ │ │ -191 return result; │ │ │ │ │ -192 } │ │ │ │ │ -193 │ │ │ │ │ -195 template │ │ │ │ │ -_1_9_6 friend auto _o_p_e_r_a_t_o_r_-_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -197 const _F_i_e_l_d_M_a_t_r_i_x_<_O_t_h_e_r_S_c_a_l_a_r_,_R_O_W_S_,_C_O_L_S_>& matrixB) │ │ │ │ │ -198 { │ │ │ │ │ -199 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_O_t_h_e_r_S_c_a_l_a_r_>_:_: │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,COLS> result; │ │ │ │ │ -200 │ │ │ │ │ -201 for (_s_i_z_e___t_y_p_e i = 0; i < ROWS; ++i) │ │ │ │ │ -202 for (_s_i_z_e___t_y_p_e j = 0; j < COLS; ++j) │ │ │ │ │ -203 result[i][j] = matrixA[i][j] - matrixB[i][j]; │ │ │ │ │ -204 │ │ │ │ │ -205 return result; │ │ │ │ │ -206 } │ │ │ │ │ -207 │ │ │ │ │ -209 template ::value, int> = 0> │ │ │ │ │ -_2_1_1 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, Scalar scalar) │ │ │ │ │ -212 { │ │ │ │ │ -213 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,COLS> │ │ │ │ │ -result; │ │ │ │ │ -214 │ │ │ │ │ -215 for (_s_i_z_e___t_y_p_e i = 0; i < ROWS; ++i) │ │ │ │ │ -216 for (_s_i_z_e___t_y_p_e j = 0; j < COLS; ++j) │ │ │ │ │ -217 result[i][j] = matrix[i][j] * scalar; │ │ │ │ │ -218 │ │ │ │ │ -219 return result; │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -223 template ::value, int> = 0> │ │ │ │ │ -_2_2_5 friend auto _o_p_e_r_a_t_o_r_*_ ( Scalar scalar, const _F_i_e_l_d_M_a_t_r_i_x& matrix) │ │ │ │ │ -226 { │ │ │ │ │ -227 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,COLS> │ │ │ │ │ -result; │ │ │ │ │ -228 │ │ │ │ │ -229 for (_s_i_z_e___t_y_p_e i = 0; i < ROWS; ++i) │ │ │ │ │ -230 for (_s_i_z_e___t_y_p_e j = 0; j < COLS; ++j) │ │ │ │ │ -231 result[i][j] = scalar * matrix[i][j]; │ │ │ │ │ -232 │ │ │ │ │ -233 return result; │ │ │ │ │ -234 } │ │ │ │ │ -235 │ │ │ │ │ -237 template ::value, int> = 0> │ │ │ │ │ -_2_3_9 friend auto _o_p_e_r_a_t_o_r_/_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, Scalar scalar) │ │ │ │ │ -240 { │ │ │ │ │ -241 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,COLS> │ │ │ │ │ -result; │ │ │ │ │ -242 │ │ │ │ │ -243 for (_s_i_z_e___t_y_p_e i = 0; i < ROWS; ++i) │ │ │ │ │ -244 for (_s_i_z_e___t_y_p_e j = 0; j < COLS; ++j) │ │ │ │ │ -245 result[i][j] = matrix[i][j] / scalar; │ │ │ │ │ -246 │ │ │ │ │ -247 return result; │ │ │ │ │ -248 } │ │ │ │ │ -249 │ │ │ │ │ -252 template │ │ │ │ │ -_2_5_3 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -254 const _F_i_e_l_d_M_a_t_r_i_x_<_O_t_h_e_r_S_c_a_l_a_r_,_ _C_O_L_S_,_ _o_t_h_e_r_C_o_l_s_>& matrixB) │ │ │ │ │ -255 { │ │ │ │ │ -256 _F_i_e_l_d_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_O_t_h_e_r_S_c_a_l_a_r_>_:_: │ │ │ │ │ -_P_r_o_m_o_t_e_d_T_y_p_e,ROWS,otherCols> result; │ │ │ │ │ -257 │ │ │ │ │ -258 for (_s_i_z_e___t_y_p_e i = 0; i < matrixA._m_a_t___r_o_w_s(); ++i) │ │ │ │ │ -259 for (_s_i_z_e___t_y_p_e j = 0; j < matrixB._m_a_t___c_o_l_s(); ++j) │ │ │ │ │ -260 { │ │ │ │ │ -261 result[i][j] = 0; │ │ │ │ │ -262 for (_s_i_z_e___t_y_p_e k = 0; k < matrixA._m_a_t___c_o_l_s(); ++k) │ │ │ │ │ -263 result[i][j] += matrixA[i][k] * matrixB[k][j]; │ │ │ │ │ -264 } │ │ │ │ │ -265 │ │ │ │ │ -266 return result; │ │ │ │ │ -267 } │ │ │ │ │ -268 │ │ │ │ │ -275 template │ │ │ │ │ -277 and not Impl::IsFieldMatrix_v │ │ │ │ │ -278 , int> = 0> │ │ │ │ │ -_2_7_9 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -280 const OtherMatrix& matrixB) │ │ │ │ │ -281 { │ │ │ │ │ -282 using Field = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_ _t_y_p_e_n_a_m_e_ _O_t_h_e_r_M_a_t_r_i_x_:_: │ │ │ │ │ -_f_i_e_l_d___t_y_p_e_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -283 _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_F_i_e_l_d_,_ _r_o_w_s_ _,_O_t_h_e_r_M_a_t_r_i_x_:_:_c_o_l_s_> result; │ │ │ │ │ -284 for (std::size_t j=0; j<_r_o_w_s; ++j) │ │ │ │ │ -285 matrixB._m_t_v(matrixA[j], result[j]); │ │ │ │ │ -286 return result; │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -295 template │ │ │ │ │ -297 and not Impl::IsFieldMatrix_v │ │ │ │ │ -298 , int> = 0> │ │ │ │ │ -_2_9_9 friend auto _o_p_e_r_a_t_o_r_*_ ( const OtherMatrix& matrixA, │ │ │ │ │ -300 const _F_i_e_l_d_M_a_t_r_i_x& matrixB) │ │ │ │ │ -301 { │ │ │ │ │ -302 using Field = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_ _t_y_p_e_n_a_m_e_ _O_t_h_e_r_M_a_t_r_i_x_:_: │ │ │ │ │ -_f_i_e_l_d___t_y_p_e_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -303 _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_F_i_e_l_d_,_ _O_t_h_e_r_M_a_t_r_i_x_:_:_r_o_w_s_,_ _c_o_l_s_> result; │ │ │ │ │ -304 for (std::size_t j=0; j<_c_o_l_s; ++j) │ │ │ │ │ -305 { │ │ │ │ │ -306 auto B_j = Impl::ColumnVectorView(matrixB, j); │ │ │ │ │ -307 auto result_j = Impl::ColumnVectorView(result, j); │ │ │ │ │ -308 matrixA.mv(B_j, result_j); │ │ │ │ │ -309 } │ │ │ │ │ -310 return result; │ │ │ │ │ -311 } │ │ │ │ │ -312 │ │ │ │ │ -314 template │ │ │ │ │ -_3_1_5 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_l_,_c_o_l_s_> _l_e_f_t_m_u_l_t_i_p_l_y_a_n_y (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_l_,_r_o_w_s_>& _M) │ │ │ │ │ -const │ │ │ │ │ -316 { │ │ │ │ │ -317 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_l_,_c_o_l_s_> C; │ │ │ │ │ -318 │ │ │ │ │ -319 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_3_3 _F_i_e_l_d_M_a_t_r_i_x& _r_i_g_h_t_m_u_l_t_i_p_l_y (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_,_c_>& _M) │ │ │ │ │ -334 { │ │ │ │ │ -335 static_assert(r == c, "Cannot rightmultiply with non-square matrix"); │ │ │ │ │ -336 static_assert(r == _c_o_l_s, "Size mismatch"); │ │ │ │ │ -337 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_c_o_l_s_> C(*this); │ │ │ │ │ -338 │ │ │ │ │ -339 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s; i++) │ │ │ │ │ -340 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s; j++) { │ │ │ │ │ -341 (*this)[i][j] = 0; │ │ │ │ │ -342 for (_s_i_z_e___t_y_p_e k=0; k<_c_o_l_s; k++) │ │ │ │ │ -343 (*this)[i][j] += C[i][k]*_M[k][j]; │ │ │ │ │ -344 } │ │ │ │ │ -345 return *this; │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -349 template │ │ │ │ │ -_3_5_0 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_l_> _r_i_g_h_t_m_u_l_t_i_p_l_y_a_n_y (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_c_o_l_s_,_l_>& _M) │ │ │ │ │ -const │ │ │ │ │ -351 { │ │ │ │ │ -352 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_l_> C; │ │ │ │ │ -353 │ │ │ │ │ -354 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s; i++) { │ │ │ │ │ -355 for (_s_i_z_e___t_y_p_e j=0; j │ │ │ │ │ -385 class FieldMatrix : public DenseMatrix< FieldMatrix > │ │ │ │ │ -386 { │ │ │ │ │ -387 FieldVector _data; │ │ │ │ │ -388 typedef DenseMatrix< FieldMatrix > Base; │ │ │ │ │ -389 public: │ │ │ │ │ -390 // standard constructor and everything is sufficient ... │ │ │ │ │ -391 │ │ │ │ │ -392 //===== type definitions and constants │ │ │ │ │ -393 │ │ │ │ │ -395 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -396 │ │ │ │ │ -399 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ -400 │ │ │ │ │ -401 typedef typename _B_a_s_e_:_:_r_o_w___t_y_p_e _r_o_w___t_y_p_e; │ │ │ │ │ -402 │ │ │ │ │ -403 typedef typename _B_a_s_e_:_:_r_o_w___r_e_f_e_r_e_n_c_e _r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -404 typedef typename _B_a_s_e_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e _c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -405 │ │ │ │ │ -408 constexpr static int _r_o_w_s = 1; │ │ │ │ │ -411 constexpr static int _c_o_l_s = 1; │ │ │ │ │ -412 │ │ │ │ │ -413 //===== constructors │ │ │ │ │ -416 constexpr _F_i_e_l_d_M_a_t_r_i_x() = default; │ │ │ │ │ -417 │ │ │ │ │ -420 _F_i_e_l_d_M_a_t_r_i_x(std::initializer_list<_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _1_>> const &l) │ │ │ │ │ -421 { │ │ │ │ │ -422 std::copy_n(l.begin(), std::min(static_cast< std::size_t >( 1 ), l.size()), │ │ │ │ │ -&_data); │ │ │ │ │ -423 } │ │ │ │ │ -424 │ │ │ │ │ -425 template ::value>> │ │ │ │ │ -427 _F_i_e_l_d_M_a_t_r_i_x(T const& rhs) │ │ │ │ │ -428 { │ │ │ │ │ -429 *this = rhs; │ │ │ │ │ -430 } │ │ │ │ │ -431 │ │ │ │ │ -432 using Base::operator=; │ │ │ │ │ -433 │ │ │ │ │ -435 FieldMatrix _t_r_a_n_s_p_o_s_e_d() const │ │ │ │ │ -436 { │ │ │ │ │ -437 return *this; │ │ │ │ │ -438 } │ │ │ │ │ -439 │ │ │ │ │ -441 template │ │ │ │ │ -442 friend auto _o_p_e_r_a_t_o_r_+_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -443 const FieldMatrix& matrixB) │ │ │ │ │ -444 { │ │ │ │ │ -445 return FieldMatrix:: │ │ │ │ │ -PromotedType,1,1>{matrixA[0][0] + matrixB[0][0]}; │ │ │ │ │ -446 } │ │ │ │ │ -447 │ │ │ │ │ -449 template ::value, int> = 0> │ │ │ │ │ -451 friend auto _o_p_e_r_a_t_o_r_+_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, │ │ │ │ │ -452 const Scalar& scalar) │ │ │ │ │ -453 { │ │ │ │ │ -454 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{matrix[0][0] + scalar}; │ │ │ │ │ -455 } │ │ │ │ │ -456 │ │ │ │ │ -458 template ::value, int> = 0> │ │ │ │ │ -460 friend auto _o_p_e_r_a_t_o_r_+_ ( const Scalar& scalar, │ │ │ │ │ -461 const _F_i_e_l_d_M_a_t_r_i_x& matrix) │ │ │ │ │ -462 { │ │ │ │ │ -463 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{scalar + matrix[0][0]}; │ │ │ │ │ -464 } │ │ │ │ │ -465 │ │ │ │ │ -467 template │ │ │ │ │ -468 friend auto _o_p_e_r_a_t_o_r_-_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -469 const FieldMatrix& matrixB) │ │ │ │ │ -470 { │ │ │ │ │ -471 return FieldMatrix:: │ │ │ │ │ -PromotedType,1,1>{matrixA[0][0] - matrixB[0][0]}; │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -475 template ::value, int> = 0> │ │ │ │ │ -477 friend auto _o_p_e_r_a_t_o_r_-_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, │ │ │ │ │ -478 const Scalar& scalar) │ │ │ │ │ -479 { │ │ │ │ │ -480 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{matrix[0][0] - scalar}; │ │ │ │ │ -481 } │ │ │ │ │ -482 │ │ │ │ │ -484 template ::value, int> = 0> │ │ │ │ │ -486 friend auto _o_p_e_r_a_t_o_r_-_ ( const Scalar& scalar, │ │ │ │ │ -487 const _F_i_e_l_d_M_a_t_r_i_x& matrix) │ │ │ │ │ -488 { │ │ │ │ │ -489 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{scalar - matrix[0][0]}; │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -493 template ::value, int> = 0> │ │ │ │ │ -495 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, Scalar scalar) │ │ │ │ │ -496 { │ │ │ │ │ -497 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{matrix[0][0] * scalar}; │ │ │ │ │ -498 } │ │ │ │ │ -499 │ │ │ │ │ -501 template ::value, int> = 0> │ │ │ │ │ -503 friend auto _o_p_e_r_a_t_o_r_*_ ( Scalar scalar, const _F_i_e_l_d_M_a_t_r_i_x& matrix) │ │ │ │ │ -504 { │ │ │ │ │ -505 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{scalar * matrix[0][0]}; │ │ │ │ │ -506 } │ │ │ │ │ -507 │ │ │ │ │ -509 template ::value, int> = 0> │ │ │ │ │ -511 friend auto _o_p_e_r_a_t_o_r_/_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrix, Scalar scalar) │ │ │ │ │ -512 { │ │ │ │ │ -513 return FieldMatrix::PromotedType,1,1> │ │ │ │ │ -{matrix[0][0] / scalar}; │ │ │ │ │ -514 } │ │ │ │ │ -515 │ │ │ │ │ -516 //===== solve │ │ │ │ │ -517 │ │ │ │ │ -520 template │ │ │ │ │ -521 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -522 const FieldMatrix& matrixB) │ │ │ │ │ -523 { │ │ │ │ │ -524 FieldMatrix:: │ │ │ │ │ -PromotedType,1,otherCols> result; │ │ │ │ │ -525 │ │ │ │ │ -526 for (_s_i_z_e___t_y_p_e j = 0; j < matrixB.mat_cols(); ++j) │ │ │ │ │ -527 result[0][j] = matrixA[0][0] * matrixB[0][j]; │ │ │ │ │ -528 │ │ │ │ │ -529 return result; │ │ │ │ │ -530 } │ │ │ │ │ -531 │ │ │ │ │ -538 template │ │ │ │ │ -540 and not Impl::IsFieldMatrix_v │ │ │ │ │ -541 and (OtherMatrix::rows==1) │ │ │ │ │ -542 , int> = 0> │ │ │ │ │ -543 friend auto _o_p_e_r_a_t_o_r_*_ ( const _F_i_e_l_d_M_a_t_r_i_x& matrixA, │ │ │ │ │ -544 const OtherMatrix& matrixB) │ │ │ │ │ -545 { │ │ │ │ │ -546 using Field = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_ _t_y_p_e_n_a_m_e_ _O_t_h_e_r_M_a_t_r_i_x_:_: │ │ │ │ │ -_f_i_e_l_d___t_y_p_e_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -547 _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_F_i_e_l_d_,_ _r_o_w_s_ _,_O_t_h_e_r_M_a_t_r_i_x_:_:_c_o_l_s_> result; │ │ │ │ │ -548 for (std::size_t j=0; j<_r_o_w_s; ++j) │ │ │ │ │ -549 matrixB.mtv(matrixA[j], result[j]); │ │ │ │ │ -550 return result; │ │ │ │ │ -551 } │ │ │ │ │ -552 │ │ │ │ │ -559 template │ │ │ │ │ -561 and not Impl::IsFieldMatrix_v │ │ │ │ │ -562 and (OtherMatrix::cols==1) │ │ │ │ │ -563 , int> = 0> │ │ │ │ │ -564 friend auto _o_p_e_r_a_t_o_r_*_ ( const OtherMatrix& matrixA, │ │ │ │ │ -565 const _F_i_e_l_d_M_a_t_r_i_x& matrixB) │ │ │ │ │ -566 { │ │ │ │ │ -567 using Field = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_ _t_y_p_e_n_a_m_e_ _O_t_h_e_r_M_a_t_r_i_x_:_: │ │ │ │ │ -_f_i_e_l_d___t_y_p_e_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ -568 _D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_F_i_e_l_d_,_ _O_t_h_e_r_M_a_t_r_i_x_:_:_r_o_w_s_,_ _c_o_l_s_> result; │ │ │ │ │ -569 for (std::size_t j=0; j<_c_o_l_s; ++j) │ │ │ │ │ -570 { │ │ │ │ │ -571 auto B_j = Impl::ColumnVectorView(matrixB, j); │ │ │ │ │ -572 auto result_j = Impl::ColumnVectorView(result, j); │ │ │ │ │ -573 matrixA.mv(B_j, result_j); │ │ │ │ │ -574 } │ │ │ │ │ -575 return result; │ │ │ │ │ -576 } │ │ │ │ │ -577 │ │ │ │ │ -579 template │ │ │ │ │ -580 FieldMatrix _l_e_f_t_m_u_l_t_i_p_l_y_a_n_y (const FieldMatrix& _M) const │ │ │ │ │ -581 { │ │ │ │ │ -582 FieldMatrix C; │ │ │ │ │ -583 for (_s_i_z_e___t_y_p_e j=0; j │ │ │ │ │ -597 FieldMatrix _r_i_g_h_t_m_u_l_t_i_p_l_y_a_n_y (const FieldMatrix& _M) const │ │ │ │ │ -598 { │ │ │ │ │ -599 FieldMatrix C; │ │ │ │ │ -600 │ │ │ │ │ -601 for (_s_i_z_e___t_y_p_e j=0; j │ │ │ │ │ -658 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const FieldMatrix& a) │ │ │ │ │ -659 { │ │ │ │ │ -660 s << a[0][0]; │ │ │ │ │ -661 return s; │ │ │ │ │ -662 } │ │ │ │ │ -663 │ │ │ │ │ -664#endif // DOXYGEN │ │ │ │ │ -665 │ │ │ │ │ -_6_6_6 namespace FMatrixHelp { │ │ │ │ │ -667 │ │ │ │ │ -669 template │ │ │ │ │ -_6_7_0 static inline K _i_n_v_e_r_t_M_a_t_r_i_x (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_> &matrix, │ │ │ │ │ -_F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_> &inverse) │ │ │ │ │ -671 { │ │ │ │ │ -672 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -673 inverse[0][0] = real_type(1.0)/matrix[0][0]; │ │ │ │ │ -674 return matrix[0][0]; │ │ │ │ │ -675 } │ │ │ │ │ -676 │ │ │ │ │ -678 template │ │ │ │ │ -_6_7_9 static inline K _i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_> │ │ │ │ │ -&matrix, _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_> &inverse) │ │ │ │ │ -680 { │ │ │ │ │ -681 return _i_n_v_e_r_t_M_a_t_r_i_x(matrix,inverse); │ │ │ │ │ -682 } │ │ │ │ │ -683 │ │ │ │ │ -684 │ │ │ │ │ -686 template │ │ │ │ │ -_6_8_7 static inline K _i_n_v_e_r_t_M_a_t_r_i_x (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_2_,_2_> &matrix, │ │ │ │ │ -_F_i_e_l_d_M_a_t_r_i_x_<_K_,_2_,_2_> &inverse) │ │ │ │ │ -688 { │ │ │ │ │ -689 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -690 // code generated by maple │ │ │ │ │ -691 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]); │ │ │ │ │ -692 K det_1 = real_type(1.0)/det; │ │ │ │ │ -693 inverse[0][0] = matrix[1][1] * det_1; │ │ │ │ │ -694 inverse[0][1] = - matrix[0][1] * det_1; │ │ │ │ │ -695 inverse[1][0] = - matrix[1][0] * det_1; │ │ │ │ │ -696 inverse[1][1] = matrix[0][0] * det_1; │ │ │ │ │ -697 return det; │ │ │ │ │ -698 } │ │ │ │ │ -699 │ │ │ │ │ -702 template │ │ │ │ │ -_7_0_3 static inline K _i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_2_,_2_> │ │ │ │ │ -&matrix, _F_i_e_l_d_M_a_t_r_i_x_<_K_,_2_,_2_> &inverse) │ │ │ │ │ -704 { │ │ │ │ │ -705 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -706 // code generated by maple │ │ │ │ │ -707 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]); │ │ │ │ │ -708 K det_1 = real_type(1.0)/det; │ │ │ │ │ -709 inverse[0][0] = matrix[1][1] * det_1; │ │ │ │ │ -710 inverse[1][0] = - matrix[0][1] * det_1; │ │ │ │ │ -711 inverse[0][1] = - matrix[1][0] * det_1; │ │ │ │ │ -712 inverse[1][1] = matrix[0][0] * det_1; │ │ │ │ │ -713 return det; │ │ │ │ │ -714 } │ │ │ │ │ -715 │ │ │ │ │ -717 template │ │ │ │ │ -_7_1_8 static inline K _i_n_v_e_r_t_M_a_t_r_i_x (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_3_,_3_> &matrix, │ │ │ │ │ -_F_i_e_l_d_M_a_t_r_i_x_<_K_,_3_,_3_> &inverse) │ │ │ │ │ -719 { │ │ │ │ │ -720 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -721 // code generated by maple │ │ │ │ │ -722 K t4 = matrix[0][0] * matrix[1][1]; │ │ │ │ │ -723 K t6 = matrix[0][0] * matrix[1][2]; │ │ │ │ │ -724 K t8 = matrix[0][1] * matrix[1][0]; │ │ │ │ │ -725 K t10 = matrix[0][2] * matrix[1][0]; │ │ │ │ │ -726 K t12 = matrix[0][1] * matrix[2][0]; │ │ │ │ │ -727 K t14 = matrix[0][2] * matrix[2][0]; │ │ │ │ │ -728 │ │ │ │ │ -729 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+ │ │ │ │ │ -730 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]); │ │ │ │ │ -731 K t17 = real_type(1.0)/det; │ │ │ │ │ -732 │ │ │ │ │ -733 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -734 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -735 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -736 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2] │ │ │ │ │ -[0])*t17; │ │ │ │ │ -737 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17; │ │ │ │ │ -738 inverse[1][2] = -(t6-t10) * t17; │ │ │ │ │ -739 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) │ │ │ │ │ -* t17; │ │ │ │ │ -740 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17; │ │ │ │ │ -741 inverse[2][2] = (t4-t8) * t17; │ │ │ │ │ -742 │ │ │ │ │ -743 return det; │ │ │ │ │ -744 } │ │ │ │ │ -745 │ │ │ │ │ -747 template │ │ │ │ │ -_7_4_8 static inline K _i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_3_,_3_> │ │ │ │ │ -&matrix, _F_i_e_l_d_M_a_t_r_i_x_<_K_,_3_,_3_> &inverse) │ │ │ │ │ -749 { │ │ │ │ │ -750 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_K_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -751 // code generated by maple │ │ │ │ │ -752 K t4 = matrix[0][0] * matrix[1][1]; │ │ │ │ │ -753 K t6 = matrix[0][0] * matrix[1][2]; │ │ │ │ │ -754 K t8 = matrix[0][1] * matrix[1][0]; │ │ │ │ │ -755 K t10 = matrix[0][2] * matrix[1][0]; │ │ │ │ │ -756 K t12 = matrix[0][1] * matrix[2][0]; │ │ │ │ │ -757 K t14 = matrix[0][2] * matrix[2][0]; │ │ │ │ │ -758 │ │ │ │ │ -759 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+ │ │ │ │ │ -760 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]); │ │ │ │ │ -761 K t17 = real_type(1.0)/det; │ │ │ │ │ -762 │ │ │ │ │ -763 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -764 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -765 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1] │ │ │ │ │ -[1])*t17; │ │ │ │ │ -766 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2] │ │ │ │ │ -[0])*t17; │ │ │ │ │ -767 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17; │ │ │ │ │ -768 inverse[2][1] = -(t6-t10) * t17; │ │ │ │ │ -769 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) │ │ │ │ │ -* t17; │ │ │ │ │ -770 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17; │ │ │ │ │ -771 inverse[2][2] = (t4-t8) * t17; │ │ │ │ │ -772 │ │ │ │ │ -773 return det; │ │ │ │ │ -774 } │ │ │ │ │ -775 │ │ │ │ │ -777 template< class K, int m, int n, int p > │ │ │ │ │ -_7_7_8 static inline void _m_u_l_t_M_a_t_r_i_x ( const _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _n_ _> &A, │ │ │ │ │ -779 const _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _p_ _> &B, │ │ │ │ │ -780 _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _p_ _> &ret ) │ │ │ │ │ -781 { │ │ │ │ │ -782 typedef typename _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _p_ _> :: size_type size_type; │ │ │ │ │ -783 │ │ │ │ │ -784 for( size_type i = 0; i < m; ++i ) │ │ │ │ │ -785 { │ │ │ │ │ -786 for( size_type j = 0; j < p; ++j ) │ │ │ │ │ -787 { │ │ │ │ │ -788 ret[ i ][ j ] = K( 0 ); │ │ │ │ │ -789 for( size_type k = 0; k < n; ++k ) │ │ │ │ │ -790 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ]; │ │ │ │ │ -791 } │ │ │ │ │ -792 } │ │ │ │ │ -793 } │ │ │ │ │ -794 │ │ │ │ │ -796 template │ │ │ │ │ -_7_9_7 static inline void _m_u_l_t_T_r_a_n_s_p_o_s_e_d_M_a_t_r_i_x(const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_c_o_l_s_> │ │ │ │ │ -&matrix, _F_i_e_l_d_M_a_t_r_i_x_<_K_,_c_o_l_s_,_c_o_l_s_>& ret) │ │ │ │ │ -798 { │ │ │ │ │ -799 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; │ │ │ │ │ -800 │ │ │ │ │ -801 for(size_type i=0; i │ │ │ │ │ -_8_1_4 static inline void _m_u_l_t_A_s_s_i_g_n_T_r_a_n_s_p_o_s_e_d( 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) │ │ │ │ │ -815 { │ │ │ │ │ -816 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; │ │ │ │ │ -817 │ │ │ │ │ -818 for(size_type i=0; i │ │ │ │ │ -_8_2_8 static inline _F_i_e_l_d_V_e_c_t_o_r_<_K_,_r_o_w_s_> _m_u_l_t(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_,_c_o_l_s_> & x) │ │ │ │ │ -829 { │ │ │ │ │ -830 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_r_o_w_s_> ret; │ │ │ │ │ -831 multAssign(matrix,x,ret); │ │ │ │ │ -832 return ret; │ │ │ │ │ -833 } │ │ │ │ │ -834 │ │ │ │ │ -836 template │ │ │ │ │ -_8_3_7 static inline _F_i_e_l_d_V_e_c_t_o_r_<_K_,_c_o_l_s_> _m_u_l_t_T_r_a_n_s_p_o_s_e_d(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) │ │ │ │ │ -838 { │ │ │ │ │ -839 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_c_o_l_s_> ret; │ │ │ │ │ -840 _m_u_l_t_A_s_s_i_g_n_T_r_a_n_s_p_o_s_e_d( matrix, x, ret ); │ │ │ │ │ -841 return ret; │ │ │ │ │ -842 } │ │ │ │ │ -843 │ │ │ │ │ -844 } // end namespace FMatrixHelp │ │ │ │ │ -845 │ │ │ │ │ -848} // end namespace │ │ │ │ │ -849 │ │ │ │ │ -850#include "_f_m_a_t_r_i_x_e_v_._h_h" │ │ │ │ │ -851#endif │ │ │ │ │ -_m_a_t_r_i_x_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -_d_e_n_s_e_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implements a matrix constructed from a given type representing a field and a │ │ │ │ │ -compile-time given numbe... │ │ │ │ │ -_p_r_e_c_i_s_i_o_n_._h_h │ │ │ │ │ -Various precision settings for calculations with FieldMatrix and FieldVector. │ │ │ │ │ -_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. │ │ │ │ │ -_f_m_a_t_r_i_x_e_v_._h_h │ │ │ │ │ -Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -_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. │ │ │ │ │ -_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_:_:_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_:_:_S_c_a_l_a_r │ │ │ │ │ -typename Overloads::ScalarType< std::decay_t< V > >::type Scalar │ │ │ │ │ -Element type of some SIMD type. │ │ │ │ │ -DDeeffiinniittiioonn simd/interface.hh:235 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -static FieldVector< K, cols > multTransposed(const FieldMatrix< K, rows, cols > │ │ │ │ │ -&matrix, const FieldVector< K, rows > &x) │ │ │ │ │ -calculates ret = matrix^T * x │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:837 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x___r_e_t_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -static K invertMatrix_retTransposed(const FieldMatrix< K, 1, 1 > &matrix, │ │ │ │ │ -FieldMatrix< K, 1, 1 > &inverse) │ │ │ │ │ -invert scalar without changing the original matrix │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:679 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_M_a_t_r_i_x │ │ │ │ │ -static void multMatrix(const FieldMatrix< K, m, n > &A, const FieldMatrix< K, │ │ │ │ │ -n, p > &B, FieldMatrix< K, m, p > &ret) │ │ │ │ │ -calculates ret = A * B │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:778 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_i_n_v_e_r_t_M_a_t_r_i_x │ │ │ │ │ -static K invertMatrix(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, │ │ │ │ │ -1 > &inverse) │ │ │ │ │ -invert scalar without changing the original matrix │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:670 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t │ │ │ │ │ -static FieldVector< K, rows > mult(const FieldMatrix< K, rows, cols > &matrix, │ │ │ │ │ -const FieldVector< K, cols > &x) │ │ │ │ │ -calculates ret = matrix * x │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:828 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_T_r_a_n_s_p_o_s_e_d_M_a_t_r_i_x │ │ │ │ │ -static void multTransposedMatrix(const FieldMatrix< K, rows, cols > &matrix, │ │ │ │ │ -FieldMatrix< K, cols, cols > &ret) │ │ │ │ │ -calculates ret= A_t*A │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:797 │ │ │ │ │ -_D_u_n_e_:_:_F_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_A_s_s_i_g_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -static void multAssignTransposed(const FieldMatrix< K, rows, cols > &matrix, │ │ │ │ │ -const FieldVector< K, rows > &x, FieldVector< K, cols > &ret) │ │ │ │ │ -calculates ret = matrix^T * x │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:814 │ │ │ │ │ -_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_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_r_i_g_h_t_m_u_l_t_i_p_l_y │ │ │ │ │ -FieldMatrix< K, ROWS, COLS > & 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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _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 │ │ │ │ │ -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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_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_:_:_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_:_:_m_a_t___c_o_l_s │ │ │ │ │ -static constexpr size_type mat_cols() │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -constexpr FieldMatrix()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -Base::const_row_reference const_row_reference │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -FieldMatrix & operator=(const FieldMatrix< T, ROWS, COLS > &x) │ │ │ │ │ -copy assignment from FieldMatrix over a different field │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_r_i_g_h_t_m_u_l_t_i_p_l_y_a_n_y │ │ │ │ │ -FieldMatrix< K, rows, l > rightmultiplyany(const FieldMatrix< K, cols, l > &M) │ │ │ │ │ -const │ │ │ │ │ -Multiplies M from the right to this matrix, this matrix is not modified. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -Base::row_type row_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:128 │ │ │ │ │ -_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_M_a_t_r_i_x_:_:_l_e_f_t_m_u_l_t_i_p_l_y_a_n_y │ │ │ │ │ -FieldMatrix< K, l, cols > leftmultiplyany(const FieldMatrix< K, l, rows > &M) │ │ │ │ │ -const │ │ │ │ │ -Multiplies M from the left to this matrix, this matrix is not modified. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:315 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_r_i_g_h_t_m_u_l_t_i_p_l_y │ │ │ │ │ -FieldMatrix & rightmultiply(const FieldMatrix< K, r, c > &M) │ │ │ │ │ -Multiplies M from the right to this matrix. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:333 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -FieldMatrix(T const &rhs) │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -friend auto operator*(const FieldMatrix &matrix, Scalar scalar) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -FieldMatrix & operator=(FieldMatrix< T, rows, cols > const &)=delete │ │ │ │ │ -no copy assignment from FieldMatrix of different size │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -Base::row_reference row_reference │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -constexpr FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > │ │ │ │ │ -const &l) │ │ │ │ │ -Constructor initializing the matrix from a list of vector. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_m_a_t___a_c_c_e_s_s │ │ │ │ │ -row_reference mat_access(size_type i) │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:368 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_r_o_w_s │ │ │ │ │ -static constexpr int rows │ │ │ │ │ -The number of rows. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_t_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< K, COLS, ROWS > transposed() const │ │ │ │ │ -Return transposed of the matrix as FieldMatrix. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_m_a_t___r_o_w_s │ │ │ │ │ -static constexpr size_type mat_rows() │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_c_o_l_s │ │ │ │ │ -static constexpr int cols │ │ │ │ │ -The number of columns. │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ │ -friend auto operator/(const FieldMatrix &matrix, Scalar scalar) │ │ │ │ │ -vector space division by scalar │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:239 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ -friend auto operator+(const FieldMatrix &matrixA, const FieldMatrix< │ │ │ │ │ -OtherScalar, ROWS, COLS > &matrixB) │ │ │ │ │ -vector space addition – two-argument version │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -FieldMatrix & operator=(const FieldMatrix &)=default │ │ │ │ │ -copy assignment operator │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -friend auto operator-(const FieldMatrix &matrixA, const FieldMatrix< │ │ │ │ │ -OtherScalar, ROWS, COLS > &matrixB) │ │ │ │ │ -vector space subtraction – two-argument version │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_m_a_t___a_c_c_e_s_s │ │ │ │ │ -const_row_reference mat_access(size_type i) const │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:374 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_c_o_n_t_a_i_n_e_r___t_y_p_e │ │ │ │ │ -std::array< row_type, ROWS > container_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ -FieldMatrix< K, ROWS, COLS > derived_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -K value_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const row_type & const_row_reference │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_r_o_w___t_y_p_e │ │ │ │ │ -FieldVector< K, COLS > row_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _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 │ │ │ │ │ -container_type::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ │ -row_type & row_reference │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< K >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _R_O_W_S_,_ _C_O_L_S_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< K >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn fmatrix.hh:104 │ │ │ │ │ -_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_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_:_:_P_r_o_m_o_t_e_d_T_y_p_e │ │ │ │ │ -decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType │ │ │ │ │ -DDeeffiinniittiioonn promotiontraits.hh:28 │ │ │ │ │ +34#endif // DUNE_COMMON_ASSERTANDRETURN_HH │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: conditional.hh File Reference │ │ │ │ +dune-common: indexediterator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,34 +70,35 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
conditional.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
indexediterator.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ +
#include <iterator>
│ │ │ │ +#include <type_traits>
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::IndexedIterator< Iter >
 An iterator mixin that adds an index() method returning an enumeration index for the traversal. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<typename T1 , typename T2 >
const T1 Dune::cond (bool b, const T1 &v1, const T2 &v2)
 conditional evaluate
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,22 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ 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 │ │ │ │ │ -conditional.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +indexediterator.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_n_d_e_x_e_d_I_t_e_r_a_t_o_r_<_ _I_t_e_r_ _> │ │ │ │ │ +  An iterator mixin that adds an _i_n_d_e_x_(_) method returning an enumeration │ │ │ │ │ + index for the traversal. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -const T1  _D_u_n_e_:_:_c_o_n_d (bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ -  conditional evaluate │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: conditional.hh Source File │ │ │ │ +dune-common: indexediterator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,38 +74,143 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
conditional.hh
│ │ │ │ +
indexediterator.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_COMMON_CONDITIONAL_HH
│ │ │ │ -
4#define DUNE_COMMON_CONDITIONAL_HH
│ │ │ │ -
5
│ │ │ │ -
6namespace Dune
│ │ │ │ -
7{
│ │ │ │ -
8
│ │ │ │ -
27 template<typename T1, typename T2>
│ │ │ │ -
│ │ │ │ -
28 const T1 cond(bool b, const T1 & v1, const T2 & v2)
│ │ │ │ -
29 {
│ │ │ │ -
30 return (b ? v1 : v2);
│ │ │ │ -
31 }
│ │ │ │ -
│ │ │ │ -
32
│ │ │ │ -
33} // end namespace Dune
│ │ │ │ -
34
│ │ │ │ -
35#endif // DUNE_COMMON_CONDITIONAL_HH
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
3// SPDX-FileCopyrightInfo: Copyright © 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_INDEXEDITERATOR_HH
│ │ │ │ +
6#define DUNE_COMMON_INDEXEDITERATOR_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <iterator>
│ │ │ │ +
9#include <type_traits>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune
│ │ │ │ +
12{
│ │ │ │ +
26 template <class Iter>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
28 : public Iter
│ │ │ │ +
29 {
│ │ │ │ +
30 using Traits = std::iterator_traits<Iter>;
│ │ │ │ +
31 static_assert(std::is_copy_constructible_v<Iter>);
│ │ │ │ +
32 static_assert(std::is_base_of_v<std::forward_iterator_tag, typename Traits::iterator_category>);
│ │ │ │ +
33
│ │ │ │ +
34 public:
│ │ │ │ +
36 using size_type = typename Traits::difference_type;
│ │ │ │ +
37
│ │ │ │ +
39 template <class I = Iter,
│ │ │ │ +
40 std::enable_if_t<std::is_default_constructible_v<I>, bool> = true>
│ │ │ │ +
│ │ │ │ +
41 constexpr IndexedIterator ()
│ │ │ │ +
42 noexcept(std::is_nothrow_default_constructible_v<Iter>)
│ │ │ │ +
43 {}
│ │ │ │ +
│ │ │ │ +
44
│ │ │ │ +
│ │ │ │ +
47 constexpr IndexedIterator (Iter it, size_type index = 0)
│ │ │ │ +
48 noexcept(std::is_nothrow_copy_constructible_v<Iter>)
│ │ │ │ +
49 : Iter(it)
│ │ │ │ +
50 , index_(index)
│ │ │ │ +
51 {}
│ │ │ │ +
│ │ │ │ +
52
│ │ │ │ +
│ │ │ │ +
54 [[nodiscard]] constexpr size_type index () const noexcept
│ │ │ │ +
55 {
│ │ │ │ +
56 return index_;
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 {
│ │ │ │ +
62 Iter::operator++();
│ │ │ │ +
63 ++index_;
│ │ │ │ +
64 return *this;
│ │ │ │ +
65 }
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
69 {
│ │ │ │ +
70 IndexedIterator tmp(*this);
│ │ │ │ +
71 this->operator++();
│ │ │ │ +
72 return tmp;
│ │ │ │ +
73 }
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
76 template <class I = Iter,
│ │ │ │ +
77 decltype(--std::declval<I&>(), bool{}) = true>
│ │ │ │ +
│ │ │ │ +
78 constexpr IndexedIterator& operator-- ()
│ │ │ │ +
79 {
│ │ │ │ +
80 Iter::operator--();
│ │ │ │ +
81 --index_;
│ │ │ │ +
82 return *this;
│ │ │ │ +
83 }
│ │ │ │ +
│ │ │ │ +
84
│ │ │ │ +
86 template <class I = Iter,
│ │ │ │ +
87 decltype(std::declval<I&>()--, bool{}) = true>
│ │ │ │ +
│ │ │ │ +
88 constexpr IndexedIterator operator-- (int)
│ │ │ │ +
89 {
│ │ │ │ +
90 IndexedIterator tmp(*this);
│ │ │ │ +
91 this->operator--();
│ │ │ │ +
92 return tmp;
│ │ │ │ +
93 }
│ │ │ │ +
│ │ │ │ +
94
│ │ │ │ +
96 template <class I = Iter,
│ │ │ │ +
97 decltype(std::declval<I&>()+=1, bool{}) = true>
│ │ │ │ +
│ │ │ │ +
98 constexpr IndexedIterator& operator+= (typename Iter::difference_type n)
│ │ │ │ +
99 {
│ │ │ │ +
100 Iter::operator+=(n);
│ │ │ │ +
101 index_ += n;
│ │ │ │ +
102 return *this;
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
106 template <class I = Iter,
│ │ │ │ +
107 decltype(std::declval<I&>()-=1, bool{}) = true>
│ │ │ │ +
│ │ │ │ +
108 constexpr IndexedIterator& operator-= (typename Iter::difference_type n)
│ │ │ │ +
109 {
│ │ │ │ +
110 Iter::operator-=(n);
│ │ │ │ +
111 index_ -= n;
│ │ │ │ +
112 return *this;
│ │ │ │ +
113 }
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
115 private:
│ │ │ │ +
116 size_type index_ = 0;
│ │ │ │ +
117 };
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
119} // end namespace Dune
│ │ │ │ +
120
│ │ │ │ +
121#endif // DUNE_COMMON_INDEXEDITERATOR_HH
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition conditional.hh:28
│ │ │ │ +
An iterator mixin that adds an index() method returning an enumeration index for the traversal.
Definition indexediterator.hh:29
│ │ │ │ +
constexpr IndexedIterator & operator++()
Increment the iterator and the index.
Definition indexediterator.hh:60
│ │ │ │ +
constexpr IndexedIterator & operator--()
Decrement the iterator and the index.
Definition indexediterator.hh:78
│ │ │ │ +
constexpr size_type index() const noexcept
Return the enumeration index.
Definition indexediterator.hh:54
│ │ │ │ +
constexpr IndexedIterator() noexcept(std::is_nothrow_default_constructible_v< Iter >)
Default constructor default-constructs the Iter base type and the index by 0.
Definition indexediterator.hh:41
│ │ │ │ +
constexpr IndexedIterator(Iter it, size_type index=0) noexcept(std::is_nothrow_copy_constructible_v< Iter >)
Definition indexediterator.hh:47
│ │ │ │ +
typename Traits::difference_type size_type
Type used for storing the traversal index.
Definition indexediterator.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,35 +1,143 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -conditional.hh │ │ │ │ │ +indexediterator.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ -2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ -4#define DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ -5 │ │ │ │ │ -6namespace _D_u_n_e │ │ │ │ │ -7{ │ │ │ │ │ -8 │ │ │ │ │ -27 template │ │ │ │ │ -_2_8 const T1 _c_o_n_d(bool b, const T1 & v1, const T2 & v2) │ │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +5#ifndef DUNE_COMMON_INDEXEDITERATOR_HH │ │ │ │ │ +6#define DUNE_COMMON_INDEXEDITERATOR_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e │ │ │ │ │ +12{ │ │ │ │ │ +26 template │ │ │ │ │ +_2_7 class _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r │ │ │ │ │ +28 : public Iter │ │ │ │ │ 29 { │ │ │ │ │ -30 return (b ? v1 : v2); │ │ │ │ │ -31 } │ │ │ │ │ -32 │ │ │ │ │ -33} // end namespace Dune │ │ │ │ │ -34 │ │ │ │ │ -35#endif // DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ +30 using Traits = std::iterator_traits; │ │ │ │ │ +31 static_assert(std::is_copy_constructible_v); │ │ │ │ │ +32 static_assert(std::is_base_of_v); │ │ │ │ │ +33 │ │ │ │ │ +34 public: │ │ │ │ │ +_3_6 using _s_i_z_e___t_y_p_e = typename Traits::difference_type; │ │ │ │ │ +37 │ │ │ │ │ +39 template , bool> = true> │ │ │ │ │ +_4_1 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r () │ │ │ │ │ +42 noexcept(_s_t_d::is_nothrow_default_constructible_v) │ │ │ │ │ +43 {} │ │ │ │ │ +44 │ │ │ │ │ +_4_7 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r (Iter it, _s_i_z_e___t_y_p_e _i_n_d_e_x = 0) │ │ │ │ │ +48 noexcept(_s_t_d::is_nothrow_copy_constructible_v) │ │ │ │ │ +49 : Iter(it) │ │ │ │ │ +50 , index_(_i_n_d_e_x) │ │ │ │ │ +51 {} │ │ │ │ │ +52 │ │ │ │ │ +_5_4 [[nodiscard]] constexpr _s_i_z_e___t_y_p_e _i_n_d_e_x () const noexcept │ │ │ │ │ +55 { │ │ │ │ │ +56 return index_; │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +_6_0 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+_ () │ │ │ │ │ +61 { │ │ │ │ │ +62 Iter::operator++(); │ │ │ │ │ +63 ++index_; │ │ │ │ │ +64 return *this; │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +_6_8 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_+_+_ (int) │ │ │ │ │ +69 { │ │ │ │ │ +70 _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r tmp(*this); │ │ │ │ │ +71 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +72 return tmp; │ │ │ │ │ +73 } │ │ │ │ │ +74 │ │ │ │ │ +76 template (), bool{}) = true> │ │ │ │ │ +_7_8 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r& operator-- () │ │ │ │ │ +79 { │ │ │ │ │ +80 Iter::operator--(); │ │ │ │ │ +81 --index_; │ │ │ │ │ +82 return *this; │ │ │ │ │ +83 } │ │ │ │ │ +84 │ │ │ │ │ +86 template ()--, bool{}) = true> │ │ │ │ │ +_8_8 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r operator-- (int) │ │ │ │ │ +89 { │ │ │ │ │ +90 _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r tmp(*this); │ │ │ │ │ +91 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ +92 return tmp; │ │ │ │ │ +93 } │ │ │ │ │ +94 │ │ │ │ │ +96 template ()+=1, bool{}) = true> │ │ │ │ │ +_9_8 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r& operator+= (typename Iter::difference_type n) │ │ │ │ │ +99 { │ │ │ │ │ +100 Iter::operator+=(n); │ │ │ │ │ +101 index_ += n; │ │ │ │ │ +102 return *this; │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +106 template ()-=1, bool{}) = true> │ │ │ │ │ +_1_0_8 constexpr _I_n_d_e_x_e_d_I_t_e_r_a_t_o_r& operator-= (typename Iter::difference_type n) │ │ │ │ │ +109 { │ │ │ │ │ +110 Iter::operator-=(n); │ │ │ │ │ +111 index_ -= n; │ │ │ │ │ +112 return *this; │ │ │ │ │ +113 } │ │ │ │ │ +114 │ │ │ │ │ +115 private: │ │ │ │ │ +116 _s_i_z_e___t_y_p_e index_ = 0; │ │ │ │ │ +117 }; │ │ │ │ │ +118 │ │ │ │ │ +119} // end namespace Dune │ │ │ │ │ +120 │ │ │ │ │ +121#endif // DUNE_COMMON_INDEXEDITERATOR_HH │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r │ │ │ │ │ +An iterator mixin that adds an index() method returning an enumeration index │ │ │ │ │ +for the traversal. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +constexpr IndexedIterator & operator++() │ │ │ │ │ +Increment the iterator and the index. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ +constexpr IndexedIterator & operator--() │ │ │ │ │ +Decrement the iterator and the index. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +constexpr size_type index() const noexcept │ │ │ │ │ +Return the enumeration index. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r │ │ │ │ │ +constexpr IndexedIterator() noexcept(std::is_nothrow_default_constructible_v< │ │ │ │ │ +Iter >) │ │ │ │ │ +Default constructor default-constructs the Iter base type and the index by 0. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r │ │ │ │ │ +constexpr IndexedIterator(Iter it, size_type index=0) noexcept(std:: │ │ │ │ │ +is_nothrow_copy_constructible_v< Iter >) │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_e_d_I_t_e_r_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +typename Traits::difference_type size_type │ │ │ │ │ +Type used for storing the traversal index. │ │ │ │ │ +DDeeffiinniittiioonn indexediterator.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tuplevector.hh File Reference │ │ │ │ +dune-common: deprecated.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,61 +70,35 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
tuplevector.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
deprecated.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

Definition of the DUNE_NO_DEPRECATED_* macros. │ │ │ │ More...

│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::TupleVector< T >
 A class augmenting std::tuple by element access via operator[]. More...
 
struct  std::tuple_element< i, Dune::TupleVector< Args... > >
 Make std::tuple_element work for TupleVector. More...
 
struct  std::tuple_size< Dune::TupleVector< Args... > >
 Make std::tuple_size work for TupleVector. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 Dune namespace.
 
namespace  std
 STL namespace.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

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

│ │ │ │ +Macros

#define DUNE_NO_DEPRECATED_BEGIN   ...
 Ignore deprecation warnings (start)
 
#define DUNE_NO_DEPRECATED_END   ...
 Ignore deprecation warnings (end)
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

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

Definition of the DUNE_NO_DEPRECATED_* macros.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,21 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -tuplevector.hh File Reference │ │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +_M_a_c_r_o_s │ │ │ │ │ +deprecated.hh File Reference │ │ │ │ │ +Definition of the DUNE_NO_DEPRECATED_* macros. _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_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _T_ _> │ │ │ │ │ -  A class augmenting std::tuple by element access via operator[]. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___N_O___D_E_P_R_E_C_A_T_E_D___B_E_G_I_N   ... │ │ │ │ │ +  Ignore deprecation warnings (start) │ │ │ │ │   │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  Make std::tuple_element work for TupleVector. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  Make std::tuple_size work for TupleVector. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _s_t_d │ │ │ │ │ -  STL namespace. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr auto  _D_u_n_e_:_:_m_a_k_e_T_u_p_l_e_V_e_c_t_o_r (T &&... t) │ │ │ │ │ +#define  _D_U_N_E___N_O___D_E_P_R_E_C_A_T_E_D___E_N_D   ... │ │ │ │ │ +  Ignore deprecation warnings (end) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. │ │ │ │ │ - Author │ │ │ │ │ - Carsten Gräser │ │ │ │ │ +Definition of the DUNE_NO_DEPRECATED_* macros. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tuplevector.hh Source File │ │ │ │ +dune-common: deprecated.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,141 +74,52 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
tuplevector.hh
│ │ │ │ +
deprecated.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ │ -
6#define DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ │ +
5#ifndef DUNE_DEPRECATED_HH
│ │ │ │ +
6#define DUNE_DEPRECATED_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
23namespace Dune
│ │ │ │ -
24{
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27
│ │ │ │ -
33template<class... T>
│ │ │ │ -
│ │ │ │ -
34class TupleVector : public std::tuple<T...>
│ │ │ │ -
35{
│ │ │ │ -
36 using Base = std::tuple<T...>;
│ │ │ │ -
37
│ │ │ │ -
38 template<class... TT>
│ │ │ │ -
39 using TupleConstructorDetector = decltype(Base(std::declval<TT&&>()...));
│ │ │ │ -
40
│ │ │ │ -
41 template<class... TT>
│ │ │ │ -
42 using hasTupleConstructor = Dune::Std::is_detected<TupleConstructorDetector, TT...>;
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
45public:
│ │ │ │ -
46
│ │ │ │ -
53 template<class... TT,
│ │ │ │ -
54 std::enable_if_t<hasTupleConstructor<TT...>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
55 constexpr TupleVector(TT&&... tt) :
│ │ │ │ -
56 Base(std::forward<TT>(tt)...)
│ │ │ │ -
57 {}
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
│ │ │ │ -
61 constexpr TupleVector()
│ │ │ │ -
62 {}
│ │ │ │ -
│ │ │ │ +
14#ifdef DOXYGEN
│ │ │ │ +
32#define DUNE_NO_DEPRECATED_BEGIN ...
│ │ │ │ +
38#define DUNE_NO_DEPRECATED_END ...
│ │ │ │ +
39#else
│ │ │ │ +
40# if defined __clang__
│ │ │ │ +
41# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ +
42 _Pragma("clang diagnostic push") \
│ │ │ │ +
43 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
│ │ │ │ +
44# define DUNE_NO_DEPRECATED_END _Pragma("clang diagnostic pop")
│ │ │ │ +
45# elif defined __INTEL_COMPILER
│ │ │ │ +
46# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ +
47 _Pragma("warning push") \
│ │ │ │ +
48 _Pragma("warning(disable:1478)") \
│ │ │ │ +
49 _Pragma("warning(disable:1786)")
│ │ │ │ +
50# define DUNE_NO_DEPRECATED_END _Pragma("warning pop")
│ │ │ │ +
51# elif defined __GNUC__
│ │ │ │ +
52# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ +
53 _Pragma("GCC diagnostic push") \
│ │ │ │ +
54 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
│ │ │ │ +
55# define DUNE_NO_DEPRECATED_END _Pragma("GCC diagnostic pop")
│ │ │ │ +
56# else
│ │ │ │ +
57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */
│ │ │ │ +
58# define DUNE_NO_DEPRECATED_END /* Noop. */
│ │ │ │ +
59# endif
│ │ │ │ +
60#endif
│ │ │ │ +
61
│ │ │ │
63
│ │ │ │ -
66 template<std::size_t i,
│ │ │ │ -
67 std::enable_if_t<(i < sizeof...(T)), int> = 0>
│ │ │ │ -
│ │ │ │ -
68 constexpr decltype(auto) operator[](const Dune::index_constant<i>&) const
│ │ │ │ -
69 {
│ │ │ │ -
70 return std::get<i>(*this);
│ │ │ │ -
71 }
│ │ │ │ -
│ │ │ │ -
72
│ │ │ │ -
75 template<std::size_t i,
│ │ │ │ -
76 std::enable_if_t<(i < sizeof...(T)), int> = 0>
│ │ │ │ -
│ │ │ │ -
77 decltype(auto) operator[](const Dune::index_constant<i>&)
│ │ │ │ -
78 {
│ │ │ │ -
79 return std::get<i>(*this);
│ │ │ │ -
80 }
│ │ │ │ -
│ │ │ │ -
81
│ │ │ │ -
│ │ │ │ -
83 static constexpr std::size_t size()
│ │ │ │ -
84 {
│ │ │ │ -
85 return std::tuple_size<Base>::value;
│ │ │ │ -
86 }
│ │ │ │ -
│ │ │ │ -
87};
│ │ │ │ -
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
90
│ │ │ │ -
91template<class... T>
│ │ │ │ -
│ │ │ │ -
92constexpr auto makeTupleVector(T&&... t)
│ │ │ │ -
93{
│ │ │ │ -
94 // The std::decay_t<T> is is a slight simplification,
│ │ │ │ -
95 // because std::reference_wrapper needs special care.
│ │ │ │ -
96 return TupleVector<std::decay_t<T>...>(std::forward<T>(t)...);
│ │ │ │ -
97}
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101} // namespace Dune
│ │ │ │ -
102
│ │ │ │ -
103namespace std
│ │ │ │ -
104{
│ │ │ │ -
109 template <size_t i, typename... Args>
│ │ │ │ -
│ │ │ │ -
110 struct tuple_element<i,Dune::TupleVector<Args...> >
│ │ │ │ -
111 {
│ │ │ │ -
112 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ │ -
113 };
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
119 template <typename... Args>
│ │ │ │ -
│ │ │ │ -
120 struct tuple_size<Dune::TupleVector<Args...> >
│ │ │ │ -
121 : std::integral_constant<std::size_t, sizeof...(Args)>
│ │ │ │ -
122 {};
│ │ │ │ -
│ │ │ │ -
123}
│ │ │ │ -
124
│ │ │ │ -
125#endif // DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition indices.hh:29
│ │ │ │ -
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition type_traits.hh:145
│ │ │ │ -
STL namespace.
│ │ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
constexpr auto makeTupleVector(T &&... t)
Definition tuplevector.hh:92
│ │ │ │ -
A class augmenting std::tuple by element access via operator[].
Definition tuplevector.hh:35
│ │ │ │ -
static constexpr std::size_t size()
Number of elements of the tuple.
Definition tuplevector.hh:83
│ │ │ │ -
constexpr TupleVector(TT &&... tt)
Construct from a set of arguments.
Definition tuplevector.hh:55
│ │ │ │ -
constexpr TupleVector()
Default constructor.
Definition tuplevector.hh:61
│ │ │ │ -
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition tuplevector.hh:112
│ │ │ │ +
64#endif
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,143 +1,46 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -tuplevector.hh │ │ │ │ │ +deprecated.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ -6#define DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ +5#ifndef DUNE_DEPRECATED_HH │ │ │ │ │ +6#define DUNE_DEPRECATED_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -14 │ │ │ │ │ -15 │ │ │ │ │ -16 │ │ │ │ │ -23namespace _D_u_n_e │ │ │ │ │ -24{ │ │ │ │ │ -25 │ │ │ │ │ -26 │ │ │ │ │ -27 │ │ │ │ │ -33template │ │ │ │ │ -_3_4class _T_u_p_l_e_V_e_c_t_o_r : public std::tuple │ │ │ │ │ -35{ │ │ │ │ │ -36 using Base = std::tuple; │ │ │ │ │ -37 │ │ │ │ │ -38 template │ │ │ │ │ -39 using TupleConstructorDetector = decltype(Base(std::declval()...)); │ │ │ │ │ -40 │ │ │ │ │ -41 template │ │ │ │ │ -42 using hasTupleConstructor = _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d; │ │ │ │ │ -43 │ │ │ │ │ -44 │ │ │ │ │ -45public: │ │ │ │ │ -46 │ │ │ │ │ -53 template::value, int> = 0> │ │ │ │ │ -_5_5 constexpr _T_u_p_l_e_V_e_c_t_o_r(TT&&... tt) : │ │ │ │ │ -56 Base(_s_t_d::forward(tt)...) │ │ │ │ │ -57 {} │ │ │ │ │ -58 │ │ │ │ │ -_6_1 constexpr _T_u_p_l_e_V_e_c_t_o_r() │ │ │ │ │ -62 {} │ │ │ │ │ +14#ifdef DOXYGEN │ │ │ │ │ +_3_2#define DUNE_NO_DEPRECATED_BEGIN ... │ │ │ │ │ +_3_8#define DUNE_NO_DEPRECATED_END ... │ │ │ │ │ +39#else │ │ │ │ │ +40# if defined __clang__ │ │ │ │ │ +41# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ +42 _Pragma("clang diagnostic push") \ │ │ │ │ │ +43 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") │ │ │ │ │ +44# define DUNE_NO_DEPRECATED_END _Pragma("clang diagnostic pop") │ │ │ │ │ +45# elif defined __INTEL_COMPILER │ │ │ │ │ +46# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ +47 _Pragma("warning push") \ │ │ │ │ │ +48 _Pragma("warning(disable:1478)") \ │ │ │ │ │ +49 _Pragma("warning(disable:1786)") │ │ │ │ │ +50# define DUNE_NO_DEPRECATED_END _Pragma("warning pop") │ │ │ │ │ +51# elif defined __GNUC__ │ │ │ │ │ +52# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ +53 _Pragma("GCC diagnostic push") \ │ │ │ │ │ +54 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") │ │ │ │ │ +55# define DUNE_NO_DEPRECATED_END _Pragma("GCC diagnostic pop") │ │ │ │ │ +56# else │ │ │ │ │ +57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */ │ │ │ │ │ +58# define DUNE_NO_DEPRECATED_END /* Noop. */ │ │ │ │ │ +59# endif │ │ │ │ │ +60#endif │ │ │ │ │ +61 │ │ │ │ │ 63 │ │ │ │ │ -66 template = 0> │ │ │ │ │ -_6_8 constexpr decltype(auto) operator[](const _D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t_<_i_>&) const │ │ │ │ │ -69 { │ │ │ │ │ -70 return std::get(*this); │ │ │ │ │ -71 } │ │ │ │ │ -72 │ │ │ │ │ -75 template = 0> │ │ │ │ │ -_7_7 decltype(auto) operator[](const _D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t_<_i_>&) │ │ │ │ │ -78 { │ │ │ │ │ -79 return std::get(*this); │ │ │ │ │ -80 } │ │ │ │ │ -81 │ │ │ │ │ -_8_3 static constexpr std::size_t _s_i_z_e() │ │ │ │ │ -84 { │ │ │ │ │ -85 return std::tuple_size::value; │ │ │ │ │ -86 } │ │ │ │ │ -87}; │ │ │ │ │ -88 │ │ │ │ │ -89 │ │ │ │ │ -90 │ │ │ │ │ -91template │ │ │ │ │ -_9_2constexpr auto _m_a_k_e_T_u_p_l_e_V_e_c_t_o_r(T&&... t) │ │ │ │ │ -93{ │ │ │ │ │ -94 // The std::decay_t is is a slight simplification, │ │ │ │ │ -95 // because std::reference_wrapper needs special care. │ │ │ │ │ -96 return _T_u_p_l_e_V_e_c_t_o_r_<_s_t_d_:_:_d_e_c_a_y___t_<_T_>...>(std::forward(t)...); │ │ │ │ │ -97} │ │ │ │ │ -98 │ │ │ │ │ -99 │ │ │ │ │ -100 │ │ │ │ │ -101} // namespace Dune │ │ │ │ │ -102 │ │ │ │ │ -103namespace _s_t_d │ │ │ │ │ -104{ │ │ │ │ │ -109 template │ │ │ │ │ -_1_1_0 struct tuple_element > │ │ │ │ │ -111 { │ │ │ │ │ -_1_1_2 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ │ -113 }; │ │ │ │ │ -114 │ │ │ │ │ -119 template │ │ │ │ │ -_1_2_0 struct tuple_size<_D_u_n_e::TupleVector > │ │ │ │ │ -121 : std::integral_constant │ │ │ │ │ -122 {}; │ │ │ │ │ -123} │ │ │ │ │ -124 │ │ │ │ │ -125#endif // DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ -_i_n_d_i_c_e_s_._h_h │ │ │ │ │ -_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_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d │ │ │ │ │ -typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ -Detects whether Op is valid. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:145 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_m_a_k_e_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ │ -constexpr auto makeTupleVector(T &&... t) │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ │ -A class augmenting std::tuple by element access via operator[]. │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -static constexpr std::size_t size() │ │ │ │ │ -Number of elements of the tuple. │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ │ -constexpr TupleVector(TT &&... tt) │ │ │ │ │ -Construct from a set of arguments. │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ │ -constexpr TupleVector() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:61 │ │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:112 │ │ │ │ │ +64#endif │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: parametertree.cc File Reference │ │ │ │ +dune-common: math.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,27 +69,198 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
parametertree.cc File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
math.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#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>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/typeutilities.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::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

│ │ │ │ +

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,19 +1,154 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -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> │ │ │ │ │ +_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 │ │ │ │ │ +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) │ │ │ │ │ +  Power 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/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: poolallocator.hh File Reference │ │ │ │ +dune-common: visibility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,86 +70,70 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
poolallocator.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
visibility.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

An stl-compliant pool allocator. │ │ │ │ +

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

│ │ │ │ -
#include <numeric>
│ │ │ │ -#include <typeinfo>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <new>
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Pool< T, s >
 A memory pool of objects. More...
 
class  Dune::PoolAllocator< T, s >
 An allocator managing a pool of objects for reuse. More...
 
struct  Dune::PoolAllocator< T, s >::rebind< U >
 Rebind the allocator to another type. More...
 
class  Dune::PoolAllocator< void, s >
 
struct  Dune::PoolAllocator< void, s >::rebind< U >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 Dune namespace.
 
namespace  std
 STL namespace.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<typename T1 , std::size_t t1, typename T2 , std::size_t t2>
bool Dune::operator== (const PoolAllocator< T1, t1 > &, const PoolAllocator< T2, t2 > &)
 
template<typename T1 , std::size_t t1, typename T2 , std::size_t t2>
bool Dune::operator!= (const PoolAllocator< T1, t1 > &, const PoolAllocator< T2, t2 > &)
 
template<typename T , std::size_t t1, std::size_t t2>
bool Dune::operator== (const PoolAllocator< T, t1 > &p1, const PoolAllocator< T, t2 > &p2)
 
template<typename T , std::size_t t1, std::size_t t2>
bool Dune::operator!= (const PoolAllocator< T, t1 > &p1, const PoolAllocator< T, t2 > &p2)
 
template<typename T , std::size_t t1, std::size_t t2>
bool Dune::operator== (const PoolAllocator< void, t1 > &, const PoolAllocator< T, t2 > &)
 
template<typename T , std::size_t t1, std::size_t t2>
bool Dune::operator!= (const PoolAllocator< void, t1 > &, const PoolAllocator< T, t2 > &)
 
template<std::size_t t1, std::size_t t2>
bool Dune::operator== (const PoolAllocator< void, t1 > &p1, const PoolAllocator< void, t2 > &p2)
 
template<std::size_t t1, std::size_t t2>
bool Dune::operator!= (const PoolAllocator< void, t1 > &p1, const PoolAllocator< void, t2 > &p2)
 

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

│ │ │ │ -

An stl-compliant pool allocator.

│ │ │ │ -

This file implements the classes Pool and PoolAllocator providing memory allocation for objects in chunks.

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

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,77 +1,35 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -poolallocator.hh File Reference │ │ │ │ │ -An stl-compliant pool allocator. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_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_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_P_o_o_l_<_ _T_,_ _s_ _> │ │ │ │ │ -  A memory pool of objects. _M_o_r_e_._._. │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___E_X_P_O_R_T   implementation_defined │ │ │ │ │ +  Export a symbol as part of the public ABI. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _T_,_ _s_ _> │ │ │ │ │ -  An allocator managing a pool of objects for reuse. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _T_,_ _s_ _>_:_:_r_e_b_i_n_d_<_ _U_ _> │ │ │ │ │ -  Rebind the allocator to another type. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _>_:_:_r_e_b_i_n_d_<_ _U_ _> │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  _D_u_n_e namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _s_t_d │ │ │ │ │ -  STL namespace. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< T1, t1 > &, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T2, t2 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< T1, t1 > &, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T2, t2 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< T, t1 > &p1, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T, t2 > &p2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< T, t1 > &p1, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T, t2 > &p2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t1 > &, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T, t2 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t1 > &, const _P_o_o_l_A_l_l_o_c_a_t_o_r< │ │ │ │ │ - T, t2 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t1 > &p1, const │ │ │ │ │ - _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t2 > &p2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t1 > &p1, const │ │ │ │ │ - _P_o_o_l_A_l_l_o_c_a_t_o_r< void, t2 > &p2) │ │ │ │ │ +#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 ********** │ │ │ │ │ -An stl-compliant pool allocator. │ │ │ │ │ -This file implements the classes Pool and PoolAllocator providing memory │ │ │ │ │ -allocation for objects in chunks. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +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/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: poolallocator.hh Source File │ │ │ │ +dune-common: visibility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,519 +74,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
poolallocator.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 © 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_POOLALLOCATOR_HH
│ │ │ │ -
6#define DUNE_COMMON_POOLALLOCATOR_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_VISIBILITY_HH
│ │ │ │ +
6#define DUNE_COMMON_VISIBILITY_HH
│ │ │ │
7
│ │ │ │ -
12#include <numeric>
│ │ │ │ -
13#include <typeinfo>
│ │ │ │ -
14#include <iostream>
│ │ │ │ -
15#include <cassert>
│ │ │ │ -
16#include <new>
│ │ │ │ -
17
│ │ │ │ -
18#ifndef DOXYGEN
│ │ │ │ -
19// forward declarations.
│ │ │ │ -
20// we need to know the test function to declare it friend
│ │ │ │ -
21template<std::size_t size, typename T>
│ │ │ │ -
22struct testPoolMain;
│ │ │ │ -
23#endif
│ │ │ │ -
24
│ │ │ │ -
25namespace Dune
│ │ │ │ -
26{
│ │ │ │ -
27
│ │ │ │ -
28 template<typename T, std::size_t s>
│ │ │ │ -
29 class Pool;
│ │ │ │ -
30
│ │ │ │ -
31 template<typename T, std::size_t s>
│ │ │ │ -
32 class PoolAllocator;
│ │ │ │ -
33
│ │ │ │ -
34}
│ │ │ │ -
35
│ │ │ │ -
36namespace std
│ │ │ │ -
37{
│ │ │ │ -
38 /*
│ │ │ │ -
39 template<class T, std::size_t S>
│ │ │ │ -
40 inline ostream& operator<<(ostream& os, Dune::Pool<T,S>& pool)
│ │ │ │ -
41 {
│ │ │ │ -
42 os<<"pool="<<&pool<<" allocated_="<<pool.allocated_;
│ │ │ │ -
43 return os;
│ │ │ │ -
44 }
│ │ │ │ -
45
│ │ │ │ -
46 template<class T, std::size_t S>
│ │ │ │ -
47 inline ostream& operator<<(ostream& os, Dune::PoolAllocator<T,S>& pool)
│ │ │ │ -
48 {
│ │ │ │ -
49 os<<pool.memoryPool_<<std::endl;
│ │ │ │ -
50 return os;
│ │ │ │ -
51 }
│ │ │ │ -
52 */
│ │ │ │ -
53}
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56namespace Dune
│ │ │ │ -
57{
│ │ │ │ -
88 template<class T, std::size_t s>
│ │ │ │ -
│ │ │ │ -
89 class Pool
│ │ │ │ -
90 {
│ │ │ │ -
91 // make the test function friend
│ │ │ │ -
92 friend struct ::testPoolMain<s,T>;
│ │ │ │ -
93
│ │ │ │ -
94 //friend std::ostream& std::operator<<<>(std::ostream&,Pool<T,s>&);
│ │ │ │ -
95 template< class, std::size_t > friend class PoolAllocator;
│ │ │ │ -
96
│ │ │ │ -
97 private:
│ │ │ │ -
98
│ │ │ │ -
100 struct Reference
│ │ │ │ -
101 {
│ │ │ │ -
102 Reference *next_;
│ │ │ │ -
103 };
│ │ │ │ -
104
│ │ │ │ -
105 public:
│ │ │ │ -
106
│ │ │ │ -
108 typedef T MemberType;
│ │ │ │ -
109
│ │ │ │ -
113 constexpr static int unionSize = (sizeof(MemberType) < sizeof(Reference)) ?
│ │ │ │ -
114 sizeof(Reference) : sizeof(MemberType);
│ │ │ │ -
115
│ │ │ │ -
120 constexpr static int size = (sizeof(MemberType) <= s && sizeof(Reference) <= s) ?
│ │ │ │ -
121 s : unionSize;
│ │ │ │ -
122
│ │ │ │ -
127 constexpr static int alignment = std::lcm(alignof(MemberType), alignof(Reference));
│ │ │ │ -
128
│ │ │ │ -
135 constexpr static int alignedSize = (unionSize % alignment == 0) ?
│ │ │ │ -
136 unionSize :
│ │ │ │ -
137 ((unionSize / alignment + 1) * alignment);
│ │ │ │ -
138
│ │ │ │ -
144 constexpr static int chunkSize = (size % alignment == 0) ?
│ │ │ │ -
145 size : ((size / alignment + 1)* alignment);
│ │ │ │ -
146
│ │ │ │ -
150 constexpr static int elements = (chunkSize / alignedSize);
│ │ │ │ -
151
│ │ │ │ -
152 private:
│ │ │ │ -
154 struct Chunk
│ │ │ │ -
155 {
│ │ │ │ -
156
│ │ │ │ -
157 //friend int testPool<s,T>();
│ │ │ │ -
158
│ │ │ │ -
160 alignas(alignment) char chunk_[chunkSize];
│ │ │ │ -
161
│ │ │ │ -
163 Chunk *next_;
│ │ │ │ -
164 };
│ │ │ │ -
165
│ │ │ │ -
166 public:
│ │ │ │ -
│ │ │ │ -
168 inline Pool();
│ │ │ │ -
│ │ │ │ -
170 inline ~Pool();
│ │ │ │ -
│ │ │ │ -
175 inline void* allocate();
│ │ │ │ -
│ │ │ │ -
180 inline void free(void* o);
│ │ │ │ -
181
│ │ │ │ -
│ │ │ │ -
185 inline void print(std::ostream& os);
│ │ │ │ -
186
│ │ │ │ -
187 private:
│ │ │ │ -
188
│ │ │ │ -
189 // Prevent Copying!
│ │ │ │ -
190 Pool(const Pool<MemberType,s>&);
│ │ │ │ -
191
│ │ │ │ -
192 void operator=(const Pool<MemberType,s>& pool) const;
│ │ │ │ -
194 inline void grow();
│ │ │ │ -
196 Reference *head_;
│ │ │ │ -
198 Chunk *chunks_;
│ │ │ │ -
199 /* @brief The number of currently allocated elements. */
│ │ │ │ -
200 //size_t allocated_;
│ │ │ │ -
201
│ │ │ │ -
202 };
│ │ │ │ -
203
│ │ │ │ -
221 template<class T, std::size_t s>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 {
│ │ │ │ -
224 //friend std::ostream& std::operator<<<>(std::ostream&,PoolAllocator<T,s>&);
│ │ │ │ -
225
│ │ │ │ -
226 public:
│ │ │ │ -
230 typedef T value_type;
│ │ │ │ -
231
│ │ │ │ -
236 constexpr static int size = s * sizeof(value_type);
│ │ │ │ -
237
│ │ │ │ -
241 typedef T* pointer;
│ │ │ │ -
242
│ │ │ │ -
246 typedef const T* const_pointer;
│ │ │ │ -
247
│ │ │ │ -
251 typedef T& reference;
│ │ │ │ -
252
│ │ │ │ -
256 typedef const T& const_reference;
│ │ │ │ -
257
│ │ │ │ -
261 typedef std::size_t size_type;
│ │ │ │ -
262
│ │ │ │ -
266 typedef std::ptrdiff_t difference_type;
│ │ │ │ -
267
│ │ │ │ -
271 inline PoolAllocator();
│ │ │ │ -
272
│ │ │ │ -
276 template<typename U, std::size_t u>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
278 {
│ │ │ │ -
279 // we allow copying but never copy the pool
│ │ │ │ -
280 // to have a clear ownership of allocated pointers.
│ │ │ │ -
281 }
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
285 {
│ │ │ │ -
286 // we allow copying but never copy the pool
│ │ │ │ -
287 // to have a clear ownership of allocated pointers.
│ │ │ │ -
288 // For this behaviour we have to implement
│ │ │ │ -
289 // the copy constructor, because the default
│ │ │ │ -
290 // one would copy the pool and deallocation
│ │ │ │ -
291 // of it would break.
│ │ │ │ -
292 }
│ │ │ │ -
│ │ │ │ -
299 inline pointer allocate(std::size_t n, const_pointer hint=0);
│ │ │ │ -
300
│ │ │ │ -
308 inline void deallocate(pointer p, std::size_t n);
│ │ │ │ -
309
│ │ │ │ -
315 inline void construct(pointer p, const_reference value);
│ │ │ │ -
316
│ │ │ │ -
321 inline void destroy(pointer p);
│ │ │ │ -
322
│ │ │ │ -
326 inline pointer address(reference x) const { return &x; }
│ │ │ │ -
327
│ │ │ │ -
328
│ │ │ │ -
332 inline const_pointer address(const_reference x) const { return &x; }
│ │ │ │ -
333
│ │ │ │ -
337 inline int max_size() const noexcept { return 1; }
│ │ │ │ -
338
│ │ │ │ -
342 template<class U>
│ │ │ │ -
│ │ │ │ -
343 struct rebind
│ │ │ │ -
344 {
│ │ │ │ - │ │ │ │ -
346 };
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ - │ │ │ │ -
350
│ │ │ │ -
351 private:
│ │ │ │ -
355 PoolType memoryPool_;
│ │ │ │ -
356 };
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
358 // specialization for void
│ │ │ │ -
359 template <std::size_t s>
│ │ │ │ -
│ │ │ │ -
360 class PoolAllocator<void,s>
│ │ │ │ -
361 {
│ │ │ │ -
362 public:
│ │ │ │ -
363 typedef void* pointer;
│ │ │ │ -
364 typedef const void* const_pointer;
│ │ │ │ -
365 // reference to void members are impossible.
│ │ │ │ -
366 typedef void value_type;
│ │ │ │ -
│ │ │ │ -
367 template <class U> struct rebind
│ │ │ │ -
368 {
│ │ │ │ - │ │ │ │ -
370 };
│ │ │ │ -
│ │ │ │ -
371 };
│ │ │ │ -
│ │ │ │ -
372
│ │ │ │ -
373
│ │ │ │ -
374 template<typename T1, std::size_t t1, typename T2, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
376 {
│ │ │ │ -
377 return false;
│ │ │ │ -
378 }
│ │ │ │ -
│ │ │ │ -
379
│ │ │ │ -
380
│ │ │ │ -
381 template<typename T1, std::size_t t1, typename T2, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
383 {
│ │ │ │ -
384 return true;
│ │ │ │ -
385 }
│ │ │ │ -
│ │ │ │ -
386
│ │ │ │ -
387 template<typename T, std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
389 {
│ │ │ │ -
390 return &p1==&p2;
│ │ │ │ -
391 }
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
393
│ │ │ │ -
394 template<typename T, std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
396 {
│ │ │ │ -
397 return &p1 != &p2;
│ │ │ │ -
398 }
│ │ │ │ -
│ │ │ │ -
399
│ │ │ │ -
400 template<typename T, std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
402 {
│ │ │ │ -
403 return false;
│ │ │ │ -
404 }
│ │ │ │ -
│ │ │ │ -
405
│ │ │ │ -
406
│ │ │ │ -
407 template<typename T, std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
409 {
│ │ │ │ -
410 return true;
│ │ │ │ -
411 }
│ │ │ │ -
│ │ │ │ -
412
│ │ │ │ -
413 template<std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
415 {
│ │ │ │ -
416 return &p1==&p2;
│ │ │ │ -
417 }
│ │ │ │ -
│ │ │ │ -
418
│ │ │ │ -
419 template<std::size_t t1, std::size_t t2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
421 {
│ │ │ │ -
422 return &p1!=&p2;
│ │ │ │ -
423 }
│ │ │ │ -
│ │ │ │ -
424
│ │ │ │ -
425 template<class T, std::size_t S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
427 : head_(0), chunks_(0) //, allocated_(0)
│ │ │ │ -
428 {
│ │ │ │ -
429 static_assert(sizeof(T)<=unionSize, "Library Error: type T is too big");
│ │ │ │ -
430 static_assert(sizeof(Reference)<=unionSize, "Library Error: type of reference is too big");
│ │ │ │ -
431 static_assert(unionSize<=alignedSize, "Library Error: alignedSize too small");
│ │ │ │ -
432 static_assert(sizeof(T)<=chunkSize, "Library Error: chunkSize must be able to hold at least one value");
│ │ │ │ -
433 static_assert(sizeof(Reference)<=chunkSize, "Library Error: chunkSize must be able to hold at least one reference");
│ │ │ │ -
434 static_assert(chunkSize % alignment == 0, "Library Error: compiler cannot calculate!");
│ │ │ │ -
435 static_assert(elements>=1, "Library Error: we need to hold at least one element!");
│ │ │ │ -
436 static_assert(elements*alignedSize<=chunkSize, "Library Error: aligned elements must fit into chuck!");
│ │ │ │ -
437 }
│ │ │ │ -
│ │ │ │ -
438
│ │ │ │ -
439 template<class T, std::size_t S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
441 {
│ │ │ │ -
442 /*
│ │ │ │ -
443 if(allocated_!=0)
│ │ │ │ -
444 std::cerr<<"There are still "<<allocated_<<" allocated elements by the Pool<"<<typeid(T).name()<<","<<S<<"> "
│ │ │ │ -
445 <<static_cast<void*>(this)<<"! This is a memory leak and might result in segfaults"
│ │ │ │ -
446 <<std::endl;
│ │ │ │ -
447 */
│ │ │ │ -
448 // delete the allocated chunks.
│ │ │ │ -
449 Chunk *current=chunks_;
│ │ │ │ -
450
│ │ │ │ -
451 while(current!=0)
│ │ │ │ -
452 {
│ │ │ │ -
453 Chunk *tmp = current;
│ │ │ │ -
454 current = current->next_;
│ │ │ │ -
455 delete tmp;
│ │ │ │ -
456 }
│ │ │ │ -
457 }
│ │ │ │ -
│ │ │ │ -
458
│ │ │ │ -
459 template<class T, std::size_t S>
│ │ │ │ -
│ │ │ │ -
460 inline void Pool<T,S>::print(std::ostream& os)
│ │ │ │ -
461 {
│ │ │ │ -
462 Chunk* current=chunks_;
│ │ │ │ -
463 while(current) {
│ │ │ │ -
464 os<<current<<" ";
│ │ │ │ -
465 current=current->next_;
│ │ │ │ -
466 }
│ │ │ │ -
467 os<<current<<" ";
│ │ │ │ -
468 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
469
│ │ │ │ -
470 template<class T, std::size_t S>
│ │ │ │ -
471 inline void Pool<T,S>::grow()
│ │ │ │ -
472 {
│ │ │ │ -
473 Chunk *newChunk = new Chunk;
│ │ │ │ -
474 newChunk->next_ = chunks_;
│ │ │ │ -
475 chunks_ = newChunk;
│ │ │ │ -
476
│ │ │ │ -
477 char* start = chunks_->chunk_;
│ │ │ │ -
478 char* last = &start[elements*alignedSize];
│ │ │ │ -
479 Reference* ref = new (start) (Reference);
│ │ │ │ -
480
│ │ │ │ -
481 // grow is only called if head==0,
│ │ │ │ -
482 assert(!head_);
│ │ │ │ -
483
│ │ │ │ -
484 head_ = ref;
│ │ │ │ -
485
│ │ │ │ -
486 for(char* element=start+alignedSize; element<last; element=element+alignedSize) {
│ │ │ │ -
487 Reference* next = new (element) (Reference);
│ │ │ │ -
488 ref->next_ = next;
│ │ │ │ -
489 ref = next;
│ │ │ │ -
490 }
│ │ │ │ -
491 ref->next_=0;
│ │ │ │ -
492 }
│ │ │ │ -
493
│ │ │ │ -
494 template<class T, std::size_t S>
│ │ │ │ -
│ │ │ │ -
495 inline void Pool<T,S>::free(void* b)
│ │ │ │ -
496 {
│ │ │ │ -
497 if(b) {
│ │ │ │ -
498#ifndef NDEBUG
│ │ │ │ -
499 Chunk* current=chunks_;
│ │ │ │ -
500 while(current) {
│ │ │ │ -
501 if(static_cast<void*>(current->chunk_)<=b &&
│ │ │ │ -
502 static_cast<void*>(current->chunk_+chunkSize)>b)
│ │ │ │ -
503 break;
│ │ │ │ -
504 current=current->next_;
│ │ │ │ -
505 }
│ │ │ │ -
506 if(!current)
│ │ │ │ -
507 throw std::bad_alloc();
│ │ │ │ -
508#endif
│ │ │ │ -
509 Reference* freed = static_cast<Reference*>(b);
│ │ │ │ -
510 freed->next_ = head_;
│ │ │ │ -
511 head_ = freed;
│ │ │ │ -
512 //--allocated_;
│ │ │ │ -
513 }
│ │ │ │ -
514 else
│ │ │ │ -
515 {
│ │ │ │ -
516 std::cerr<< "Tried to free null pointer! "<<b<<std::endl;
│ │ │ │ -
517 throw std::bad_alloc();
│ │ │ │ -
518 }
│ │ │ │ -
519 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
520
│ │ │ │ -
521 template<class T, std::size_t S>
│ │ │ │ -
│ │ │ │ -
522 inline void* Pool<T,S>::allocate()
│ │ │ │ -
523 {
│ │ │ │ -
524 if(!head_)
│ │ │ │ -
525 grow();
│ │ │ │ -
526
│ │ │ │ -
527 Reference* p = head_;
│ │ │ │ -
528 head_ = p->next_;
│ │ │ │ -
529 //++allocated_;
│ │ │ │ -
530 return p;
│ │ │ │ -
531 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
532
│ │ │ │ -
533 template<class T, std::size_t s>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
535 { }
│ │ │ │ -
│ │ │ │ -
536
│ │ │ │ -
537 template<class T, std::size_t s>
│ │ │ │ -
538 inline typename PoolAllocator<T,s>::pointer
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
540 {
│ │ │ │ -
541 if(n==1)
│ │ │ │ -
542 return static_cast<T*>(memoryPool_.allocate());
│ │ │ │ -
543 else
│ │ │ │ -
544 throw std::bad_alloc();
│ │ │ │ -
545 }
│ │ │ │ -
│ │ │ │ -
546
│ │ │ │ -
547 template<class T, std::size_t s>
│ │ │ │ -
│ │ │ │ -
548 inline void PoolAllocator<T,s>::deallocate(pointer p, std::size_t n)
│ │ │ │ -
549 {
│ │ │ │ -
550 for(size_t i=0; i<n; i++)
│ │ │ │ -
551 memoryPool_.free(p++);
│ │ │ │ -
552 }
│ │ │ │ -
│ │ │ │ -
553
│ │ │ │ -
554 template<class T, std::size_t s>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
556 {
│ │ │ │ -
557 ::new (static_cast<void*>(p))T(value);
│ │ │ │ -
558 }
│ │ │ │ -
│ │ │ │ -
559
│ │ │ │ -
560 template<class T, std::size_t s>
│ │ │ │ -
561 inline void PoolAllocator<T,s>::destroy(pointer p)
│ │ │ │ -
562 {
│ │ │ │ -
563 p->~T();
│ │ │ │ -
564 }
│ │ │ │ -
565
│ │ │ │ -
567}
│ │ │ │ -
568#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
void construct(pointer p, const_reference value)
Construct an object.
Definition poolallocator.hh:555
│ │ │ │ -
void free(void *o)
Free an object.
Definition poolallocator.hh:495
│ │ │ │ -
~Pool()
Destructor.
Definition poolallocator.hh:440
│ │ │ │ -
void * allocate()
Get a new or recycled object.
Definition poolallocator.hh:522
│ │ │ │ -
void print(std::ostream &os)
Print elements in pool for debugging.
Definition poolallocator.hh:460
│ │ │ │ -
pointer allocate(std::size_t n, const_pointer hint=0)
Allocates objects.
Definition poolallocator.hh:539
│ │ │ │ -
Pool()
Constructor.
Definition poolallocator.hh:426
│ │ │ │ -
void deallocate(pointer p, std::size_t n)
Free objects.
Definition poolallocator.hh:548
│ │ │ │ -
void destroy(pointer p)
Destroy an object without freeing memory.
Definition poolallocator.hh:561
│ │ │ │ -
PoolAllocator()
Constructor.
Definition poolallocator.hh:534
│ │ │ │ -
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:238
│ │ │ │ -
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:260
│ │ │ │ -
STL namespace.
│ │ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Get the 'const' version of a reference to a mutable object.
Definition genericiterator.hh:87
│ │ │ │ -
A memory pool of objects.
Definition poolallocator.hh:90
│ │ │ │ -
static constexpr int alignment
The alignment that suits both the MemberType and the Reference (i.e. their least common multiple).
Definition poolallocator.hh:127
│ │ │ │ -
static constexpr int alignedSize
The aligned size of the type.
Definition poolallocator.hh:135
│ │ │ │ -
static constexpr int chunkSize
The size of each chunk memory chunk.
Definition poolallocator.hh:144
│ │ │ │ -
static constexpr int size
Size requirement. At least one object has to stored.
Definition poolallocator.hh:120
│ │ │ │ -
static constexpr int unionSize
The size of a union of Reference and MemberType.
Definition poolallocator.hh:113
│ │ │ │ -
T MemberType
The type of object we allocate memory for.
Definition poolallocator.hh:108
│ │ │ │ -
static constexpr int elements
The number of element each chunk can hold.
Definition poolallocator.hh:150
│ │ │ │ -
An allocator managing a pool of objects for reuse.
Definition poolallocator.hh:223
│ │ │ │ -
Pool< T, size > PoolType
The type of the memory pool we use.
Definition poolallocator.hh:349
│ │ │ │ -
const_pointer address(const_reference x) const
Convert a reference to a pointer.
Definition poolallocator.hh:332
│ │ │ │ -
const T & const_reference
The constant reference type.
Definition poolallocator.hh:256
│ │ │ │ -
std::size_t size_type
The size type.
Definition poolallocator.hh:261
│ │ │ │ -
T value_type
Type of the values we construct and allocate.
Definition poolallocator.hh:230
│ │ │ │ -
T & reference
The reference type.
Definition poolallocator.hh:251
│ │ │ │ -
PoolAllocator(const PoolAllocator &)
Copy constructor that does not copy the memory pool.
Definition poolallocator.hh:284
│ │ │ │ -
const T * const_pointer
The constant pointer type.
Definition poolallocator.hh:246
│ │ │ │ -
pointer address(reference x) const
Convert a reference to a pointer.
Definition poolallocator.hh:326
│ │ │ │ -
T * pointer
The pointer type.
Definition poolallocator.hh:241
│ │ │ │ -
PoolAllocator(const PoolAllocator< U, u > &)
Copy Constructor that does not copy the memory pool.
Definition poolallocator.hh:277
│ │ │ │ -
std::ptrdiff_t difference_type
The difference_type.
Definition poolallocator.hh:266
│ │ │ │ -
int max_size() const noexcept
Not correctly implemented, yet!
Definition poolallocator.hh:337
│ │ │ │ -
static constexpr int size
The number of objects to fit into one memory chunk allocated.
Definition poolallocator.hh:236
│ │ │ │ -
Rebind the allocator to another type.
Definition poolallocator.hh:344
│ │ │ │ -
PoolAllocator< U, s > other
Definition poolallocator.hh:345
│ │ │ │ -
void value_type
Definition poolallocator.hh:366
│ │ │ │ -
void * pointer
Definition poolallocator.hh:363
│ │ │ │ -
const void * const_pointer
Definition poolallocator.hh:364
│ │ │ │ -
PoolAllocator< U, s > other
Definition poolallocator.hh:369
│ │ │ │ +
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#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,597 +1,44 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -poolallocator.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 © 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_POOLALLOCATOR_HH │ │ │ │ │ -6#define DUNE_COMMON_POOLALLOCATOR_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_VISIBILITY_HH │ │ │ │ │ +6#define DUNE_COMMON_VISIBILITY_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#ifndef DOXYGEN │ │ │ │ │ -19// forward declarations. │ │ │ │ │ -20// we need to know the test function to declare it friend │ │ │ │ │ -21template │ │ │ │ │ -22struct testPoolMain; │ │ │ │ │ -23#endif │ │ │ │ │ -24 │ │ │ │ │ -25namespace _D_u_n_e │ │ │ │ │ -26{ │ │ │ │ │ -27 │ │ │ │ │ -28 template │ │ │ │ │ -29 class Pool; │ │ │ │ │ -30 │ │ │ │ │ -31 template │ │ │ │ │ -32 class PoolAllocator; │ │ │ │ │ -33 │ │ │ │ │ -34} │ │ │ │ │ -35 │ │ │ │ │ -36namespace _s_t_d │ │ │ │ │ -37{ │ │ │ │ │ -38 /* │ │ │ │ │ -39 template │ │ │ │ │ -40 inline ostream& operator<<(ostream& os, Dune::Pool& pool) │ │ │ │ │ -41 { │ │ │ │ │ -42 os<<"pool="<<&pool<<" allocated_="< │ │ │ │ │ -47 inline ostream& operator<<(ostream& os, Dune::PoolAllocator& pool) │ │ │ │ │ -48 { │ │ │ │ │ -49 os< │ │ │ │ │ -_8_9 class _P_o_o_l │ │ │ │ │ -90 { │ │ │ │ │ -91 // make the test function friend │ │ │ │ │ -92 friend struct ::testPoolMain; │ │ │ │ │ -93 │ │ │ │ │ -94 //friend std::ostream& std::operator<<<>(std::ostream&,Pool&); │ │ │ │ │ -_9_5 template< class, std::size_t > friend class _P_o_o_l_A_l_l_o_c_a_t_o_r; │ │ │ │ │ -96 │ │ │ │ │ -97 private: │ │ │ │ │ -98 │ │ │ │ │ -100 struct Reference │ │ │ │ │ -101 { │ │ │ │ │ -102 Reference *next_; │ │ │ │ │ -103 }; │ │ │ │ │ -104 │ │ │ │ │ -105 public: │ │ │ │ │ -106 │ │ │ │ │ -_1_0_8 typedef T _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -109 │ │ │ │ │ -_1_1_3 constexpr static int _u_n_i_o_n_S_i_z_e = (sizeof(_M_e_m_b_e_r_T_y_p_e) < sizeof(Reference)) ? │ │ │ │ │ -114 sizeof(Reference) : sizeof(_M_e_m_b_e_r_T_y_p_e); │ │ │ │ │ -115 │ │ │ │ │ -_1_2_0 constexpr static int _s_i_z_e = (sizeof(_M_e_m_b_e_r_T_y_p_e) <= s && sizeof(Reference) │ │ │ │ │ -<= s) ? │ │ │ │ │ -121 s : _u_n_i_o_n_S_i_z_e; │ │ │ │ │ -122 │ │ │ │ │ -_1_2_7 constexpr static int _a_l_i_g_n_m_e_n_t = std::lcm(alignof(_M_e_m_b_e_r_T_y_p_e), alignof │ │ │ │ │ -(Reference)); │ │ │ │ │ -128 │ │ │ │ │ -_1_3_5 constexpr static int _a_l_i_g_n_e_d_S_i_z_e = (_u_n_i_o_n_S_i_z_e % _a_l_i_g_n_m_e_n_t == 0) ? │ │ │ │ │ -136 _u_n_i_o_n_S_i_z_e : │ │ │ │ │ -137 ((_u_n_i_o_n_S_i_z_e / _a_l_i_g_n_m_e_n_t + 1) * _a_l_i_g_n_m_e_n_t); │ │ │ │ │ -138 │ │ │ │ │ -_1_4_4 constexpr static int _c_h_u_n_k_S_i_z_e = (_s_i_z_e % _a_l_i_g_n_m_e_n_t == 0) ? │ │ │ │ │ -145 _s_i_z_e : ((_s_i_z_e / _a_l_i_g_n_m_e_n_t + 1)* _a_l_i_g_n_m_e_n_t); │ │ │ │ │ -146 │ │ │ │ │ -_1_5_0 constexpr static int _e_l_e_m_e_n_t_s = (_c_h_u_n_k_S_i_z_e / _a_l_i_g_n_e_d_S_i_z_e); │ │ │ │ │ -151 │ │ │ │ │ -152 private: │ │ │ │ │ -154 struct Chunk │ │ │ │ │ -155 { │ │ │ │ │ -156 │ │ │ │ │ -157 //friend int testPool(); │ │ │ │ │ -158 │ │ │ │ │ -160 alignas(_a_l_i_g_n_m_e_n_t) char chunk_[_c_h_u_n_k_S_i_z_e]; │ │ │ │ │ -161 │ │ │ │ │ -163 Chunk *next_; │ │ │ │ │ -164 }; │ │ │ │ │ -165 │ │ │ │ │ -166 public: │ │ │ │ │ -_1_6_8 inline _P_o_o_l(); │ │ │ │ │ -_1_7_0 inline _~_P_o_o_l(); │ │ │ │ │ -_1_7_5 inline void* _a_l_l_o_c_a_t_e(); │ │ │ │ │ -_1_8_0 inline void _f_r_e_e(void* o); │ │ │ │ │ -181 │ │ │ │ │ -_1_8_5 inline void _p_r_i_n_t(std::ostream& os); │ │ │ │ │ -186 │ │ │ │ │ -187 private: │ │ │ │ │ -188 │ │ │ │ │ -189 // Prevent Copying! │ │ │ │ │ -190 _P_o_o_l(const _P_o_o_l_<_M_e_m_b_e_r_T_y_p_e_,_s_>&); │ │ │ │ │ -191 │ │ │ │ │ -192 void operator=(const _P_o_o_l_<_M_e_m_b_e_r_T_y_p_e_,_s_>& pool) const; │ │ │ │ │ -194 inline void grow(); │ │ │ │ │ -196 Reference *head_; │ │ │ │ │ -198 Chunk *chunks_; │ │ │ │ │ -199 /* @brief The number of currently allocated elements. */ │ │ │ │ │ -200 //size_t allocated_; │ │ │ │ │ -201 │ │ │ │ │ -202 }; │ │ │ │ │ -203 │ │ │ │ │ -221 template │ │ │ │ │ -_2_2_2 class _P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -223 { │ │ │ │ │ -224 //friend std::ostream& std::operator<<<>(std:: │ │ │ │ │ -ostream&,PoolAllocator&); │ │ │ │ │ -225 │ │ │ │ │ -226 public: │ │ │ │ │ -_2_3_0 typedef T _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -231 │ │ │ │ │ -_2_3_6 constexpr static int _s_i_z_e = s * sizeof(_v_a_l_u_e___t_y_p_e); │ │ │ │ │ -237 │ │ │ │ │ -_2_4_1 typedef T* _p_o_i_n_t_e_r; │ │ │ │ │ -242 │ │ │ │ │ -_2_4_6 typedef const T* _c_o_n_s_t___p_o_i_n_t_e_r; │ │ │ │ │ -247 │ │ │ │ │ -_2_5_1 typedef T& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -252 │ │ │ │ │ -_2_5_6 typedef const T& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -257 │ │ │ │ │ -_2_6_1 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -262 │ │ │ │ │ -_2_6_6 typedef std::ptrdiff_t _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -267 │ │ │ │ │ -271 inline _P_o_o_l_A_l_l_o_c_a_t_o_r(); │ │ │ │ │ -272 │ │ │ │ │ -276 template │ │ │ │ │ -_2_7_7 inline _P_o_o_l_A_l_l_o_c_a_t_o_r(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_U_,_u_>&) │ │ │ │ │ -278 { │ │ │ │ │ -279 // we allow copying but never copy the pool │ │ │ │ │ -280 // to have a clear ownership of allocated pointers. │ │ │ │ │ -281 } │ │ │ │ │ -282 │ │ │ │ │ -_2_8_4 _P_o_o_l_A_l_l_o_c_a_t_o_r(const _P_o_o_l_A_l_l_o_c_a_t_o_r&) │ │ │ │ │ -285 { │ │ │ │ │ -286 // we allow copying but never copy the pool │ │ │ │ │ -287 // to have a clear ownership of allocated pointers. │ │ │ │ │ -288 // For this behaviour we have to implement │ │ │ │ │ -289 // the copy constructor, because the default │ │ │ │ │ -290 // one would copy the pool and deallocation │ │ │ │ │ -291 // of it would break. │ │ │ │ │ -292 } │ │ │ │ │ -299 inline _p_o_i_n_t_e_r _a_l_l_o_c_a_t_e(std::size_t n, _c_o_n_s_t___p_o_i_n_t_e_r hint=0); │ │ │ │ │ -300 │ │ │ │ │ -308 inline void _d_e_a_l_l_o_c_a_t_e(_p_o_i_n_t_e_r p, std::size_t n); │ │ │ │ │ -309 │ │ │ │ │ -315 inline void _c_o_n_s_t_r_u_c_t(_p_o_i_n_t_e_r p, _c_o_n_s_t___r_e_f_e_r_e_n_c_e value); │ │ │ │ │ -316 │ │ │ │ │ -321 inline void _d_e_s_t_r_o_y(_p_o_i_n_t_e_r p); │ │ │ │ │ -322 │ │ │ │ │ -_3_2_6 inline _p_o_i_n_t_e_r _a_d_d_r_e_s_s(_r_e_f_e_r_e_n_c_e x) const { return &x; } │ │ │ │ │ -327 │ │ │ │ │ -328 │ │ │ │ │ -_3_3_2 inline _c_o_n_s_t___p_o_i_n_t_e_r _a_d_d_r_e_s_s(_c_o_n_s_t___r_e_f_e_r_e_n_c_e x) const { return &x; } │ │ │ │ │ -333 │ │ │ │ │ -_3_3_7 inline int _m_a_x___s_i_z_e() const noexcept { return 1; } │ │ │ │ │ -338 │ │ │ │ │ -342 template │ │ │ │ │ -_3_4_3 struct _r_e_b_i_n_d │ │ │ │ │ -344 { │ │ │ │ │ -_3_4_5 typedef _P_o_o_l_A_l_l_o_c_a_t_o_r_<_U_,_s_> _o_t_h_e_r; │ │ │ │ │ -346 }; │ │ │ │ │ -347 │ │ │ │ │ -_3_4_9 typedef _P_o_o_l_<_T_,_s_i_z_e_> _P_o_o_l_T_y_p_e; │ │ │ │ │ -350 │ │ │ │ │ -351 private: │ │ │ │ │ -355 _P_o_o_l_T_y_p_e memoryPool_; │ │ │ │ │ -356 }; │ │ │ │ │ -357 │ │ │ │ │ -358 // specialization for void │ │ │ │ │ -359 template │ │ │ │ │ -_3_6_0 class _P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -361 { │ │ │ │ │ -362 public: │ │ │ │ │ -_3_6_3 typedef void* _p_o_i_n_t_e_r; │ │ │ │ │ -_3_6_4 typedef const void* _c_o_n_s_t___p_o_i_n_t_e_r; │ │ │ │ │ -365 // reference to void members are impossible. │ │ │ │ │ -_3_6_6 typedef void _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_3_6_7 template struct rebind │ │ │ │ │ -368 { │ │ │ │ │ -_3_6_9 typedef _P_o_o_l_A_l_l_o_c_a_t_o_r_<_U_,_s_> _o_t_h_e_r; │ │ │ │ │ -370 }; │ │ │ │ │ -371 }; │ │ │ │ │ -372 │ │ │ │ │ -373 │ │ │ │ │ -374 template │ │ │ │ │ -_3_7_5 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_1_,_t_1_>&, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_2_,_t_2_>&) │ │ │ │ │ -376 { │ │ │ │ │ -377 return false; │ │ │ │ │ -378 } │ │ │ │ │ -379 │ │ │ │ │ -380 │ │ │ │ │ -381 template │ │ │ │ │ -_3_8_2 bool _o_p_e_r_a_t_o_r_!_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_1_,_t_1_>&, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_2_,_t_2_>&) │ │ │ │ │ -383 { │ │ │ │ │ -384 return true; │ │ │ │ │ -385 } │ │ │ │ │ -386 │ │ │ │ │ -387 template │ │ │ │ │ -_3_8_8 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_1_>& p1, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_2_>& │ │ │ │ │ -p2) │ │ │ │ │ -389 { │ │ │ │ │ -390 return &p1==&p2; │ │ │ │ │ -391 } │ │ │ │ │ -392 │ │ │ │ │ -393 │ │ │ │ │ -394 template │ │ │ │ │ -_3_9_5 bool _o_p_e_r_a_t_o_r_!_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_1_>& p1, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_2_>& │ │ │ │ │ -p2) │ │ │ │ │ -396 { │ │ │ │ │ -397 return &p1 != &p2; │ │ │ │ │ -398 } │ │ │ │ │ -399 │ │ │ │ │ -400 template │ │ │ │ │ -_4_0_1 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_1_>&, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_2_>&) │ │ │ │ │ -402 { │ │ │ │ │ -403 return false; │ │ │ │ │ -404 } │ │ │ │ │ -405 │ │ │ │ │ -406 │ │ │ │ │ -407 template │ │ │ │ │ -_4_0_8 bool _o_p_e_r_a_t_o_r_!_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_1_>&, const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_t_2_>&) │ │ │ │ │ -409 { │ │ │ │ │ -410 return true; │ │ │ │ │ -411 } │ │ │ │ │ -412 │ │ │ │ │ -413 template │ │ │ │ │ -_4_1_4 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_1_>& p1, const │ │ │ │ │ -_P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_2_>& p2) │ │ │ │ │ -415 { │ │ │ │ │ -416 return &p1==&p2; │ │ │ │ │ -417 } │ │ │ │ │ -418 │ │ │ │ │ -419 template │ │ │ │ │ -_4_2_0 bool _o_p_e_r_a_t_o_r_!_=(const _P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_1_>& p1, const │ │ │ │ │ -_P_o_o_l_A_l_l_o_c_a_t_o_r_<_v_o_i_d_,_t_2_>& p2) │ │ │ │ │ -421 { │ │ │ │ │ -422 return &p1!=&p2; │ │ │ │ │ -423 } │ │ │ │ │ -424 │ │ │ │ │ -425 template │ │ │ │ │ -_4_2_6 inline _P_o_o_l_<_T_,_S_>_:_:_P_o_o_l() │ │ │ │ │ -427 : head_(0), chunks_(0) //, allocated_(0) │ │ │ │ │ -428 { │ │ │ │ │ -429 static_assert(sizeof(T)<=_u_n_i_o_n_S_i_z_e, "Library Error: type T is too big"); │ │ │ │ │ -430 static_assert(sizeof(Reference)<=_u_n_i_o_n_S_i_z_e, "Library Error: type of │ │ │ │ │ -reference is too big"); │ │ │ │ │ -431 static_assert(_u_n_i_o_n_S_i_z_e<=_a_l_i_g_n_e_d_S_i_z_e, "Library Error: alignedSize too │ │ │ │ │ -small"); │ │ │ │ │ -432 static_assert(sizeof(T)<=_c_h_u_n_k_S_i_z_e, "Library Error: chunkSize must be able │ │ │ │ │ -to hold at least one value"); │ │ │ │ │ -433 static_assert(sizeof(Reference)<=_c_h_u_n_k_S_i_z_e, "Library Error: chunkSize must │ │ │ │ │ -be able to hold at least one reference"); │ │ │ │ │ -434 static_assert(_c_h_u_n_k_S_i_z_e % _a_l_i_g_n_m_e_n_t == 0, "Library Error: compiler cannot │ │ │ │ │ -calculate!"); │ │ │ │ │ -435 static_assert(_e_l_e_m_e_n_t_s>=1, "Library Error: we need to hold at least one │ │ │ │ │ -element!"); │ │ │ │ │ -436 static_assert(_e_l_e_m_e_n_t_s*_a_l_i_g_n_e_d_S_i_z_e<=_c_h_u_n_k_S_i_z_e, "Library Error: aligned │ │ │ │ │ -elements must fit into chuck!"); │ │ │ │ │ -437 } │ │ │ │ │ -438 │ │ │ │ │ -439 template │ │ │ │ │ -_4_4_0 inline _P_o_o_l_<_T_,_S_>_:_:_~_P_o_o_l() │ │ │ │ │ -441 { │ │ │ │ │ -442 /* │ │ │ │ │ -443 if(allocated_!=0) │ │ │ │ │ -444 std::cerr<<"There are still "< " │ │ │ │ │ -445 <(this)<<"! This is a memory leak and might result in │ │ │ │ │ -segfaults" │ │ │ │ │ -446 <next_; │ │ │ │ │ -455 delete tmp; │ │ │ │ │ -456 } │ │ │ │ │ -457 } │ │ │ │ │ -458 │ │ │ │ │ -459 template │ │ │ │ │ -_4_6_0 inline void _P_o_o_l_<_T_,_S_>_:_:_p_r_i_n_t(std::ostream& os) │ │ │ │ │ -461 { │ │ │ │ │ -462 Chunk* current=chunks_; │ │ │ │ │ -463 while(current) { │ │ │ │ │ -464 os<next_; │ │ │ │ │ -466 } │ │ │ │ │ -467 os< │ │ │ │ │ -471 inline void _P_o_o_l_<_T_,_S_>_:_:_g_r_o_w() │ │ │ │ │ -472 { │ │ │ │ │ -473 Chunk *newChunk = new Chunk; │ │ │ │ │ -474 newChunk->next_ = chunks_; │ │ │ │ │ -475 chunks_ = newChunk; │ │ │ │ │ -476 │ │ │ │ │ -477 char* start = chunks_->chunk_; │ │ │ │ │ -478 char* last = &start[elements*alignedSize]; │ │ │ │ │ -479 Reference* ref = new (start) (Reference); │ │ │ │ │ -480 │ │ │ │ │ -481 // grow is only called if head==0, │ │ │ │ │ -482 assert(!head_); │ │ │ │ │ -483 │ │ │ │ │ -484 head_ = ref; │ │ │ │ │ -485 │ │ │ │ │ -486 for(char* element=start+alignedSize; elementnext_ = next; │ │ │ │ │ -489 ref = next; │ │ │ │ │ -490 } │ │ │ │ │ -491 ref->next_=0; │ │ │ │ │ -492 } │ │ │ │ │ -493 │ │ │ │ │ -494 template │ │ │ │ │ -_4_9_5 inline void _P_o_o_l_<_T_,_S_>_:_:_f_r_e_e(void* b) │ │ │ │ │ -496 { │ │ │ │ │ -497 if(b) { │ │ │ │ │ -498#ifndef NDEBUG │ │ │ │ │ -499 Chunk* current=chunks_; │ │ │ │ │ -500 while(current) { │ │ │ │ │ -501 if(static_cast(current->chunk_)<=b && │ │ │ │ │ -502 static_cast(current->chunk_+chunkSize)>b) │ │ │ │ │ -503 break; │ │ │ │ │ -504 current=current->next_; │ │ │ │ │ -505 } │ │ │ │ │ -506 if(!current) │ │ │ │ │ -507 throw std::bad_alloc(); │ │ │ │ │ -508#endif │ │ │ │ │ -509 Reference* freed = static_cast(b); │ │ │ │ │ -510 freed->next_ = head_; │ │ │ │ │ -511 head_ = freed; │ │ │ │ │ -512 //--allocated_; │ │ │ │ │ -513 } │ │ │ │ │ -514 else │ │ │ │ │ -515 { │ │ │ │ │ -516 std::cerr<< "Tried to free null pointer! "< │ │ │ │ │ -_5_2_2 inline void* _P_o_o_l_<_T_,_S_>_:_:_a_l_l_o_c_a_t_e() │ │ │ │ │ -523 { │ │ │ │ │ -524 if(!head_) │ │ │ │ │ -525 grow(); │ │ │ │ │ -526 │ │ │ │ │ -527 Reference* p = head_; │ │ │ │ │ -528 head_ = p->next_; │ │ │ │ │ -529 //++allocated_; │ │ │ │ │ -530 return p; │ │ │ │ │ -531 } │ │ │ │ │ -532 │ │ │ │ │ -533 template │ │ │ │ │ -_5_3_4 inline _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r() │ │ │ │ │ -535 { } │ │ │ │ │ -536 │ │ │ │ │ -537 template │ │ │ │ │ -538 inline typename _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_p_o_i_n_t_e_r │ │ │ │ │ -_5_3_9 _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_a_l_l_o_c_a_t_e(std::size_t n, _c_o_n_s_t___p_o_i_n_t_e_r) │ │ │ │ │ -540 { │ │ │ │ │ -541 if(n==1) │ │ │ │ │ -542 return static_cast(memoryPool_.allocate()); │ │ │ │ │ -543 else │ │ │ │ │ -544 throw std::bad_alloc(); │ │ │ │ │ -545 } │ │ │ │ │ -546 │ │ │ │ │ -547 template │ │ │ │ │ -_5_4_8 inline void _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_d_e_a_l_l_o_c_a_t_e(_p_o_i_n_t_e_r p, std::size_t n) │ │ │ │ │ -549 { │ │ │ │ │ -550 for(size_t i=0; i │ │ │ │ │ -_5_5_5 inline void _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_c_o_n_s_t_r_u_c_t(_p_o_i_n_t_e_r p, _c_o_n_s_t___r_e_f_e_r_e_n_c_e value) │ │ │ │ │ -556 { │ │ │ │ │ -557 ::new (static_cast(p))T(value); │ │ │ │ │ -558 } │ │ │ │ │ -559 │ │ │ │ │ -560 template │ │ │ │ │ -_5_6_1 inline void _P_o_o_l_A_l_l_o_c_a_t_o_r_<_T_,_s_>_:_:_d_e_s_t_r_o_y(pointer p) │ │ │ │ │ -562 { │ │ │ │ │ -563 p->~T(); │ │ │ │ │ -564 } │ │ │ │ │ -565 │ │ │ │ │ -567} │ │ │ │ │ -568#endif │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -void construct(pointer p, const_reference value) │ │ │ │ │ -Construct an object. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:555 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_f_r_e_e │ │ │ │ │ -void free(void *o) │ │ │ │ │ -Free an object. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:495 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_~_P_o_o_l │ │ │ │ │ -~Pool() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:440 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ -void * allocate() │ │ │ │ │ -Get a new or recycled object. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:522 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_p_r_i_n_t │ │ │ │ │ -void print(std::ostream &os) │ │ │ │ │ -Print elements in pool for debugging. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ -pointer allocate(std::size_t n, const_pointer hint=0) │ │ │ │ │ -Allocates objects. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_P_o_o_l │ │ │ │ │ -Pool() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:426 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_d_e_a_l_l_o_c_a_t_e │ │ │ │ │ -void deallocate(pointer p, std::size_t n) │ │ │ │ │ -Free objects. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:548 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_d_e_s_t_r_o_y │ │ │ │ │ -void destroy(pointer p) │ │ │ │ │ -Destroy an object without freeing memory. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -PoolAllocator() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:534 │ │ │ │ │ -_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:238 │ │ │ │ │ -_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:260 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -Dune namespace. │ │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_P_o_o_l │ │ │ │ │ -A memory pool of objects. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_a_l_i_g_n_m_e_n_t │ │ │ │ │ -static constexpr int alignment │ │ │ │ │ -The alignment that suits both the MemberType and the Reference (i.e. their │ │ │ │ │ -least common multiple). │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_a_l_i_g_n_e_d_S_i_z_e │ │ │ │ │ -static constexpr int alignedSize │ │ │ │ │ -The aligned size of the type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_c_h_u_n_k_S_i_z_e │ │ │ │ │ -static constexpr int chunkSize │ │ │ │ │ -The size of each chunk memory chunk. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_s_i_z_e │ │ │ │ │ -static constexpr int size │ │ │ │ │ -Size requirement. At least one object has to stored. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_u_n_i_o_n_S_i_z_e │ │ │ │ │ -static constexpr int unionSize │ │ │ │ │ -The size of a union of Reference and MemberType. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ -T MemberType │ │ │ │ │ -The type of object we allocate memory for. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_:_:_e_l_e_m_e_n_t_s │ │ │ │ │ -static constexpr int elements │ │ │ │ │ -The number of element each chunk can hold. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -An allocator managing a pool of objects for reuse. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:223 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_P_o_o_l_T_y_p_e │ │ │ │ │ -Pool< T, size > PoolType │ │ │ │ │ -The type of the memory pool we use. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:349 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_a_d_d_r_e_s_s │ │ │ │ │ -const_pointer address(const_reference x) const │ │ │ │ │ -Convert a reference to a pointer. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const T & const_reference │ │ │ │ │ -The constant reference type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The size type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -T value_type │ │ │ │ │ -Type of the values we construct and allocate. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -T & reference │ │ │ │ │ -The reference type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:251 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -PoolAllocator(const PoolAllocator &) │ │ │ │ │ -Copy constructor that does not copy the memory pool. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ -const T * const_pointer │ │ │ │ │ -The constant pointer type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_a_d_d_r_e_s_s │ │ │ │ │ -pointer address(reference x) const │ │ │ │ │ -Convert a reference to a pointer. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_p_o_i_n_t_e_r │ │ │ │ │ -T * pointer │ │ │ │ │ -The pointer type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r │ │ │ │ │ -PoolAllocator(const PoolAllocator< U, u > &) │ │ │ │ │ -Copy Constructor that does not copy the memory pool. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:277 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -std::ptrdiff_t difference_type │ │ │ │ │ -The difference_type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_m_a_x___s_i_z_e │ │ │ │ │ -int max_size() const noexcept │ │ │ │ │ -Not correctly implemented, yet! │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:337 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_s_i_z_e │ │ │ │ │ -static constexpr int size │ │ │ │ │ -The number of objects to fit into one memory chunk allocated. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_r_e_b_i_n_d │ │ │ │ │ -Rebind the allocator to another type. │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:344 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_:_:_r_e_b_i_n_d_:_:_o_t_h_e_r │ │ │ │ │ -PoolAllocator< U, s > other │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -void value_type │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _>_:_:_p_o_i_n_t_e_r │ │ │ │ │ -void * pointer │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:363 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _>_:_:_c_o_n_s_t___p_o_i_n_t_e_r │ │ │ │ │ -const void * const_pointer │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:364 │ │ │ │ │ -_D_u_n_e_:_:_P_o_o_l_A_l_l_o_c_a_t_o_r_<_ _v_o_i_d_,_ _s_ _>_:_:_r_e_b_i_n_d_:_:_o_t_h_e_r │ │ │ │ │ -PoolAllocator< U, s > other │ │ │ │ │ -DDeeffiinniittiioonn poolallocator.hh:369 │ │ │ │ │ +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#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/a00038.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: bitsetvector.hh File Reference │ │ │ │ +dune-common: lru.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,58 +72,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
bitsetvector.hh File Reference
│ │ │ │ +
lru.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <vector>
│ │ │ │ -#include <bitset>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <dune/common/boundschecking.hh>
│ │ │ │ -#include <dune/common/genericiterator.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <list>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

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

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ +

LRU Cache Container, using an STL like interface.

│ │ │ │ +
Author
Christian Engwer
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,48 +1,29 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bitsetvector.hh File Reference │ │ │ │ │ -Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#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> │ │ │ │ │ +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_. │ │ │ │ │ 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_:_:_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 ********** │ │ │ │ │ -Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ +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/a00038_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: bitsetvector.hh Source File │ │ │ │ +dune-common: lru.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,759 +74,238 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
bitsetvector.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 © 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_COMMON_LRU_HH
│ │ │ │ +
6#define DUNE_COMMON_LRU_HH
│ │ │ │
7
│ │ │ │ -
12#include <vector>
│ │ │ │ -
13#include <bitset>
│ │ │ │ -
14#include <iostream>
│ │ │ │ -
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>;
│ │ │ │ -
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:
│ │ │ │ -
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;
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
81 {
│ │ │ │ -
82 bitset b = *this;
│ │ │ │ -
83 b.flip();
│ │ │ │ -
84 return b;
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
89 {
│ │ │ │ -
90 return block_size;
│ │ │ │ -
91 }
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 {
│ │ │ │ -
96 size_type n = 0;
│ │ │ │ -
97 for(size_type i=0; i<block_size; ++i)
│ │ │ │ -
98 n += getBit(i);
│ │ │ │ -
99 return n;
│ │ │ │ -
100 }
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
│ │ │ │ -
103 bool any() const
│ │ │ │ -
104 {
│ │ │ │ -
105 return count();
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
│ │ │ │ -
109 bool none() const
│ │ │ │ -
110 {
│ │ │ │ -
111 return ! any();
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
│ │ │ │ -
115 bool all() const
│ │ │ │ -
116 {
│ │ │ │ -
117 for(size_type i=0; i<block_size; ++i)
│ │ │ │ -
118 if(not test(i))
│ │ │ │ -
119 return false;
│ │ │ │ -
120 return true;
│ │ │ │ -
121 }
│ │ │ │ -
│ │ │ │ -
122
│ │ │ │ -
│ │ │ │ -
124 bool test(size_type n) const
│ │ │ │ -
125 {
│ │ │ │ -
126 return getBit(n);
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
131 {
│ │ │ │ -
132 return getBit(i);
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ -
136 operator bitset() const
│ │ │ │ -
137 {
│ │ │ │ -
138 return blockBitField.getRepr(block_number);
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ -
142 bool operator== (const bitset& bs) const
│ │ │ │ -
143 {
│ │ │ │ -
144 return equals(bs);
│ │ │ │ -
145 }
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
149 {
│ │ │ │ -
150 return equals(bs);
│ │ │ │ -
151 }
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
│ │ │ │ -
154 bool operator!= (const bitset& bs) const
│ │ │ │ -
155 {
│ │ │ │ -
156 return ! equals(bs);
│ │ │ │ -
157 }
│ │ │ │ -
│ │ │ │ -
158
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
161 {
│ │ │ │ -
162 return ! equals(bs);
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
│ │ │ │ -
171 friend std::ostream& operator<< (std::ostream& s, const BitSetVectorConstReference& v)
│ │ │ │ -
172 {
│ │ │ │ -
173 s << "(";
│ │ │ │ -
174 for(int i=0; i<block_size; ++i)
│ │ │ │ -
175 s << v[i];
│ │ │ │ -
176 s << ")";
│ │ │ │ -
177 return s;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ -
180 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
183
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
185 {
│ │ │ │ -
186 return blockBitField.getBit(block_number,i);
│ │ │ │ -
187 }
│ │ │ │ -
│ │ │ │ -
188
│ │ │ │ -
189 template<class BS>
│ │ │ │ -
│ │ │ │ -
190 bool equals(const BS & bs) const
│ │ │ │ -
191 {
│ │ │ │ -
192 bool eq = true;
│ │ │ │ -
193 for(int i=0; i<block_size; ++i)
│ │ │ │ -
194 eq &= (getBit(i) == bs[i]);
│ │ │ │ -
195 return eq;
│ │ │ │ -
196 }
│ │ │ │ -
│ │ │ │ -
197
│ │ │ │ -
198 private:
│ │ │ │ -
203 void operator & () = delete;
│ │ │ │ -
204
│ │ │ │ -
205 friend class BitSetVectorReference<block_size, Alloc>;
│ │ │ │ -
206 };
│ │ │ │ -
│ │ │ │ -
207
│ │ │ │ -
220 template <int block_size, class Alloc>
│ │ │ │ -
│ │ │ │ -
221 class BitSetVectorReference : public BitSetVectorConstReference<block_size,Alloc>
│ │ │ │ -
222 {
│ │ │ │ -
223 protected:
│ │ │ │ -
224
│ │ │ │ - │ │ │ │ -
226 friend class Dune::BitSetVector<block_size, Alloc>;
│ │ │ │ -
227
│ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ +
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 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;
│ │ │ │ +
230 private:
│ │ │ │ +
231 list_type _data;
│ │ │ │ +
232 map_type _index;
│ │ │ │ +
233
│ │ │ │ +
234 };
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
236} // namespace Dune
│ │ │ │
237
│ │ │ │ -
241 typedef typename std::vector<bool, Alloc>::reference reference;
│ │ │ │ -
243 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
│ │ │ │ -
245
│ │ │ │ -
247 typedef size_t size_type;
│ │ │ │ -
248
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
251 {
│ │ │ │ -
252 for(int i=0; i<block_size; ++i)
│ │ │ │ -
253 getBit(i) = b;
│ │ │ │ -
254 return (*this);
│ │ │ │ -
255 }
│ │ │ │ -
│ │ │ │ -
256
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
259 {
│ │ │ │ -
260 for(int i=0; i<block_size; ++i)
│ │ │ │ -
261 getBit(i) = b.test(i);
│ │ │ │ -
262 return (*this);
│ │ │ │ -
263 }
│ │ │ │ -
│ │ │ │ -
264
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
267 {
│ │ │ │ -
268 for(int i=0; i<block_size; ++i)
│ │ │ │ -
269 getBit(i) = b.test(i);
│ │ │ │ -
270 return (*this);
│ │ │ │ -
271 }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
275 {
│ │ │ │ -
276 for(int i=0; i<block_size; ++i)
│ │ │ │ -
277 getBit(i) = b.test(i);
│ │ │ │ -
278 return (*this);
│ │ │ │ -
279 }
│ │ │ │ -
│ │ │ │ -
280
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 {
│ │ │ │ -
284 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
285 getBit(i) = (test(i) & x.test(i));
│ │ │ │ -
286 return *this;
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
291 {
│ │ │ │ -
292 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
293 getBit(i) = (test(i) & x.test(i));
│ │ │ │ -
294 return *this;
│ │ │ │ -
295 }
│ │ │ │ -
│ │ │ │ -
296
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
299 {
│ │ │ │ -
300 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
301 getBit(i) = (test(i) | x.test(i));
│ │ │ │ -
302 return *this;
│ │ │ │ -
303 }
│ │ │ │ -
│ │ │ │ -
304
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
307 {
│ │ │ │ -
308 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
309 getBit(i) = (test(i) | x.test(i));
│ │ │ │ -
310 return *this;
│ │ │ │ -
311 }
│ │ │ │ -
│ │ │ │ -
312
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
315 {
│ │ │ │ -
316 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
317 getBit(i) = (test(i) ^ x.test(i));
│ │ │ │ -
318 return *this;
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
323 {
│ │ │ │ -
324 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
325 getBit(i) = (test(i) ^ x.test(i));
│ │ │ │ -
326 return *this;
│ │ │ │ -
327 }
│ │ │ │ -
│ │ │ │ -
328
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
331 {
│ │ │ │ -
332 for (size_type i=0; i<block_size-n; i++)
│ │ │ │ -
333 getBit(i) = test(i+n);
│ │ │ │ -
334 return *this;
│ │ │ │ -
335 }
│ │ │ │ -
│ │ │ │ -
336
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
339 {
│ │ │ │ -
340 for (size_type i=0; i<block_size-n; i++)
│ │ │ │ -
341 getBit(i+n) = test(i);
│ │ │ │ -
342 return *this;
│ │ │ │ -
343 }
│ │ │ │ -
│ │ │ │ -
344
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
347 {
│ │ │ │ -
348 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
349 set(i);
│ │ │ │ -
350 return *this;
│ │ │ │ -
351 }
│ │ │ │ -
│ │ │ │ -
352
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
355 {
│ │ │ │ -
356 for (size_type i=0; i<block_size; i++)
│ │ │ │ -
357 flip(i);
│ │ │ │ -
358 return *this;
│ │ │ │ -
359 }
│ │ │ │ -
│ │ │ │ -
360
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
363 {
│ │ │ │ -
364 *this = false;
│ │ │ │ -
365 return *this;
│ │ │ │ -
366 }
│ │ │ │ -
│ │ │ │ -
367
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
370 {
│ │ │ │ -
371 getBit(n) = val;
│ │ │ │ -
372 return *this;
│ │ │ │ -
373 }
│ │ │ │ -
│ │ │ │ -
374
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
377 {
│ │ │ │ -
378 set(n, false);
│ │ │ │ -
379 return *this;
│ │ │ │ -
380 }
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
384 {
│ │ │ │ -
385 getBit(n).flip();
│ │ │ │ -
386 return *this;
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388
│ │ │ │ - │ │ │ │ -
390 using BitSetVectorConstReference::operator[];
│ │ │ │ -
391
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
394 {
│ │ │ │ -
395 return getBit(i);
│ │ │ │ -
396 }
│ │ │ │ -
│ │ │ │ -
397
│ │ │ │ -
398 protected:
│ │ │ │ - │ │ │ │ -
400
│ │ │ │ - │ │ │ │ -
402
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
404 {
│ │ │ │ -
405 return blockBitField.getBit(this->block_number,i);
│ │ │ │ -
406 }
│ │ │ │ -
│ │ │ │ -
407 };
│ │ │ │ -
│ │ │ │ -
408
│ │ │ │ -
412 template<int block_size, class Alloc>
│ │ │ │ -
│ │ │ │ -
413 struct const_reference< BitSetVectorReference<block_size,Alloc> >
│ │ │ │ -
414 {
│ │ │ │ - │ │ │ │ -
416 };
│ │ │ │ -
│ │ │ │ -
417
│ │ │ │ -
418 template<int block_size, class Alloc>
│ │ │ │ -
│ │ │ │ -
419 struct const_reference< BitSetVectorConstReference<block_size,Alloc> >
│ │ │ │ -
420 {
│ │ │ │ - │ │ │ │ -
422 };
│ │ │ │ -
│ │ │ │ -
423
│ │ │ │ -
424 template<int block_size, class Alloc>
│ │ │ │ -
│ │ │ │ -
425 struct mutable_reference< BitSetVectorReference<block_size,Alloc> >
│ │ │ │ -
426 {
│ │ │ │ - │ │ │ │ -
428 };
│ │ │ │ -
│ │ │ │ -
429
│ │ │ │ -
430 template<int block_size, class Alloc>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
432 {
│ │ │ │ - │ │ │ │ -
434 };
│ │ │ │ -
│ │ │ │ -
435
│ │ │ │ -
439 template <int block_size, class Allocator=std::allocator<bool> >
│ │ │ │ -
│ │ │ │ -
440 class BitSetVector : private std::vector<bool, Allocator>
│ │ │ │ -
441 {
│ │ │ │ -
443 typedef std::vector<bool, Allocator> BlocklessBaseClass;
│ │ │ │ -
444
│ │ │ │ -
445 public:
│ │ │ │ -
448
│ │ │ │ -
450 typedef std::bitset<block_size> value_type;
│ │ │ │ -
451
│ │ │ │ - │ │ │ │ -
454
│ │ │ │ - │ │ │ │ -
457
│ │ │ │ - │ │ │ │ -
460
│ │ │ │ - │ │ │ │ -
463
│ │ │ │ -
465 typedef typename std::vector<bool, Allocator>::size_type size_type;
│ │ │ │ -
466
│ │ │ │ -
468 typedef Allocator allocator_type;
│ │ │ │ -
470
│ │ │ │ - │ │ │ │ - │ │ │ │ -
476
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
479 return iterator(*this, 0);
│ │ │ │ -
480 }
│ │ │ │ -
│ │ │ │ -
481
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
484 return const_iterator(*this, 0);
│ │ │ │ -
485 }
│ │ │ │ -
│ │ │ │ -
486
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
489 return iterator(*this, size());
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
494 return const_iterator(*this, size());
│ │ │ │ -
495 }
│ │ │ │ -
│ │ │ │ -
496
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
499 BlocklessBaseClass()
│ │ │ │ -
500 {}
│ │ │ │ -
│ │ │ │ -
501
│ │ │ │ -
│ │ │ │ -
503 BitSetVector(const BlocklessBaseClass& blocklessBitField) :
│ │ │ │ -
504 BlocklessBaseClass(blocklessBitField)
│ │ │ │ -
505 {
│ │ │ │ -
506 if (blocklessBitField.size()%block_size != 0)
│ │ │ │ -
507 DUNE_THROW(RangeError, "Vector size is not a multiple of the block size!");
│ │ │ │ -
508 }
│ │ │ │ -
│ │ │ │ -
509
│ │ │ │ -
│ │ │ │ -
513 explicit BitSetVector(int n) :
│ │ │ │ -
514 BlocklessBaseClass(n*block_size)
│ │ │ │ -
515 {}
│ │ │ │ -
│ │ │ │ -
516
│ │ │ │ -
│ │ │ │ -
518 BitSetVector(int n, bool v) :
│ │ │ │ -
519 BlocklessBaseClass(n*block_size,v)
│ │ │ │ -
520 {}
│ │ │ │ -
│ │ │ │ -
521
│ │ │ │ -
│ │ │ │ -
523 void clear()
│ │ │ │ -
524 {
│ │ │ │ -
525 BlocklessBaseClass::clear();
│ │ │ │ -
526 }
│ │ │ │ -
│ │ │ │ -
527
│ │ │ │ -
│ │ │ │ -
529 void resize(int n, bool v = bool())
│ │ │ │ -
530 {
│ │ │ │ -
531 BlocklessBaseClass::resize(n*block_size, v);
│ │ │ │ -
532 }
│ │ │ │ -
│ │ │ │ -
533
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
536 {
│ │ │ │ -
537 return BlocklessBaseClass::size()/block_size;
│ │ │ │ -
538 }
│ │ │ │ -
│ │ │ │ -
539
│ │ │ │ -
│ │ │ │ -
541 void setAll() {
│ │ │ │ -
542 this->assign(BlocklessBaseClass::size(), true);
│ │ │ │ -
543 }
│ │ │ │ -
│ │ │ │ -
544
│ │ │ │ -
│ │ │ │ -
546 void unsetAll() {
│ │ │ │ -
547 this->assign(BlocklessBaseClass::size(), false);
│ │ │ │ -
548 }
│ │ │ │ -
│ │ │ │ -
549
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
552 {
│ │ │ │ -
553 return reference(*this, i);
│ │ │ │ -
554 }
│ │ │ │ -
│ │ │ │ -
555
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
558 {
│ │ │ │ -
559 return const_reference(*this, i);
│ │ │ │ -
560 }
│ │ │ │ -
│ │ │ │ -
561
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
564 {
│ │ │ │ -
565 return reference(*this, size()-1);
│ │ │ │ -
566 }
│ │ │ │ -
│ │ │ │ -
567
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
570 {
│ │ │ │ -
571 return const_reference(*this, size()-1);
│ │ │ │ -
572 }
│ │ │ │ -
│ │ │ │ -
573
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
576 {
│ │ │ │ -
577 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), true);
│ │ │ │ -
578 }
│ │ │ │ -
│ │ │ │ -
579
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
582 {
│ │ │ │ -
583 size_type n = 0;
│ │ │ │ -
584 size_type blocks = size();
│ │ │ │ -
585 for(size_type i=0; i<blocks; ++i)
│ │ │ │ -
586 n += getBit(i,j);
│ │ │ │ -
587 return n;
│ │ │ │ -
588 }
│ │ │ │ -
│ │ │ │ -
589
│ │ │ │ -
│ │ │ │ -
591 friend std::ostream& operator<< (std::ostream& s, const BitSetVector& v)
│ │ │ │ -
592 {
│ │ │ │ -
593 for (size_t i=0; i<v.size(); i++)
│ │ │ │ -
594 s << v[i] << " ";
│ │ │ │ -
595 return s;
│ │ │ │ -
596 }
│ │ │ │ -
│ │ │ │ -
597
│ │ │ │ -
598 private:
│ │ │ │ -
599
│ │ │ │ -
601 value_type getRepr(int i) const
│ │ │ │ -
602 {
│ │ │ │ -
603 value_type bits;
│ │ │ │ -
604 for(int j=0; j<block_size; ++j)
│ │ │ │ -
605 bits.set(j, getBit(i,j));
│ │ │ │ -
606 return bits;
│ │ │ │ -
607 }
│ │ │ │ -
608
│ │ │ │ -
609 typename std::vector<bool>::reference getBit(size_type i, size_type j) {
│ │ │ │ -
610 DUNE_ASSERT_BOUNDS(j < block_size);
│ │ │ │ - │ │ │ │ -
612 return BlocklessBaseClass::operator[](i*block_size+j);
│ │ │ │ -
613 }
│ │ │ │ -
614
│ │ │ │ -
615 typename std::vector<bool>::const_reference getBit(size_type i, size_type j) const {
│ │ │ │ -
616 DUNE_ASSERT_BOUNDS(j < block_size);
│ │ │ │ - │ │ │ │ -
618 return BlocklessBaseClass::operator[](i*block_size+j);
│ │ │ │ -
619 }
│ │ │ │ -
620
│ │ │ │ -
621 friend class BitSetVectorReference<block_size,Allocator>;
│ │ │ │ -
622 friend class BitSetVectorConstReference<block_size,Allocator>;
│ │ │ │ -
623 };
│ │ │ │ -
│ │ │ │ -
624
│ │ │ │ -
625} // namespace Dune
│ │ │ │ -
626
│ │ │ │ -
627#endif
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ -
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
│ │ │ │ +
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
│ │ │ │ -
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:441
│ │ │ │ -
const_reference operator[](int i) const
Return const reference to i-th block.
Definition bitsetvector.hh:557
│ │ │ │ -
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition bitsetvector.hh:478
│ │ │ │ -
BitSetVectorConstReference< block_size, Allocator > * const_pointer
Const pointer to a small block of bits.
Definition bitsetvector.hh:462
│ │ │ │ -
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition bitsetvector.hh:493
│ │ │ │ -
BitSetVectorReference< block_size, Allocator > reference
Reference to a small block of bits.
Definition bitsetvector.hh:453
│ │ │ │ -
size_type countmasked(int j) const
Returns the number of set bits, while each block is masked with 1<<i.
Definition bitsetvector.hh:581
│ │ │ │ -
BitSetVectorConstReference< block_size, Allocator > const_reference
Const reference to a small block of bits.
Definition bitsetvector.hh:456
│ │ │ │ -
iterator end()
Returns an iterator pointing to the end of the vector.
Definition bitsetvector.hh:488
│ │ │ │ -
size_type count() const
Returns the number of bits that are set.
Definition bitsetvector.hh:575
│ │ │ │ -
BitSetVector()
Default constructor.
Definition bitsetvector.hh:498
│ │ │ │ -
void setAll()
Sets all entries to true
Definition bitsetvector.hh:541
│ │ │ │ -
Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > const_iterator
Definition bitsetvector.hh:474
│ │ │ │ -
std::bitset< block_size > value_type
Type of the values stored by the container.
Definition bitsetvector.hh:450
│ │ │ │ -
reference back()
Return reference to last block.
Definition bitsetvector.hh:563
│ │ │ │ -
BitSetVector(const BlocklessBaseClass &blocklessBitField)
Construction from an unblocked bitfield.
Definition bitsetvector.hh:503
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v)
Send bitfield to an output stream.
Definition bitsetvector.hh:591
│ │ │ │ -
const_reference back() const
Return const reference to last block.
Definition bitsetvector.hh:569
│ │ │ │ -
void clear()
Erases all of the elements.
Definition bitsetvector.hh:523
│ │ │ │ -
BitSetVectorReference< block_size, Allocator > * pointer
Pointer to a small block of bits.
Definition bitsetvector.hh:459
│ │ │ │ -
reference operator[](int i)
Return reference to i-th block.
Definition bitsetvector.hh:551
│ │ │ │ -
size_type size() const
Return the number of blocks.
Definition bitsetvector.hh:535
│ │ │ │ -
std::vector< bool, Allocator >::size_type size_type
size type
Definition bitsetvector.hh:465
│ │ │ │ -
BitSetVector(int n, bool v)
Constructor which initializes the field with true or false.
Definition bitsetvector.hh:518
│ │ │ │ -
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition bitsetvector.hh:483
│ │ │ │ -
Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, reference, std::ptrdiff_t, ForwardIteratorFacade > iterator
Definition bitsetvector.hh:473
│ │ │ │ -
void resize(int n, bool v=bool())
Resize field.
Definition bitsetvector.hh:529
│ │ │ │ -
Allocator allocator_type
The type of the allocator.
Definition bitsetvector.hh:468
│ │ │ │ -
BitSetVector(int n)
Definition bitsetvector.hh:513
│ │ │ │ -
void unsetAll()
Sets all entries to false
Definition bitsetvector.hh:546
│ │ │ │ -
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:393
│ │ │ │ -
BitSetVectorReference & reset(size_type n)
Clears bit n.
Definition bitsetvector.hh:376
│ │ │ │ -
BitSetVectorReference & operator<<=(size_type n)
Left shift.
Definition bitsetvector.hh:330
│ │ │ │ -
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:403
│ │ │ │ -
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:362
│ │ │ │ -
BitSetVector & blockBitField
Definition bitsetvector.hh:399
│ │ │ │ -
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:369
│ │ │ │ -
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:338
│ │ │ │ -
BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)
Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition bitsetvector.hh:322
│ │ │ │ -
BitSetVectorReference & flip(size_type n)
Flips bit n.
Definition bitsetvector.hh:383
│ │ │ │ -
BitSetVectorReference & flip()
Flips the value of every bit.
Definition bitsetvector.hh:354
│ │ │ │ -
BitSetVectorReference & set()
Sets every bit.
Definition bitsetvector.hh:346
│ │ │ │ -
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(const BitSetVector &blockBitField_, int block_number_)
Definition bitsetvector.hh:44
│ │ │ │ -
const BitSetVector & blockBitField
Definition bitsetvector.hh:181
│ │ │ │ -
bitset operator>>(size_type n) const
Returns a copy of *this shifted right by n bits.
Definition bitsetvector.hh:72
│ │ │ │ -
const_reference getBit(size_type i) const
Definition bitsetvector.hh:184
│ │ │ │ -
bool operator!=(const bitset &bs) const
Inequality of reference and std::bitset.
Definition bitsetvector.hh:154
│ │ │ │ -
bool equals(const BS &bs) const
Definition bitsetvector.hh:190
│ │ │ │ -
Dune::BitSetVector< block_size, Alloc > BitSetVector
Definition bitsetvector.hh:41
│ │ │ │ -
std::bitset< block_size > bitset
Definition bitsetvector.hh:56
│ │ │ │ -
bool all() const
Returns true if all bits are set.
Definition bitsetvector.hh:115
│ │ │ │ -
size_t size_type
Definition bitsetvector.hh:61
│ │ │ │ -
bitset operator~() const
Returns a copy of *this with all of its bits flipped.
Definition bitsetvector.hh:80
│ │ │ │ -
std::vector< bool, Alloc >::const_reference reference
Definition bitsetvector.hh:59
│ │ │ │ -
size_type size() const
Returns block_size.
Definition bitsetvector.hh:88
│ │ │ │ -
size_type count() const
Returns the number of bits that are set.
Definition bitsetvector.hh:94
│ │ │ │ -
bool none() const
Returns true if no bits are set.
Definition bitsetvector.hh:109
│ │ │ │ -
bool any() const
Returns true if any bits are set.
Definition bitsetvector.hh:103
│ │ │ │ -
int block_number
Definition bitsetvector.hh:182
│ │ │ │ -
std::vector< bool, Alloc >::const_reference const_reference
Definition bitsetvector.hh:60
│ │ │ │ -
BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)=delete
disable assignment operator
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const BitSetVectorConstReference &v)
Definition bitsetvector.hh:171
│ │ │ │ -
BitSetVectorConstReference< block_size, Alloc > type
Definition bitsetvector.hh:415
│ │ │ │ -
BitSetVectorConstReference< block_size, Alloc > type
Definition bitsetvector.hh:421
│ │ │ │ -
BitSetVectorReference< block_size, Alloc > type
Definition bitsetvector.hh:427
│ │ │ │ -
BitSetVectorReference< block_size, Alloc > type
Definition bitsetvector.hh:433
│ │ │ │
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:142
│ │ │ │ +
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,903 +1,267 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -bitsetvector.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 © 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_COMMON_LRU_HH │ │ │ │ │ +6#define DUNE_COMMON_LRU_HH │ │ │ │ │ 7 │ │ │ │ │ -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; │ │ │ │ │ -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) │ │ │ │ │ -= delete; │ │ │ │ │ -53 │ │ │ │ │ -54 public: │ │ │ │ │ -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; │ │ │ │ │ +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_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; isecond; │ │ │ │ │ +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 │ │ │ │ │ -180 protected: │ │ │ │ │ -_1_8_1 const _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; │ │ │ │ │ -_1_8_2 int _b_l_o_c_k___n_u_m_b_e_r; │ │ │ │ │ -183 │ │ │ │ │ -_1_8_4 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _g_e_t_B_i_t(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -185 { │ │ │ │ │ -186 return _b_l_o_c_k_B_i_t_F_i_e_l_d.getBit(_b_l_o_c_k___n_u_m_b_e_r,i); │ │ │ │ │ -187 } │ │ │ │ │ -188 │ │ │ │ │ -189 template │ │ │ │ │ -_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; │ │ │ │ │ -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: │ │ │ │ │ -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; │ │ │ │ │ +_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 │ │ │ │ │ -_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; │ │ │ │ │ +230 private: │ │ │ │ │ +231 list_type _data; │ │ │ │ │ +232 map_type _index; │ │ │ │ │ +233 │ │ │ │ │ +234 }; │ │ │ │ │ +235 │ │ │ │ │ +236} // namespace Dune │ │ │ │ │ 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_>_=(_s_i_z_e___t_y_p_e n) │ │ │ │ │ -339 { │ │ │ │ │ -340 for (_s_i_z_e___t_y_p_e i=0; i_b_l_o_c_k___n_u_m_b_e_r,i); │ │ │ │ │ -406 } │ │ │ │ │ -407 }; │ │ │ │ │ -408 │ │ │ │ │ -412 template │ │ │ │ │ -_4_1_3 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 > │ │ │ │ │ -414 { │ │ │ │ │ -_4_1_5 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; │ │ │ │ │ -416 }; │ │ │ │ │ -417 │ │ │ │ │ -418 template │ │ │ │ │ -_4_1_9 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 > │ │ │ │ │ -420 { │ │ │ │ │ -_4_2_1 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; │ │ │ │ │ -422 }; │ │ │ │ │ -423 │ │ │ │ │ -424 template │ │ │ │ │ -_4_2_5 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 > │ │ │ │ │ -426 { │ │ │ │ │ -_4_2_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_> _t_y_p_e; │ │ │ │ │ -428 }; │ │ │ │ │ -429 │ │ │ │ │ -430 template │ │ │ │ │ -_4_3_1 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 > │ │ │ │ │ -432 { │ │ │ │ │ -_4_3_3 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; │ │ │ │ │ -434 }; │ │ │ │ │ -435 │ │ │ │ │ -439 template > │ │ │ │ │ -_4_4_0 class _B_i_t_S_e_t_V_e_c_t_o_r : private std::vector │ │ │ │ │ -441 { │ │ │ │ │ -443 typedef std::vector BlocklessBaseClass; │ │ │ │ │ -444 │ │ │ │ │ -445 public: │ │ │ │ │ -448 │ │ │ │ │ -_4_5_0 typedef std::bitset _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -451 │ │ │ │ │ -_4_5_3 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; │ │ │ │ │ -454 │ │ │ │ │ -_4_5_6 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; │ │ │ │ │ -457 │ │ │ │ │ -_4_5_9 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; │ │ │ │ │ -460 │ │ │ │ │ -_4_6_2 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; │ │ │ │ │ -463 │ │ │ │ │ -_4_6_5 typedef typename std::vector::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -466 │ │ │ │ │ -_4_6_8 typedef Allocator _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -470 │ │ │ │ │ -_4_7_3 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; │ │ │ │ │ -_4_7_4 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; │ │ │ │ │ -476 │ │ │ │ │ -_4_7_8 _i_t_e_r_a_t_o_r _b_e_g_i_n(){ │ │ │ │ │ -479 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -480 } │ │ │ │ │ -481 │ │ │ │ │ -_4_8_3 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ -484 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -485 } │ │ │ │ │ -486 │ │ │ │ │ -_4_8_8 _i_t_e_r_a_t_o_r _e_n_d(){ │ │ │ │ │ -489 return _i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -_4_9_3 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ -494 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -495 } │ │ │ │ │ -496 │ │ │ │ │ -_4_9_8 _B_i_t_S_e_t_V_e_c_t_o_r() : │ │ │ │ │ -499 BlocklessBaseClass() │ │ │ │ │ -500 {} │ │ │ │ │ -501 │ │ │ │ │ -_5_0_3 _B_i_t_S_e_t_V_e_c_t_o_r(const BlocklessBaseClass& blocklessBitField) : │ │ │ │ │ -504 BlocklessBaseClass(blocklessBitField) │ │ │ │ │ -505 { │ │ │ │ │ -506 if (blocklessBitField.size()%block_size != 0) │ │ │ │ │ -507 _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!"); │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -_5_1_3 explicit _B_i_t_S_e_t_V_e_c_t_o_r(int n) : │ │ │ │ │ -514 BlocklessBaseClass(n*block_size) │ │ │ │ │ -515 {} │ │ │ │ │ -516 │ │ │ │ │ -_5_1_8 _B_i_t_S_e_t_V_e_c_t_o_r(int n, bool v) : │ │ │ │ │ -519 BlocklessBaseClass(n*block_size,v) │ │ │ │ │ -520 {} │ │ │ │ │ -521 │ │ │ │ │ -_5_2_3 void _c_l_e_a_r() │ │ │ │ │ -524 { │ │ │ │ │ -525 BlocklessBaseClass::clear(); │ │ │ │ │ -526 } │ │ │ │ │ -527 │ │ │ │ │ -_5_2_9 void _r_e_s_i_z_e(int n, bool v = bool()) │ │ │ │ │ -530 { │ │ │ │ │ -531 BlocklessBaseClass::resize(n*block_size, v); │ │ │ │ │ -532 } │ │ │ │ │ -533 │ │ │ │ │ -_5_3_5 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -536 { │ │ │ │ │ -537 return BlocklessBaseClass::size()/block_size; │ │ │ │ │ -538 } │ │ │ │ │ -539 │ │ │ │ │ -_5_4_1 void _s_e_t_A_l_l() { │ │ │ │ │ -542 this->_a_s_s_i_g_n(BlocklessBaseClass::size(), true); │ │ │ │ │ -543 } │ │ │ │ │ -544 │ │ │ │ │ -_5_4_6 void _u_n_s_e_t_A_l_l() { │ │ │ │ │ -547 this->_a_s_s_i_g_n(BlocklessBaseClass::size(), false); │ │ │ │ │ -548 } │ │ │ │ │ -549 │ │ │ │ │ -_5_5_1 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](int i) │ │ │ │ │ -552 { │ │ │ │ │ -553 return _r_e_f_e_r_e_n_c_e(*this, i); │ │ │ │ │ -554 } │ │ │ │ │ -555 │ │ │ │ │ -_5_5_7 _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 │ │ │ │ │ -558 { │ │ │ │ │ -559 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(*this, i); │ │ │ │ │ -560 } │ │ │ │ │ -561 │ │ │ │ │ -_5_6_3 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ -564 { │ │ │ │ │ -565 return _r_e_f_e_r_e_n_c_e(*this, _s_i_z_e()-1); │ │ │ │ │ -566 } │ │ │ │ │ -567 │ │ │ │ │ -_5_6_9 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const │ │ │ │ │ -570 { │ │ │ │ │ -571 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(*this, _s_i_z_e()-1); │ │ │ │ │ -572 } │ │ │ │ │ -573 │ │ │ │ │ -_5_7_5 _s_i_z_e___t_y_p_e _c_o_u_n_t() const │ │ │ │ │ -576 { │ │ │ │ │ -577 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), │ │ │ │ │ -true); │ │ │ │ │ -578 } │ │ │ │ │ -579 │ │ │ │ │ -_5_8_1 _s_i_z_e___t_y_p_e _c_o_u_n_t_m_a_s_k_e_d(int j) const │ │ │ │ │ -582 { │ │ │ │ │ -583 _s_i_z_e___t_y_p_e n = 0; │ │ │ │ │ -584 _s_i_z_e___t_y_p_e blocks = _s_i_z_e(); │ │ │ │ │ -585 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) { │ │ │ │ │ -610 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j < block_size); │ │ │ │ │ -611 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _s_i_z_e()); │ │ │ │ │ -612 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ -613 } │ │ │ │ │ -614 │ │ │ │ │ -_6_1_5 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 { │ │ │ │ │ -616 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j < block_size); │ │ │ │ │ -617 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _s_i_z_e()); │ │ │ │ │ -618 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ -619 } │ │ │ │ │ -620 │ │ │ │ │ -621 friend class _B_i_t_S_e_t_V_e_c_t_o_r_R_e_f_e_r_e_n_c_e; │ │ │ │ │ -622 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; │ │ │ │ │ -623 }; │ │ │ │ │ -624 │ │ │ │ │ -625} // namespace Dune │ │ │ │ │ -626 │ │ │ │ │ -627#endif │ │ │ │ │ -_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -_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. │ │ │ │ │ +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___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 │ │ │ │ │ _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:441 │ │ │ │ │ -_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:557 │ │ │ │ │ -_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:478 │ │ │ │ │ -_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:462 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:493 │ │ │ │ │ -_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:453 │ │ │ │ │ -_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:456 │ │ │ │ │ -_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:488 │ │ │ │ │ -_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:575 │ │ │ │ │ -_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:498 │ │ │ │ │ -_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:541 │ │ │ │ │ -_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:474 │ │ │ │ │ -_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:450 │ │ │ │ │ -_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:563 │ │ │ │ │ -_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:503 │ │ │ │ │ -_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:591 │ │ │ │ │ -_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:569 │ │ │ │ │ -_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:523 │ │ │ │ │ -_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:459 │ │ │ │ │ -_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:551 │ │ │ │ │ -_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:535 │ │ │ │ │ -_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:465 │ │ │ │ │ -_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:518 │ │ │ │ │ -_D_u_n_e_:_:_B_i_t_S_e_t_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bitsetvector.hh:483 │ │ │ │ │ -_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:473 │ │ │ │ │ -_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:529 │ │ │ │ │ -_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:468 │ │ │ │ │ -_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:513 │ │ │ │ │ -_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:546 │ │ │ │ │ -_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:393 │ │ │ │ │ -_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:376 │ │ │ │ │ -_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:330 │ │ │ │ │ -_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: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_:_:_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:362 │ │ │ │ │ -_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:399 │ │ │ │ │ -_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:369 │ │ │ │ │ -_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:338 │ │ │ │ │ -_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:322 │ │ │ │ │ -_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:383 │ │ │ │ │ -_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:354 │ │ │ │ │ -_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:346 │ │ │ │ │ -_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_:_:_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_= │ │ │ │ │ -BitSetVectorConstReference & operator=(const BitSetVectorConstReference │ │ │ │ │ -&b)=delete │ │ │ │ │ -disable 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_:_:_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:415 │ │ │ │ │ -_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:421 │ │ │ │ │ -_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:427 │ │ │ │ │ -_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:433 │ │ │ │ │ _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:142 │ │ │ │ │ +_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/a00041.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indices.hh File Reference │ │ │ │ +dune-common: referencehelper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,127 +74,55 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions | │ │ │ │ Variables
│ │ │ │ -
indices.hh File Reference
│ │ │ │ +
referencehelper.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <stdexcept>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <functional>
│ │ │ │
│ │ │ │

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].
 
namespace  Dune::Indices::Literals
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Typedefs

template<std::size_t i>
using Dune::index_constant = std::integral_constant< std::size_t, i >
 An index constant with value i.
 
template<class T >
using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>
 Type trait to resolve std::reference_wrapper.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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>...
 
template<char... digits>
constexpr auto Dune::Indices::Literals::operator""_ic ()
 Literal to create an index compile-time constant.
 
template<char... digits>
constexpr auto Dune::Indices::Literals::operator""_uc ()
 Literal to create an unsigned integer compile-time constant.
 
template<char... digits>
constexpr auto Dune::Indices::Literals::operator""_sc ()
 Literal to create a signed integer compile-time constant.
 
template<class T , T value>
constexpr auto Dune::Indices::Literals::operator- (std::integral_constant< T, value >)
 Negation operator for integral constants.
 
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

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.
 
template<class T >
constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
 Helper to detect if given type is a std::reference_wrapper.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,117 +1,40 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ 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 │ │ │ │ │ +referencehelper.hh File Reference │ │ │ │ │ #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. │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_n_d_i_c_e_s │ │ │ │ │ -  Namespace with predefined compile time indices for the range │ │ │ │ │ - [0,19]. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s │ │ │ │ │ -  │ │ │ │ │ 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. │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ 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... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s_:_:_o_p_e_r_a_t_o_r_"_"___i_c () │ │ │ │ │ -  Literal to create an index compile-time constant. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s_:_:_o_p_e_r_a_t_o_r_"_"___u_c () │ │ │ │ │ -  Literal to create an unsigned integer compile-time │ │ │ │ │ - constant. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s_:_:_o_p_e_r_a_t_o_r_"_"___s_c () │ │ │ │ │ -  Literal to create a signed integer compile-time │ │ │ │ │ - constant. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s_:_:_o_p_e_r_a_t_o_r_- (std:: │ │ │ │ │ - integral_constant< T, value >) │ │ │ │ │ -  Negation operator for integral constants. │ │ │ │ │ +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. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + const auto &  _D_u_n_e_:_:_r_e_s_o_l_v_e_R_e_f (T &&gf)=delete │ │ │ │ │ +  │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ 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. │ │ │ │ │ +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. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: indices.hh Source File │ │ │ │ +dune-common: referencehelper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,191 +74,92 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
indices.hh
│ │ │ │ +
referencehelper.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © 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 <stdexcept>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ -
12#include <utility>
│ │ │ │ -
13
│ │ │ │ -
14namespace Dune
│ │ │ │ -
15{
│ │ │ │ -
28 template<std::size_t i>
│ │ │ │ -
29 using index_constant = std::integral_constant<std::size_t, i>;
│ │ │ │ -
30
│ │ │ │ -
31
│ │ │ │ -
32
│ │ │ │ -
│ │ │ │ -
49 namespace Indices
│ │ │ │ -
50 {
│ │ │ │ -
52 inline constexpr index_constant< 0> _0 = {};
│ │ │ │ -
53
│ │ │ │ -
55 inline constexpr index_constant< 1> _1 = {};
│ │ │ │ -
56
│ │ │ │ -
58 inline constexpr index_constant< 2> _2 = {};
│ │ │ │ -
59
│ │ │ │ -
61 inline constexpr index_constant< 3> _3 = {};
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ -
64 inline constexpr index_constant< 4> _4 = {};
│ │ │ │ -
65
│ │ │ │ -
67 inline constexpr index_constant< 5> _5 = {};
│ │ │ │ -
68
│ │ │ │ -
70 inline constexpr index_constant< 6> _6 = {};
│ │ │ │ -
71
│ │ │ │ -
73 inline constexpr index_constant< 7> _7 = {};
│ │ │ │ -
74
│ │ │ │ -
76 inline constexpr index_constant< 8> _8 = {};
│ │ │ │ -
77
│ │ │ │ -
79 inline constexpr index_constant< 9> _9 = {};
│ │ │ │ -
80
│ │ │ │ -
82 inline constexpr index_constant<10> _10 = {};
│ │ │ │ -
83
│ │ │ │ -
85 inline constexpr index_constant<11> _11 = {};
│ │ │ │ +
81template<class T>
│ │ │ │ +
│ │ │ │ +
82constexpr T& resolveRef(std::reference_wrapper<T> gf) noexcept
│ │ │ │ +
83{
│ │ │ │ +
84 return gf.get();
│ │ │ │ +
85}
│ │ │ │ +
│ │ │ │
86
│ │ │ │ -
88 inline constexpr index_constant<12> _12 = {};
│ │ │ │ -
89
│ │ │ │ -
91 inline constexpr index_constant<13> _13 = {};
│ │ │ │ -
92
│ │ │ │ -
94 inline constexpr index_constant<14> _14 = {};
│ │ │ │ -
95
│ │ │ │ -
97 inline constexpr index_constant<15> _15 = {};
│ │ │ │ -
98
│ │ │ │ -
100 inline constexpr index_constant<16> _16 = {};
│ │ │ │ +
87
│ │ │ │ +
88
│ │ │ │ +
99template<class T>
│ │ │ │ +
100using ResolveRef_t = std::remove_reference_t<decltype(Dune::resolveRef(std::declval<T&>()))>;
│ │ │ │
101
│ │ │ │ -
103 inline constexpr index_constant<17> _17 = {};
│ │ │ │ +
102
│ │ │ │ +
103} // namespace Dune
│ │ │ │
104
│ │ │ │ -
106 inline constexpr index_constant<18> _18 = {};
│ │ │ │ -
107
│ │ │ │ -
109 inline constexpr index_constant<19> _19 = {};
│ │ │ │ -
110
│ │ │ │ -
111 } // namespace Indices
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
123 template<class F, class I, I... i>
│ │ │ │ -
│ │ │ │ -
124 decltype(auto) constexpr unpackIntegerSequence(F&& f, std::integer_sequence<I, i...> sequence)
│ │ │ │ -
125 {
│ │ │ │ -
126 return f(std::integral_constant<I, i>()...);
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
129
│ │ │ │ -
│ │ │ │ -
130 namespace Indices { inline namespace Literals
│ │ │ │ -
131 {
│ │ │ │ -
132 namespace Impl
│ │ │ │ -
133 {
│ │ │ │ -
134 // convert a single character into an unsigned integer
│ │ │ │ -
135 constexpr unsigned char2digit (const char c)
│ │ │ │ -
136 {
│ │ │ │ -
137 if (c >= '0' && c <= '9')
│ │ │ │ -
138 return unsigned(c) - unsigned('0');
│ │ │ │ -
139 else {
│ │ │ │ -
140 throw std::invalid_argument("Character is not a digit.");
│ │ │ │ -
141 return 0u;
│ │ │ │ -
142 }
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ -
145 // convert a sequence of character digits into an unsigned integer
│ │ │ │ -
146 template <class T, char... digits>
│ │ │ │ -
147 constexpr T chars2number ()
│ │ │ │ -
148 {
│ │ │ │ -
149 const char arr[] = {digits...};
│ │ │ │ -
150 T result = 0;
│ │ │ │ -
151 T power = 1;
│ │ │ │ -
152 const T base = 10;
│ │ │ │ -
153
│ │ │ │ -
154 const int N = sizeof...(digits);
│ │ │ │ -
155 for (int i = 0; i < N; ++i) {
│ │ │ │ -
156 char c = arr[N - 1 - i];
│ │ │ │ -
157 result+= char2digit(c) * power;
│ │ │ │ -
158 power *= base;
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
161 return result;
│ │ │ │ -
162 }
│ │ │ │ -
163
│ │ │ │ -
164 } //namespace Impl
│ │ │ │ -
165
│ │ │ │ -
172 template <char... digits>
│ │ │ │ -
│ │ │ │ -
173 constexpr auto operator"" _ic()
│ │ │ │ -
174 {
│ │ │ │ -
175 return std::integral_constant<std::size_t, Impl::chars2number<std::size_t,digits...>()>{};
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
184 template <char... digits>
│ │ │ │ -
│ │ │ │ -
185 constexpr auto operator"" _uc()
│ │ │ │ -
186 {
│ │ │ │ -
187 return std::integral_constant<unsigned, Impl::chars2number<unsigned,digits...>()>{};
│ │ │ │ -
188 }
│ │ │ │ -
│ │ │ │ -
189
│ │ │ │ -
196 template <char... digits>
│ │ │ │ -
│ │ │ │ -
197 constexpr auto operator"" _sc()
│ │ │ │ -
198 {
│ │ │ │ -
199 return std::integral_constant<int, Impl::chars2number<int,digits...>()>{};
│ │ │ │ -
200 }
│ │ │ │ -
│ │ │ │ -
201
│ │ │ │ -
208 template <class T, T value>
│ │ │ │ -
│ │ │ │ -
209 constexpr auto operator- (std::integral_constant<T,value>)
│ │ │ │ -
210 {
│ │ │ │ -
211 return std::integral_constant<std::make_signed_t<T>, -value>{};
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213
│ │ │ │ -
214 }} //namespace Indices::Literals
│ │ │ │ -
│ │ │ │ -
215} //namespace Dune
│ │ │ │ -
216
│ │ │ │ -
217#endif // DUNE_COMMON_INDICES_HH
│ │ │ │ -
constexpr index_constant< 16 > _16
Compile time index with value 16.
Definition indices.hh:100
│ │ │ │ -
constexpr index_constant< 15 > _15
Compile time index with value 15.
Definition indices.hh:97
│ │ │ │ -
constexpr index_constant< 8 > _8
Compile time index with value 8.
Definition indices.hh:76
│ │ │ │ -
constexpr index_constant< 7 > _7
Compile time index with value 7.
Definition indices.hh:73
│ │ │ │ -
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition indices.hh:52
│ │ │ │ -
constexpr index_constant< 9 > _9
Compile time index with value 9.
Definition indices.hh:79
│ │ │ │ -
constexpr index_constant< 14 > _14
Compile time index with value 14.
Definition indices.hh:94
│ │ │ │ -
constexpr index_constant< 1 > _1
Compile time index with value 1.
Definition indices.hh:55
│ │ │ │ -
constexpr index_constant< 3 > _3
Compile time index with value 3.
Definition indices.hh:61
│ │ │ │ -
constexpr index_constant< 12 > _12
Compile time index with value 12.
Definition indices.hh:88
│ │ │ │ -
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition indices.hh:124
│ │ │ │ -
constexpr auto operator-(std::integral_constant< T, value >)
Negation operator for integral constants.
Definition indices.hh:209
│ │ │ │ -
constexpr index_constant< 11 > _11
Compile time index with value 11.
Definition indices.hh:85
│ │ │ │ -
constexpr index_constant< 18 > _18
Compile time index with value 18.
Definition indices.hh:106
│ │ │ │ -
constexpr index_constant< 13 > _13
Compile time index with value 13.
Definition indices.hh:91
│ │ │ │ -
constexpr index_constant< 5 > _5
Compile time index with value 5.
Definition indices.hh:67
│ │ │ │ -
constexpr index_constant< 17 > _17
Compile time index with value 17.
Definition indices.hh:103
│ │ │ │ -
constexpr index_constant< 10 > _10
Compile time index with value 10.
Definition indices.hh:82
│ │ │ │ -
constexpr index_constant< 2 > _2
Compile time index with value 2.
Definition indices.hh:58
│ │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition indices.hh:29
│ │ │ │ -
constexpr index_constant< 19 > _19
Compile time index with value 19.
Definition indices.hh:109
│ │ │ │ -
constexpr index_constant< 6 > _6
Compile time index with value 6.
Definition indices.hh:70
│ │ │ │ -
constexpr index_constant< 4 > _4
Compile time index with value 4.
Definition indices.hh:64
│ │ │ │ +
105
│ │ │ │ +
106
│ │ │ │ +
107#endif // DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
constexpr bool IsReferenceWrapper_v
Helper to detect if given type is a std::reference_wrapper.
Definition referencehelper.hh:35
│ │ │ │ +
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition referencehelper.hh:47
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
constexpr Base power(Base m, Exponent p)
Power method for integer exponents.
Definition math.hh:75
│ │ │ │ +
std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> ResolveRef_t
Type trait to resolve std::reference_wrapper.
Definition referencehelper.hh:100
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,249 +1,98 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -indices.hh │ │ │ │ │ +referencehelper.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_COMMON_INDICES_HH │ │ │ │ │ -7#define DUNE_COMMON_INDICES_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14namespace _D_u_n_e │ │ │ │ │ -15{ │ │ │ │ │ -28 template │ │ │ │ │ -_2_9 using _i_n_d_e_x___c_o_n_s_t_a_n_t = std::integral_constant; │ │ │ │ │ -30 │ │ │ │ │ -31 │ │ │ │ │ -32 │ │ │ │ │ -_4_9 namespace Indices │ │ │ │ │ -50 { │ │ │ │ │ -_5_2 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _0_> ___0 = {}; │ │ │ │ │ -53 │ │ │ │ │ -_5_5 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _1_> ___1 = {}; │ │ │ │ │ -56 │ │ │ │ │ -_5_8 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _2_> ___2 = {}; │ │ │ │ │ -59 │ │ │ │ │ -_6_1 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _3_> ___3 = {}; │ │ │ │ │ +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 │ │ │ │ │ +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 │ │ │ │ │ -_6_4 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _4_> ___4 = {}; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _5_> ___5 = {}; │ │ │ │ │ -68 │ │ │ │ │ -_7_0 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _6_> ___6 = {}; │ │ │ │ │ -71 │ │ │ │ │ -_7_3 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _7_> ___7 = {}; │ │ │ │ │ -74 │ │ │ │ │ -_7_6 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _8_> ___8 = {}; │ │ │ │ │ -77 │ │ │ │ │ -_7_9 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_ _9_> ___9 = {}; │ │ │ │ │ -80 │ │ │ │ │ -_8_2 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_0_> ___1_0 = {}; │ │ │ │ │ -83 │ │ │ │ │ -_8_5 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_1_> ___1_1 = {}; │ │ │ │ │ +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 │ │ │ │ │ -_8_8 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_2_> ___1_2 = {}; │ │ │ │ │ -89 │ │ │ │ │ -_9_1 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_3_> ___1_3 = {}; │ │ │ │ │ -92 │ │ │ │ │ -_9_4 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_4_> ___1_4 = {}; │ │ │ │ │ -95 │ │ │ │ │ -_9_7 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_5_> ___1_5 = {}; │ │ │ │ │ -98 │ │ │ │ │ -_1_0_0 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_6_> ___1_6 = {}; │ │ │ │ │ +87 │ │ │ │ │ +88 │ │ │ │ │ +99template │ │ │ │ │ +_1_0_0using _R_e_s_o_l_v_e_R_e_f___t = std::remove_reference_t()))>; │ │ │ │ │ 101 │ │ │ │ │ -_1_0_3 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_7_> ___1_7 = {}; │ │ │ │ │ +102 │ │ │ │ │ +103} // namespace Dune │ │ │ │ │ 104 │ │ │ │ │ -_1_0_6 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_8_> ___1_8 = {}; │ │ │ │ │ -107 │ │ │ │ │ -_1_0_9 inline constexpr _i_n_d_e_x___c_o_n_s_t_a_n_t_<_1_9_> ___1_9 = {}; │ │ │ │ │ -110 │ │ │ │ │ -111 } // namespace Indices │ │ │ │ │ -112 │ │ │ │ │ -123 template │ │ │ │ │ -_1_2_4 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) │ │ │ │ │ -125 { │ │ │ │ │ -126 return f(std::integral_constant()...); │ │ │ │ │ -127 } │ │ │ │ │ -128 │ │ │ │ │ -129 │ │ │ │ │ -_1_3_0 namespace Indices { inline namespace Literals │ │ │ │ │ -131 { │ │ │ │ │ -132 namespace Impl │ │ │ │ │ -133 { │ │ │ │ │ -134 // convert a single character into an unsigned integer │ │ │ │ │ -135 constexpr unsigned char2digit (const char c) │ │ │ │ │ -136 { │ │ │ │ │ -137 if (c >= '0' && c <= '9') │ │ │ │ │ -138 return unsigned(c) - unsigned('0'); │ │ │ │ │ -139 else { │ │ │ │ │ -140 throw std::invalid_argument("Character is not a digit."); │ │ │ │ │ -141 return 0u; │ │ │ │ │ -142 } │ │ │ │ │ -143 } │ │ │ │ │ -144 │ │ │ │ │ -145 // convert a sequence of character digits into an unsigned integer │ │ │ │ │ -146 template │ │ │ │ │ -147 constexpr T chars2number () │ │ │ │ │ -148 { │ │ │ │ │ -149 const char arr[] = {digits...}; │ │ │ │ │ -150 T result = 0; │ │ │ │ │ -151 T _p_o_w_e_r = 1; │ │ │ │ │ -152 const T base = 10; │ │ │ │ │ -153 │ │ │ │ │ -154 const int N = sizeof...(digits); │ │ │ │ │ -155 for (int i = 0; i < N; ++i) { │ │ │ │ │ -156 char c = arr[N - 1 - i]; │ │ │ │ │ -157 result+= char2digit(c) * _p_o_w_e_r; │ │ │ │ │ -158 _p_o_w_e_r *= base; │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -161 return result; │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -164 } //namespace Impl │ │ │ │ │ -165 │ │ │ │ │ -172 template │ │ │ │ │ -_1_7_3 constexpr auto operator"" _ic() │ │ │ │ │ -174 { │ │ │ │ │ -175 return std::integral_constant()>{}; │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -184 template │ │ │ │ │ -_1_8_5 constexpr auto operator"" _uc() │ │ │ │ │ -186 { │ │ │ │ │ -187 return std::integral_constant()>{}; │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -196 template │ │ │ │ │ -_1_9_7 constexpr auto operator"" _sc() │ │ │ │ │ -198 { │ │ │ │ │ -199 return std::integral_constant()>{}; │ │ │ │ │ -200 } │ │ │ │ │ -201 │ │ │ │ │ -208 template │ │ │ │ │ -_2_0_9 constexpr auto _o_p_e_r_a_t_o_r_-_ (std::integral_constant) │ │ │ │ │ -210 { │ │ │ │ │ -211 return std::integral_constant, -value>{}; │ │ │ │ │ -212 } │ │ │ │ │ -213 │ │ │ │ │ -214 }} //namespace Indices::Literals │ │ │ │ │ -215} //namespace Dune │ │ │ │ │ -216 │ │ │ │ │ -217#endif // DUNE_COMMON_INDICES_HH │ │ │ │ │ -_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:100 │ │ │ │ │ -_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:97 │ │ │ │ │ -_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:76 │ │ │ │ │ -_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:73 │ │ │ │ │ -_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:52 │ │ │ │ │ -_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:79 │ │ │ │ │ -_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:94 │ │ │ │ │ -_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:55 │ │ │ │ │ -_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:61 │ │ │ │ │ -_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:88 │ │ │ │ │ -_D_u_n_e_:_:_u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e │ │ │ │ │ -decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, │ │ │ │ │ -i... > sequence) │ │ │ │ │ -Unpack an std::integer_sequence to std::integral_constant... │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:_L_i_t_e_r_a_l_s_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -constexpr auto operator-(std::integral_constant< T, value >) │ │ │ │ │ -Negation operator for integral constants. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:209 │ │ │ │ │ -_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:85 │ │ │ │ │ -_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:106 │ │ │ │ │ -_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:91 │ │ │ │ │ -_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:67 │ │ │ │ │ -_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:103 │ │ │ │ │ -_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:82 │ │ │ │ │ -_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:58 │ │ │ │ │ -_D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_i_c_e_s_:_:___1_9 │ │ │ │ │ -constexpr index_constant< 19 > _19 │ │ │ │ │ -Compile time index with value 19. │ │ │ │ │ -DDeeffiinniittiioonn indices.hh:109 │ │ │ │ │ -_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:70 │ │ │ │ │ -_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:64 │ │ │ │ │ +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. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_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 │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: vc.hh File Reference │ │ │ │ +dune-common: float_cmp.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,25 +69,121 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
vc.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
float_cmp.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ - │ │ │ │ +
#include "float_cmp.hh"
│ │ │ │ +#include <vector>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

│ │ │ │ -

Detailed Description

│ │ │ │ -

Compatibility header for including <Vc/Vc>

│ │ │ │ -

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

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

│ │ │ │ +Classes

struct  Dune::FloatCmp::EpsilonType< T >
 Mapping of value type to epsilon type. More...
 
struct  Dune::FloatCmp::EpsilonType< std::vector< T, A > >
 Specialization of EpsilonType for std::vector. More...
 
struct  Dune::FloatCmp::EpsilonType< FieldVector< T, n > >
 Specialization of EpsilonType for Dune::FieldVector. More...
 
struct  Dune::FloatCmp::DefaultEpsilon< T, relativeWeak >
 
struct  Dune::FloatCmp::DefaultEpsilon< T, relativeStrong >
 
struct  Dune::FloatCmp::DefaultEpsilon< T, absolute >
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::FloatCmp
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

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 T >
bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
template<class T >
bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
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>
Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 
template<class I , class T >
Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
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
 
template<class I , class T , CmpStyle cstyle>
Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 
template<class I , class T >
Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
 
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,15 +1,126 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -vc.hh File Reference │ │ │ │ │ -Compatibility header for including _M_o_r_e_._._. │ │ │ │ │ +_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 │ │ │ │ │ +float_cmp.cc File Reference │ │ │ │ │ +#include "_f_l_o_a_t___c_m_p_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Compatibility header for including │ │ │ │ │ -Certain versions (1.3.2) of Vc (_h_t_t_p_s_:_/_/_g_i_t_h_u_b_._c_o_m_/_V_c_D_e_v_e_l_/_V_c) have a problem │ │ │ │ │ -with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _T_ _> │ │ │ │ │ +  Mapping of value type to epsilon type. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +  Specialization of _E_p_s_i_l_o_n_T_y_p_e for std::vector. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _n_ _>_ _> │ │ │ │ │ +  Specialization of _E_p_s_i_l_o_n_T_y_p_e for _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +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_,_ _r_e_l_a_t_i_v_e_W_e_a_k_ _> │ │ │ │ │ +  │ │ │ │ │ +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_,_ _r_e_l_a_t_i_v_e_S_t_r_o_n_g_ _> │ │ │ │ │ +  │ │ │ │ │ +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_,_ _a_b_s_o_l_u_t_e_ _> │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_l_o_a_t_C_m_p │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +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 │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >:: │ │ │ │ │ + value()) │ │ │ │ │ +  │ │ │ │ │ +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_:_:_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()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >::value()) │ │ │ │ │ +  │ │ │ │ │ +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 │ │ │ │ │ +  │ │ │ │ │ +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()) │ │ │ │ │ +  │ │ │ │ │ +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, _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e >::value()) │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: vc.hh Source File │ │ │ │ +dune-common: float_cmp.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,38 +74,628 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
vc.hh
│ │ │ │ +
float_cmp.cc
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_COMMON_VC_HH
│ │ │ │ -
4#define DUNE_COMMON_VC_HH
│ │ │ │ -
5
│ │ │ │ -
15#if HAVE_VC
│ │ │ │ -
16
│ │ │ │ -
17// include Vc's macro definitions
│ │ │ │ -
18#include <Vc/global.h>
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ +
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +
5#include "float_cmp.hh"
│ │ │ │ +
6
│ │ │ │ +
7#include <vector>
│ │ │ │ +
8#include <limits>
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <cstdlib>
│ │ │ │ + │ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
│ │ │ │ +
16 namespace FloatCmp {
│ │ │ │ +
17 // traits
│ │ │ │
19
│ │ │ │ -
20// undefine the macro that signals C++17 support, if set
│ │ │ │ -
21#ifdef Vc_CXX17
│ │ │ │ -
22#undef Vc_CXX17
│ │ │ │ -
23#endif
│ │ │ │ -
24
│ │ │ │ -
25// include the rest of Vc
│ │ │ │ -
26#include <Vc/Vc>
│ │ │ │ -
27
│ │ │ │ -
28#endif // HAVE_VC
│ │ │ │ -
29
│ │ │ │ -
30#endif // DUNE_COMMON_VC_HH
│ │ │ │ +
│ │ │ │ +
23 template<class T> struct EpsilonType {
│ │ │ │ +
25 typedef T Type;
│ │ │ │ +
26 };
│ │ │ │ +
│ │ │ │ +
28
│ │ │ │ +
33 template<class T, typename A>
│ │ │ │ +
│ │ │ │ +
34 struct EpsilonType<std::vector<T, A> > {
│ │ │ │ +
36 typedef typename EpsilonType<T>::Type Type;
│ │ │ │ +
37 };
│ │ │ │ +
│ │ │ │ +
39
│ │ │ │ +
44 template<class T, int n>
│ │ │ │ +
│ │ │ │ +
45 struct EpsilonType<FieldVector<T, n> > {
│ │ │ │ +
47 typedef typename EpsilonType<T>::Type Type;
│ │ │ │ +
48 };
│ │ │ │ +
│ │ │ │ +
49
│ │ │ │ +
50 // default epsilon
│ │ │ │ +
51 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
53 static typename EpsilonType<T>::Type value()
│ │ │ │ +
54 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
│ │ │ │ +
│ │ │ │ +
55 };
│ │ │ │ +
│ │ │ │ +
56 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
58 static typename EpsilonType<T>::Type value()
│ │ │ │ +
59 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
│ │ │ │ +
│ │ │ │ +
60 };
│ │ │ │ +
│ │ │ │ +
61 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
63 static typename EpsilonType<T>::Type value()
│ │ │ │ +
64 { return std::max(std::numeric_limits<typename EpsilonType<T>::Type>::epsilon(), 1e-6); }
│ │ │ │ +
│ │ │ │ +
65 };
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
67 namespace Impl {
│ │ │ │ +
68 // basic comparison
│ │ │ │ +
69 template<class T, CmpStyle style = defaultCmpStyle>
│ │ │ │ +
70 struct eq_t;
│ │ │ │ +
71 template<class T>
│ │ │ │ +
72 struct eq_t<T, relativeWeak> {
│ │ │ │ +
73 static bool eq(const T &first,
│ │ │ │ +
74 const T &second,
│ │ │ │ + │ │ │ │ +
76 {
│ │ │ │ +
77 using std::abs;
│ │ │ │ +
78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second));
│ │ │ │ +
79 }
│ │ │ │ +
80 };
│ │ │ │ +
81 template<class T>
│ │ │ │ +
82 struct eq_t<T, relativeStrong> {
│ │ │ │ +
83 static bool eq(const T &first,
│ │ │ │ +
84 const T &second,
│ │ │ │ + │ │ │ │ +
86 {
│ │ │ │ +
87 using std::abs;
│ │ │ │ +
88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second));
│ │ │ │ +
89 }
│ │ │ │ +
90 };
│ │ │ │ +
91 template<class T>
│ │ │ │ +
92 struct eq_t<T, absolute> {
│ │ │ │ +
93 static bool eq(const T &first,
│ │ │ │ +
94 const T &second,
│ │ │ │ + │ │ │ │ +
96 {
│ │ │ │ +
97 using std::abs;
│ │ │ │ +
98 return abs(first-second) <= epsilon;
│ │ │ │ +
99 }
│ │ │ │ +
100 };
│ │ │ │ +
101 template<class T, CmpStyle cstyle>
│ │ │ │ +
102 struct eq_t_std_vec {
│ │ │ │ +
103 typedef std::vector<T> V;
│ │ │ │ +
104 static bool eq(const V &first,
│ │ │ │ +
105 const V &second,
│ │ │ │ +
106 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
│ │ │ │ +
107 auto size = first.size();
│ │ │ │ +
108 if(size != second.size()) return false;
│ │ │ │ +
109 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ +
110 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
│ │ │ │ +
111 return false;
│ │ │ │ +
112 return true;
│ │ │ │ +
113 }
│ │ │ │ +
114 };
│ │ │ │ +
115 template< class T>
│ │ │ │ +
116 struct eq_t<std::vector<T>, relativeWeak> : eq_t_std_vec<T, relativeWeak> {};
│ │ │ │ +
117 template< class T>
│ │ │ │ +
118 struct eq_t<std::vector<T>, relativeStrong> : eq_t_std_vec<T, relativeStrong> {};
│ │ │ │ +
119 template< class T>
│ │ │ │ +
120 struct eq_t<std::vector<T>, absolute> : eq_t_std_vec<T, absolute> {};
│ │ │ │ +
121
│ │ │ │ +
122 template<class T, int n, CmpStyle cstyle>
│ │ │ │ +
123 struct eq_t_fvec {
│ │ │ │ +
124 typedef Dune::FieldVector<T, n> V;
│ │ │ │ +
125 static bool eq(const V &first,
│ │ │ │ +
126 const V &second,
│ │ │ │ +
127 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
│ │ │ │ +
128 for(int i = 0; i < n; ++i)
│ │ │ │ +
129 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
│ │ │ │ +
130 return false;
│ │ │ │ +
131 return true;
│ │ │ │ +
132 }
│ │ │ │ +
133 };
│ │ │ │ +
134 template< class T, int n >
│ │ │ │ +
135 struct eq_t< Dune::FieldVector<T, n>, relativeWeak> : eq_t_fvec<T, n, relativeWeak> {};
│ │ │ │ +
136 template< class T, int n >
│ │ │ │ +
137 struct eq_t< Dune::FieldVector<T, n>, relativeStrong> : eq_t_fvec<T, n, relativeStrong> {};
│ │ │ │ +
138 template< class T, int n >
│ │ │ │ +
139 struct eq_t< Dune::FieldVector<T, n>, absolute> : eq_t_fvec<T, n, absolute> {};
│ │ │ │ +
140 } // namespace Impl
│ │ │ │ +
141
│ │ │ │ +
142 // operations in functional style
│ │ │ │ +
143 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
144 bool eq(const T &first,
│ │ │ │ +
145 const T &second,
│ │ │ │ +
146 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
147 {
│ │ │ │ +
148 return Impl::eq_t<T, style>::eq(first, second, epsilon);
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
151 bool ne(const T &first,
│ │ │ │ +
152 const T &second,
│ │ │ │ +
153 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
154 {
│ │ │ │ +
155 return !eq<T, style>(first, second, epsilon);
│ │ │ │ +
156 }
│ │ │ │ +
│ │ │ │ +
157 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
158 bool gt(const T &first,
│ │ │ │ +
159 const T &second,
│ │ │ │ +
160 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
161 {
│ │ │ │ +
162 return first > second && ne<T, style>(first, second, epsilon);
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
164 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
165 bool lt(const T &first,
│ │ │ │ +
166 const T &second,
│ │ │ │ +
167 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
168 {
│ │ │ │ +
169 return first < second && ne<T, style>(first, second, epsilon);
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │ +
171 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
172 bool ge(const T &first,
│ │ │ │ +
173 const T &second,
│ │ │ │ +
174 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
175 {
│ │ │ │ +
176 return first > second || eq<T, style>(first, second, epsilon);
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178 template <class T, CmpStyle style>
│ │ │ │ +
│ │ │ │ +
179 bool le(const T &first,
│ │ │ │ +
180 const T &second,
│ │ │ │ +
181 typename EpsilonType<T>::Type epsilon)
│ │ │ │ +
182 {
│ │ │ │ +
183 return first < second || eq<T, style>(first, second, epsilon);
│ │ │ │ +
184 }
│ │ │ │ +
│ │ │ │ +
185
│ │ │ │ +
186 // default template arguments
│ │ │ │ +
187 template <class T>
│ │ │ │ +
│ │ │ │ +
188 bool eq(const T &first,
│ │ │ │ +
189 const T &second,
│ │ │ │ + │ │ │ │ +
191 {
│ │ │ │ +
192 return eq<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194 template <class T>
│ │ │ │ +
│ │ │ │ +
195 bool ne(const T &first,
│ │ │ │ +
196 const T &second,
│ │ │ │ + │ │ │ │ +
198 {
│ │ │ │ +
199 return ne<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
200 }
│ │ │ │ +
│ │ │ │ +
201 template <class T>
│ │ │ │ +
│ │ │ │ +
202 bool gt(const T &first,
│ │ │ │ +
203 const T &second,
│ │ │ │ + │ │ │ │ +
205 {
│ │ │ │ +
206 return gt<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208 template <class T>
│ │ │ │ +
│ │ │ │ +
209 bool lt(const T &first,
│ │ │ │ +
210 const T &second,
│ │ │ │ + │ │ │ │ +
212 {
│ │ │ │ +
213 return lt<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
214 }
│ │ │ │ +
│ │ │ │ +
215 template <class T>
│ │ │ │ +
│ │ │ │ +
216 bool ge(const T &first,
│ │ │ │ +
217 const T &second,
│ │ │ │ + │ │ │ │ +
219 {
│ │ │ │ +
220 return ge<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
221 }
│ │ │ │ +
│ │ │ │ +
222 template <class T>
│ │ │ │ +
│ │ │ │ +
223 bool le(const T &first,
│ │ │ │ +
224 const T &second,
│ │ │ │ + │ │ │ │ +
226 {
│ │ │ │ +
227 return le<T, defaultCmpStyle>(first, second, epsilon);
│ │ │ │ +
228 }
│ │ │ │ +
│ │ │ │ +
229
│ │ │ │ +
230 // rounding operations
│ │ │ │ +
231 namespace Impl {
│ │ │ │ +
232 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
│ │ │ │ +
233 struct round_t;
│ │ │ │ +
234 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
235 struct round_t<I, T, cstyle, downward> {
│ │ │ │ +
236 static I
│ │ │ │ +
237 round(const T &val,
│ │ │ │ + │ │ │ │ +
239 // first get an approximation
│ │ │ │ +
240 I lower = I(val);
│ │ │ │ +
241 I upper;
│ │ │ │ +
242 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
│ │ │ │ +
243 if(T(lower) > val) { upper = lower; lower--; }
│ │ │ │ +
244 else upper = lower+1;
│ │ │ │ +
245 if(le<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
│ │ │ │ +
246 return lower;
│ │ │ │ +
247 else return upper;
│ │ │ │ +
248 }
│ │ │ │ +
249 };
│ │ │ │ +
250 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
251 struct round_t<I, T, cstyle, upward> {
│ │ │ │ +
252 static I
│ │ │ │ +
253 round(const T &val,
│ │ │ │ + │ │ │ │ +
255 // first get an approximation
│ │ │ │ +
256 I lower = I(val);
│ │ │ │ +
257 I upper;
│ │ │ │ +
258 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
│ │ │ │ +
259 if(T(lower) > val) { upper = lower; lower--; }
│ │ │ │ +
260 else upper = lower+1;
│ │ │ │ +
261 if(lt<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
│ │ │ │ +
262 return lower;
│ │ │ │ +
263 else return upper;
│ │ │ │ +
264 }
│ │ │ │ +
265 };
│ │ │ │ +
266 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
267 struct round_t<I, T, cstyle, towardZero> {
│ │ │ │ +
268 static I
│ │ │ │ +
269 round(const T &val,
│ │ │ │ + │ │ │ │ +
271 if(val > T(0))
│ │ │ │ +
272 return round_t<I, T, cstyle, downward>::round(val, epsilon);
│ │ │ │ +
273 else return round_t<I, T, cstyle, upward>::round(val, epsilon);
│ │ │ │ +
274 }
│ │ │ │ +
275 };
│ │ │ │ +
276 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
277 struct round_t<I, T, cstyle, towardInf> {
│ │ │ │ +
278 static I
│ │ │ │ +
279 round(const T &val,
│ │ │ │ + │ │ │ │ +
281 if(val > T(0))
│ │ │ │ +
282 return round_t<I, T, cstyle, upward>::round(val, epsilon);
│ │ │ │ +
283 else return round_t<I, T, cstyle, downward>::round(val, epsilon);
│ │ │ │ +
284 }
│ │ │ │ +
285 };
│ │ │ │ +
286 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
287 struct round_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
│ │ │ │ +
288 static std::vector<I>
│ │ │ │ +
289 round(const T &val,
│ │ │ │ + │ │ │ │ +
291 unsigned int size = val.size();
│ │ │ │ +
292 std::vector<I> res(size);
│ │ │ │ +
293 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ +
294 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
│ │ │ │ +
295 return res;
│ │ │ │ +
296 }
│ │ │ │ +
297 };
│ │ │ │ +
298 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
299 struct round_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
│ │ │ │ + │ │ │ │ +
301 round(const T &val,
│ │ │ │ + │ │ │ │ + │ │ │ │ +
304 for(int i = 0; i < n; ++i)
│ │ │ │ +
305 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
│ │ │ │ +
306 return res;
│ │ │ │ +
307 }
│ │ │ │ +
308 };
│ │ │ │ +
309 } // end namespace Impl
│ │ │ │ +
310 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
│ │ │ │ +
311 I round(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
│ │ │ │ +
312 {
│ │ │ │ +
313 return Impl::round_t<I, T, cstyle, rstyle>::round(val, epsilon);
│ │ │ │ +
314 }
│ │ │ │ +
│ │ │ │ +
315 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
│ │ │ │ +
316 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
│ │ │ │ +
317 {
│ │ │ │ +
318 return round<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320 template<class I, class T, RoundingStyle rstyle>
│ │ │ │ +
321 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
│ │ │ │ +
322 {
│ │ │ │ +
323 return round<I, T, defaultCmpStyle, rstyle>(val, epsilon);
│ │ │ │ +
324 }
│ │ │ │ +
325 template<class I, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
327 {
│ │ │ │ +
328 return round<I, T, defaultCmpStyle>(val, epsilon);
│ │ │ │ +
329 }
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
331 // truncation
│ │ │ │ +
332 namespace Impl {
│ │ │ │ +
333 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
│ │ │ │ +
334 struct trunc_t;
│ │ │ │ +
335 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
336 struct trunc_t<I, T, cstyle, downward> {
│ │ │ │ +
337 static I
│ │ │ │ +
338 trunc(const T &val,
│ │ │ │ + │ │ │ │ +
340 // this should be optimized away unless needed
│ │ │ │ +
341 if(!std::numeric_limits<I>::is_signed)
│ │ │ │ +
342 // make sure this works for all useful cases even if I is an unsigned type
│ │ │ │ +
343 if(eq<T, cstyle>(val, T(0), epsilon)) return I(0);
│ │ │ │ +
344 // first get an approximation
│ │ │ │ +
345 I lower = I(val); // now |val-lower| < 1
│ │ │ │ +
346 // make sure we're really lower in case the cast truncated to an unexpected direction
│ │ │ │ +
347 if(T(lower) > val) lower--; // now val-lower < 1
│ │ │ │ +
348 // check whether lower + 1 is approximately val
│ │ │ │ +
349 if(eq<T, cstyle>(T(lower+1), val, epsilon))
│ │ │ │ +
350 return lower+1;
│ │ │ │ +
351 else return lower;
│ │ │ │ +
352 }
│ │ │ │ +
353 };
│ │ │ │ +
354 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
355 struct trunc_t<I, T, cstyle, upward> {
│ │ │ │ +
356 static I
│ │ │ │ +
357 trunc(const T &val,
│ │ │ │ + │ │ │ │ +
359 I upper = trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ +
360 if(ne<T, cstyle>(T(upper), val, epsilon)) ++upper;
│ │ │ │ +
361 return upper;
│ │ │ │ +
362 }
│ │ │ │ +
363 };
│ │ │ │ +
364 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
365 struct trunc_t<I, T, cstyle, towardZero> {
│ │ │ │ +
366 static I
│ │ │ │ +
367 trunc(const T &val,
│ │ │ │ + │ │ │ │ +
369 if(val > T(0)) return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ +
370 else return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
│ │ │ │ +
371 }
│ │ │ │ +
372 };
│ │ │ │ +
373 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
374 struct trunc_t<I, T, cstyle, towardInf> {
│ │ │ │ +
375 static I
│ │ │ │ +
376 trunc(const T &val,
│ │ │ │ + │ │ │ │ +
378 if(val > T(0)) return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
│ │ │ │ +
379 else return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
│ │ │ │ +
380 }
│ │ │ │ +
381 };
│ │ │ │ +
382 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
383 struct trunc_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
│ │ │ │ +
384 static std::vector<I>
│ │ │ │ +
385 trunc(const std::vector<T> &val,
│ │ │ │ + │ │ │ │ +
387 unsigned int size = val.size();
│ │ │ │ +
388 std::vector<I> res(size);
│ │ │ │ +
389 for(unsigned int i = 0; i < size; ++i)
│ │ │ │ +
390 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
│ │ │ │ +
391 return res;
│ │ │ │ +
392 }
│ │ │ │ +
393 };
│ │ │ │ +
394 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
395 struct trunc_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
400 for(int i = 0; i < n; ++i)
│ │ │ │ +
401 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
│ │ │ │ +
402 return res;
│ │ │ │ +
403 }
│ │ │ │ +
404 };
│ │ │ │ +
405 } // namespace Impl
│ │ │ │ +
406 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
│ │ │ │ +
│ │ │ │ +
407 I trunc(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
│ │ │ │ +
408 {
│ │ │ │ +
409 return Impl::trunc_t<I, T, cstyle, rstyle>::trunc(val, epsilon);
│ │ │ │ +
410 }
│ │ │ │ +
│ │ │ │ +
411 template<class I, class T, CmpStyle cstyle>
│ │ │ │ +
│ │ │ │ +
412 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
│ │ │ │ +
413 {
│ │ │ │ +
414 return trunc<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
│ │ │ │ +
415 }
│ │ │ │ +
│ │ │ │ +
416 template<class I, class T, RoundingStyle rstyle>
│ │ │ │ +
417 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
│ │ │ │ +
418 {
│ │ │ │ +
419 return trunc<I, T, defaultCmpStyle, rstyle>(val, epsilon);
│ │ │ │ +
420 }
│ │ │ │ +
421 template<class I, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
423 {
│ │ │ │ +
424 return trunc<I, T, defaultCmpStyle>(val, epsilon);
│ │ │ │ +
425 }
│ │ │ │ +
│ │ │ │ +
426 } //namespace Dune
│ │ │ │ +
│ │ │ │ +
427
│ │ │ │ +
428 // oo interface
│ │ │ │ +
429 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
431 FloatCmpOps(EpsilonType epsilon) : epsilon_(epsilon) {}
│ │ │ │ +
│ │ │ │ +
432
│ │ │ │ +
433
│ │ │ │ +
434 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
437 {
│ │ │ │ +
438 return epsilon_;
│ │ │ │ +
439 }
│ │ │ │ +
│ │ │ │ +
440
│ │ │ │ +
441 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
442 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
444 {
│ │ │ │ +
445 epsilon_ = epsilon__;
│ │ │ │ +
446 }
│ │ │ │ +
│ │ │ │ +
447
│ │ │ │ +
448
│ │ │ │ +
449 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
451 eq(const ValueType &first, const ValueType &second) const
│ │ │ │ +
452 {
│ │ │ │ +
453 return Dune::FloatCmp::eq<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
454 }
│ │ │ │ +
│ │ │ │ +
455
│ │ │ │ +
456 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
458 ne(const ValueType &first, const ValueType &second) const
│ │ │ │ +
459 {
│ │ │ │ +
460 return Dune::FloatCmp::ne<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
461 }
│ │ │ │ +
│ │ │ │ +
462
│ │ │ │ +
463 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
465 gt(const ValueType &first, const ValueType &second) const
│ │ │ │ +
466 {
│ │ │ │ +
467 return Dune::FloatCmp::gt<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
468 }
│ │ │ │ +
│ │ │ │ +
469
│ │ │ │ +
470 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
472 lt(const ValueType &first, const ValueType &second) const
│ │ │ │ +
473 {
│ │ │ │ +
474 return Dune::FloatCmp::lt<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
475 }
│ │ │ │ +
│ │ │ │ +
476
│ │ │ │ +
477 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
479 ge(const ValueType &first, const ValueType &second) const
│ │ │ │ +
480 {
│ │ │ │ +
481 return Dune::FloatCmp::ge<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
482 }
│ │ │ │ +
│ │ │ │ +
483
│ │ │ │ +
484 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
486 le(const ValueType &first, const ValueType &second) const
│ │ │ │ +
487 {
│ │ │ │ +
488 return Dune::FloatCmp::le<ValueType, cstyle>(first, second, epsilon_);
│ │ │ │ +
489 }
│ │ │ │ +
│ │ │ │ +
490
│ │ │ │ +
491
│ │ │ │ +
492 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
493 template<class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
495 round(const ValueType &val) const
│ │ │ │ +
496 {
│ │ │ │ +
497 return Dune::FloatCmp::round<I, ValueType, cstyle, rstyle_>(val, epsilon_);
│ │ │ │ +
498 }
│ │ │ │ +
│ │ │ │ +
499
│ │ │ │ +
500 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
│ │ │ │ +
501 template<class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
503 trunc(const ValueType &val) const
│ │ │ │ +
504 {
│ │ │ │ +
505 return Dune::FloatCmp::trunc<I, ValueType, cstyle, rstyle_>(val, epsilon_);
│ │ │ │ +
506 }
│ │ │ │ +
│ │ │ │ +
507
│ │ │ │ +
508} //namespace Dune
│ │ │ │ +
Various ways to compare floating-point numbers.
│ │ │ │ +
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ +
bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for inequality using epsilon
Definition float_cmp.cc:151
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
@ 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
│ │ │ │ +
STL namespace.
│ │ │ │ +
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
│ │ │ │ +
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ +
Mapping of value type to epsilon type.
Definition float_cmp.cc:23
│ │ │ │ +
T Type
The epsilon type corresponding to value type T.
Definition float_cmp.cc:25
│ │ │ │ +
EpsilonType< T >::Type Type
The epsilon type corresponding to value type std::vector<T, A>
Definition float_cmp.cc:36
│ │ │ │ +
EpsilonType< T >::Type Type
The epsilon type corresponding to value type Dune::FieldVector<T, n>
Definition float_cmp.cc:47
│ │ │ │ +
static EpsilonType< T >::Type value()
Definition float_cmp.cc:53
│ │ │ │ +
static EpsilonType< T >::Type value()
Definition float_cmp.cc:58
│ │ │ │ +
static EpsilonType< T >::Type value()
Definition float_cmp.cc:63
│ │ │ │ +
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.
│ │ │ │ +
bool le(const ValueType &first, const ValueType &second) const
test if first lesser or equal second
Definition float_cmp.cc:486
│ │ │ │ +
FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value())
construct an operations object
Definition float_cmp.cc:431
│ │ │ │ +
bool eq(const ValueType &first, const ValueType &second) const
test for equality using epsilon
Definition float_cmp.cc:451
│ │ │ │ +
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
│ │ │ │ +
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,32 +1,712 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -vc.hh │ │ │ │ │ +float_cmp.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ -2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_COMMON_VC_HH │ │ │ │ │ -4#define DUNE_COMMON_VC_HH │ │ │ │ │ -5 │ │ │ │ │ -15#if HAVE_VC │ │ │ │ │ -16 │ │ │ │ │ -17// include Vc's macro definitions │ │ │ │ │ -18#include │ │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +5#include "_f_l_o_a_t___c_m_p_._h_h" │ │ │ │ │ +6 │ │ │ │ │ +7#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ +12 │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14 │ │ │ │ │ +15 │ │ │ │ │ +_1_6 namespace FloatCmp { │ │ │ │ │ +17 // traits │ │ │ │ │ 19 │ │ │ │ │ -20// undefine the macro that signals C++17 support, if set │ │ │ │ │ -21#ifdef Vc_CXX17 │ │ │ │ │ -22#undef Vc_CXX17 │ │ │ │ │ -23#endif │ │ │ │ │ -24 │ │ │ │ │ -25// include the rest of Vc │ │ │ │ │ -26#include │ │ │ │ │ -27 │ │ │ │ │ -28#endif // HAVE_VC │ │ │ │ │ -29 │ │ │ │ │ -30#endif // DUNE_COMMON_VC_HH │ │ │ │ │ +_2_3 template struct _E_p_s_i_l_o_n_T_y_p_e { │ │ │ │ │ +_2_5 typedef T _T_y_p_e; │ │ │ │ │ +26 }; │ │ │ │ │ +28 │ │ │ │ │ +33 template │ │ │ │ │ +_3_4 struct _E_p_s_i_l_o_n_T_y_p_e<_s_t_d::vector > { │ │ │ │ │ +_3_6 typedef typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _T_y_p_e; │ │ │ │ │ +37 }; │ │ │ │ │ +39 │ │ │ │ │ +44 template │ │ │ │ │ +_4_5 struct _E_p_s_i_l_o_n_T_y_p_e<_F_i_e_l_d_V_e_c_t_o_r > { │ │ │ │ │ +_4_7 typedef typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _T_y_p_e; │ │ │ │ │ +48 }; │ │ │ │ │ +49 │ │ │ │ │ +50 // default epsilon │ │ │ │ │ +51 template │ │ │ │ │ +_5_2 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ +_5_3 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ +54 { return std::numeric_limits::Type>::epsilon()*8.; } │ │ │ │ │ +55 }; │ │ │ │ │ +56 template │ │ │ │ │ +_5_7 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ +_5_8 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ +59 { return std::numeric_limits::Type>::epsilon()*8.; } │ │ │ │ │ +60 }; │ │ │ │ │ +61 template │ │ │ │ │ +_6_2 struct _D_e_f_a_u_l_t_E_p_s_i_l_o_n { │ │ │ │ │ +_6_3 static typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e _v_a_l_u_e() │ │ │ │ │ +64 { return std::max(std::numeric_limits_:_:_T_y_p_e>:: │ │ │ │ │ +epsilon(), 1e-6); } │ │ │ │ │ +65 }; │ │ │ │ │ +66 │ │ │ │ │ +67 namespace Impl { │ │ │ │ │ +68 // basic comparison │ │ │ │ │ +69 template │ │ │ │ │ +70 struct eq_t; │ │ │ │ │ +71 template │ │ │ │ │ +72 struct eq_t { │ │ │ │ │ +73 static bool _e_q(const T &first, │ │ │ │ │ +74 const T &second, │ │ │ │ │ +75 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ +76 { │ │ │ │ │ +77 using std::abs; │ │ │ │ │ +78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second)); │ │ │ │ │ +79 } │ │ │ │ │ +80 }; │ │ │ │ │ +81 template │ │ │ │ │ +82 struct eq_t { │ │ │ │ │ +83 static bool _e_q(const T &first, │ │ │ │ │ +84 const T &second, │ │ │ │ │ +85 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ +86 { │ │ │ │ │ +87 using std::abs; │ │ │ │ │ +88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second)); │ │ │ │ │ +89 } │ │ │ │ │ +90 }; │ │ │ │ │ +91 template │ │ │ │ │ +92 struct eq_t { │ │ │ │ │ +93 static bool _e_q(const T &first, │ │ │ │ │ +94 const T &second, │ │ │ │ │ +95 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_>_:_:_v_a_l_u_e()) │ │ │ │ │ +96 { │ │ │ │ │ +97 using std::abs; │ │ │ │ │ +98 return abs(first-second) <= epsilon; │ │ │ │ │ +99 } │ │ │ │ │ +100 }; │ │ │ │ │ +101 template │ │ │ │ │ +102 struct eq_t_std_vec { │ │ │ │ │ +103 typedef std::vector V; │ │ │ │ │ +104 static bool _e_q(const V &first, │ │ │ │ │ +105 const V &second, │ │ │ │ │ +106 typename _E_p_s_i_l_o_n_T_y_p_e_<_V_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_V_>_:_:_v_a_l_u_e()) { │ │ │ │ │ +107 auto _s_i_z_e = first.size(); │ │ │ │ │ +108 if(_s_i_z_e != second.size()) return false; │ │ │ │ │ +109 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ +110 if(!eq_t::eq(first[i], second[i], epsilon)) │ │ │ │ │ +111 return false; │ │ │ │ │ +112 return true; │ │ │ │ │ +113 } │ │ │ │ │ +114 }; │ │ │ │ │ +115 template< class T> │ │ │ │ │ +116 struct eq_t<_s_t_d::vector, _r_e_l_a_t_i_v_e_W_e_a_k> : eq_t_std_vec │ │ │ │ │ +{}; │ │ │ │ │ +117 template< class T> │ │ │ │ │ +118 struct eq_t<_s_t_d::vector, _r_e_l_a_t_i_v_e_S_t_r_o_n_g> : eq_t_std_vec {}; │ │ │ │ │ +119 template< class T> │ │ │ │ │ +120 struct eq_t<_s_t_d::vector, _a_b_s_o_l_u_t_e> : eq_t_std_vec {}; │ │ │ │ │ +121 │ │ │ │ │ +122 template │ │ │ │ │ +123 struct eq_t_fvec { │ │ │ │ │ +124 typedef _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _n_> V; │ │ │ │ │ +125 static bool _e_q(const V &first, │ │ │ │ │ +126 const V &second, │ │ │ │ │ +127 typename _E_p_s_i_l_o_n_T_y_p_e_<_V_>_:_:_T_y_p_e epsilon = _D_e_f_a_u_l_t_E_p_s_i_l_o_n_<_V_>_:_:_v_a_l_u_e()) { │ │ │ │ │ +128 for(int i = 0; i < n; ++i) │ │ │ │ │ +129 if(!eq_t::eq(first[i], second[i], epsilon)) │ │ │ │ │ +130 return false; │ │ │ │ │ +131 return true; │ │ │ │ │ +132 } │ │ │ │ │ +133 }; │ │ │ │ │ +134 template< class T, int n > │ │ │ │ │ +135 struct eq_t< _D_u_n_e::FieldVector, _r_e_l_a_t_i_v_e_W_e_a_k> : eq_t_fvec {}; │ │ │ │ │ +136 template< class T, int n > │ │ │ │ │ +137 struct eq_t< _D_u_n_e::FieldVector, _r_e_l_a_t_i_v_e_S_t_r_o_n_g> : eq_t_fvec {}; │ │ │ │ │ +138 template< class T, int n > │ │ │ │ │ +139 struct eq_t< _D_u_n_e::FieldVector, _a_b_s_o_l_u_t_e> : eq_t_fvec │ │ │ │ │ +{}; │ │ │ │ │ +140 } // namespace Impl │ │ │ │ │ +141 │ │ │ │ │ +142 // operations in functional style │ │ │ │ │ +143 template │ │ │ │ │ +_1_4_4 bool _e_q(const T &first, │ │ │ │ │ +145 const T &second, │ │ │ │ │ +146 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +147 { │ │ │ │ │ +148 return Impl::eq_t::eq(first, second, epsilon); │ │ │ │ │ +149 } │ │ │ │ │ +150 template │ │ │ │ │ +_1_5_1 bool _n_e(const T &first, │ │ │ │ │ +152 const T &second, │ │ │ │ │ +153 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +154 { │ │ │ │ │ +155 return !eq(first, second, epsilon); │ │ │ │ │ +156 } │ │ │ │ │ +157 template │ │ │ │ │ +_1_5_8 bool _g_t(const T &first, │ │ │ │ │ +159 const T &second, │ │ │ │ │ +160 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +161 { │ │ │ │ │ +162 return first > second && ne(first, second, epsilon); │ │ │ │ │ +163 } │ │ │ │ │ +164 template │ │ │ │ │ +_1_6_5 bool _l_t(const T &first, │ │ │ │ │ +166 const T &second, │ │ │ │ │ +167 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +168 { │ │ │ │ │ +169 return first < second && ne(first, second, epsilon); │ │ │ │ │ +170 } │ │ │ │ │ +171 template │ │ │ │ │ +_1_7_2 bool _g_e(const T &first, │ │ │ │ │ +173 const T &second, │ │ │ │ │ +174 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +175 { │ │ │ │ │ +176 return first > second || eq(first, second, epsilon); │ │ │ │ │ +177 } │ │ │ │ │ +178 template │ │ │ │ │ +_1_7_9 bool _l_e(const T &first, │ │ │ │ │ +180 const T &second, │ │ │ │ │ +181 typename _E_p_s_i_l_o_n_T_y_p_e_<_T_>_:_:_T_y_p_e epsilon) │ │ │ │ │ +182 { │ │ │ │ │ +183 return first < second || eq(first, second, epsilon); │ │ │ │ │ +184 } │ │ │ │ │ +185 │ │ │ │ │ +186 // default template arguments │ │ │ │ │ +187 template │ │ │ │ │ +_1_8_8 bool _e_q(const T &first, │ │ │ │ │ +189 const T &second, │ │ │ │ │ +190 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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +191 { │ │ │ │ │ +192 return eq(first, second, epsilon); │ │ │ │ │ +193 } │ │ │ │ │ +194 template │ │ │ │ │ +_1_9_5 bool _n_e(const T &first, │ │ │ │ │ +196 const T &second, │ │ │ │ │ +197 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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +198 { │ │ │ │ │ +199 return ne(first, second, epsilon); │ │ │ │ │ +200 } │ │ │ │ │ +201 template │ │ │ │ │ +_2_0_2 bool _g_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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +205 { │ │ │ │ │ +206 return gt(first, second, epsilon); │ │ │ │ │ +207 } │ │ │ │ │ +208 template │ │ │ │ │ +_2_0_9 bool _l_t(const T &first, │ │ │ │ │ +210 const T &second, │ │ │ │ │ +211 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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +212 { │ │ │ │ │ +213 return lt(first, second, epsilon); │ │ │ │ │ +214 } │ │ │ │ │ +215 template │ │ │ │ │ +_2_1_6 bool _g_e(const T &first, │ │ │ │ │ +217 const T &second, │ │ │ │ │ +218 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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +219 { │ │ │ │ │ +220 return ge(first, second, epsilon); │ │ │ │ │ +221 } │ │ │ │ │ +222 template │ │ │ │ │ +_2_2_3 bool _l_e(const T &first, │ │ │ │ │ +224 const T &second, │ │ │ │ │ +225 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_, │ │ │ │ │ +_d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +226 { │ │ │ │ │ +227 return le(first, second, epsilon); │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +230 // rounding operations │ │ │ │ │ +231 namespace Impl { │ │ │ │ │ +232 template │ │ │ │ │ +233 struct round_t; │ │ │ │ │ +234 template │ │ │ │ │ +235 struct round_t { │ │ │ │ │ +236 static I │ │ │ │ │ +237 _r_o_u_n_d(const T &val, │ │ │ │ │ +238 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 │ │ │ │ │ +())) { │ │ │ │ │ +239 // first get an approximation │ │ │ │ │ +240 I lower = I(val); │ │ │ │ │ +241 I upper; │ │ │ │ │ +242 if(eq(T(lower), val, epsilon)) return lower; │ │ │ │ │ +243 if(T(lower) > val) { upper = lower; lower--; } │ │ │ │ │ +244 else upper = lower+1; │ │ │ │ │ +245 if(le(val - T(lower), T(upper) - val, epsilon)) │ │ │ │ │ +246 return lower; │ │ │ │ │ +247 else return upper; │ │ │ │ │ +248 } │ │ │ │ │ +249 }; │ │ │ │ │ +250 template │ │ │ │ │ +251 struct round_t { │ │ │ │ │ +252 static I │ │ │ │ │ +253 _r_o_u_n_d(const T &val, │ │ │ │ │ +254 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 // first get an approximation │ │ │ │ │ +256 I lower = I(val); │ │ │ │ │ +257 I upper; │ │ │ │ │ +258 if(eq(T(lower), val, epsilon)) return lower; │ │ │ │ │ +259 if(T(lower) > val) { upper = lower; lower--; } │ │ │ │ │ +260 else upper = lower+1; │ │ │ │ │ +261 if(lt(val - T(lower), T(upper) - val, epsilon)) │ │ │ │ │ +262 return lower; │ │ │ │ │ +263 else return upper; │ │ │ │ │ +264 } │ │ │ │ │ +265 }; │ │ │ │ │ +266 template │ │ │ │ │ +267 struct round_t { │ │ │ │ │ +268 static I │ │ │ │ │ +269 _r_o_u_n_d(const T &val, │ │ │ │ │ +270 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 │ │ │ │ │ +())) { │ │ │ │ │ +271 if(val > T(0)) │ │ │ │ │ +272 return round_t::round(val, epsilon); │ │ │ │ │ +273 else return round_t::round(val, epsilon); │ │ │ │ │ +274 } │ │ │ │ │ +275 }; │ │ │ │ │ +276 template │ │ │ │ │ +277 struct round_t { │ │ │ │ │ +278 static I │ │ │ │ │ +279 _r_o_u_n_d(const T &val, │ │ │ │ │ +280 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 │ │ │ │ │ +())) { │ │ │ │ │ +281 if(val > T(0)) │ │ │ │ │ +282 return round_t::round(val, epsilon); │ │ │ │ │ +283 else return round_t::round(val, epsilon); │ │ │ │ │ +284 } │ │ │ │ │ +285 }; │ │ │ │ │ +286 template │ │ │ │ │ +287 struct round_t<_s_t_d::vector, std::vector, cstyle, rstyle> { │ │ │ │ │ +288 static std::vector │ │ │ │ │ +289 _r_o_u_n_d(const T &val, │ │ │ │ │ +290 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 │ │ │ │ │ +())) { │ │ │ │ │ +291 unsigned int _s_i_z_e = val.size(); │ │ │ │ │ +292 std::vector res(_s_i_z_e); │ │ │ │ │ +293 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ +294 res[i] = round_t::round(val[i], epsilon); │ │ │ │ │ +295 return res; │ │ │ │ │ +296 } │ │ │ │ │ +297 }; │ │ │ │ │ +298 template │ │ │ │ │ +299 struct round_t<_D_u_n_e::FieldVector, _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r, cstyle, │ │ │ │ │ +rstyle> { │ │ │ │ │ +300 static _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> │ │ │ │ │ +301 _r_o_u_n_d(const T &val, │ │ │ │ │ +302 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 │ │ │ │ │ +())) { │ │ │ │ │ +303 _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> res; │ │ │ │ │ +304 for(int i = 0; i < n; ++i) │ │ │ │ │ +305 res[i] = round_t::round(val[i], epsilon); │ │ │ │ │ +306 return res; │ │ │ │ │ +307 } │ │ │ │ │ +308 }; │ │ │ │ │ +309 } // end namespace Impl │ │ │ │ │ +310 template │ │ │ │ │ +_3_1_1 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 /*= │ │ │ │ │ +DefaultEpsilon::value()*/) │ │ │ │ │ +312 { │ │ │ │ │ +313 return Impl::round_t::round(val, epsilon); │ │ │ │ │ +314 } │ │ │ │ │ +315 template │ │ │ │ │ +_3_1_6 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()) │ │ │ │ │ +317 { │ │ │ │ │ +318 return round(val, epsilon); │ │ │ │ │ +319 } │ │ │ │ │ +320 template │ │ │ │ │ +321 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +322 { │ │ │ │ │ +323 return round(val, epsilon); │ │ │ │ │ +324 } │ │ │ │ │ +325 template │ │ │ │ │ +_3_2_6 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +327 { │ │ │ │ │ +328 return round(val, epsilon); │ │ │ │ │ +329 } │ │ │ │ │ +330 │ │ │ │ │ +331 // truncation │ │ │ │ │ +332 namespace Impl { │ │ │ │ │ +333 template │ │ │ │ │ +334 struct trunc_t; │ │ │ │ │ +335 template │ │ │ │ │ +336 struct trunc_t { │ │ │ │ │ +337 static I │ │ │ │ │ +338 _t_r_u_n_c(const T &val, │ │ │ │ │ +339 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 │ │ │ │ │ +())) { │ │ │ │ │ +340 // this should be optimized away unless needed │ │ │ │ │ +341 if(!std::numeric_limits::is_signed) │ │ │ │ │ +342 // make sure this works for all useful cases even if I is an unsigned type │ │ │ │ │ +343 if(eq(val, T(0), epsilon)) return I(0); │ │ │ │ │ +344 // first get an approximation │ │ │ │ │ +345 I lower = I(val); // now |val-lower| < 1 │ │ │ │ │ +346 // make sure we're really lower in case the cast truncated to an unexpected │ │ │ │ │ +direction │ │ │ │ │ +347 if(T(lower) > val) lower--; // now val-lower < 1 │ │ │ │ │ +348 // check whether lower + 1 is approximately val │ │ │ │ │ +349 if(eq(T(lower+1), val, epsilon)) │ │ │ │ │ +350 return lower+1; │ │ │ │ │ +351 else return lower; │ │ │ │ │ +352 } │ │ │ │ │ +353 }; │ │ │ │ │ +354 template │ │ │ │ │ +355 struct trunc_t { │ │ │ │ │ +356 static I │ │ │ │ │ +357 _t_r_u_n_c(const T &val, │ │ │ │ │ +358 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 │ │ │ │ │ +())) { │ │ │ │ │ +359 I upper = trunc_t::trunc(val, epsilon); │ │ │ │ │ +360 if(ne(T(upper), val, epsilon)) ++upper; │ │ │ │ │ +361 return upper; │ │ │ │ │ +362 } │ │ │ │ │ +363 }; │ │ │ │ │ +364 template │ │ │ │ │ +365 struct trunc_t { │ │ │ │ │ +366 static I │ │ │ │ │ +367 _t_r_u_n_c(const T &val, │ │ │ │ │ +368 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 │ │ │ │ │ +())) { │ │ │ │ │ +369 if(val > T(0)) return trunc_t::trunc(val, epsilon); │ │ │ │ │ +370 else return trunc_t::trunc(val, epsilon); │ │ │ │ │ +371 } │ │ │ │ │ +372 }; │ │ │ │ │ +373 template │ │ │ │ │ +374 struct trunc_t { │ │ │ │ │ +375 static I │ │ │ │ │ +376 _t_r_u_n_c(const T &val, │ │ │ │ │ +377 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 │ │ │ │ │ +())) { │ │ │ │ │ +378 if(val > T(0)) return trunc_t::trunc(val, epsilon); │ │ │ │ │ +379 else return trunc_t::trunc(val, epsilon); │ │ │ │ │ +380 } │ │ │ │ │ +381 }; │ │ │ │ │ +382 template │ │ │ │ │ +383 struct trunc_t<_s_t_d::vector, std::vector, cstyle, rstyle> { │ │ │ │ │ +384 static std::vector │ │ │ │ │ +385 _t_r_u_n_c(const std::vector &val, │ │ │ │ │ +386 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 │ │ │ │ │ +())) { │ │ │ │ │ +387 unsigned int _s_i_z_e = val.size(); │ │ │ │ │ +388 std::vector res(_s_i_z_e); │ │ │ │ │ +389 for(unsigned int i = 0; i < _s_i_z_e; ++i) │ │ │ │ │ +390 res[i] = trunc_t::trunc(val[i], epsilon); │ │ │ │ │ +391 return res; │ │ │ │ │ +392 } │ │ │ │ │ +393 }; │ │ │ │ │ +394 template │ │ │ │ │ +395 struct trunc_t<_D_u_n_e::FieldVector, _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r, cstyle, │ │ │ │ │ +rstyle> { │ │ │ │ │ +396 static _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> │ │ │ │ │ +397 _t_r_u_n_c(const _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _n_> &val, │ │ │ │ │ +398 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 │ │ │ │ │ +())) { │ │ │ │ │ +399 _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_I_,_ _n_> res; │ │ │ │ │ +400 for(int i = 0; i < n; ++i) │ │ │ │ │ +401 res[i] = trunc_t::trunc(val[i], epsilon); │ │ │ │ │ +402 return res; │ │ │ │ │ +403 } │ │ │ │ │ +404 }; │ │ │ │ │ +405 } // namespace Impl │ │ │ │ │ +406 template │ │ │ │ │ +_4_0_7 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 /*= │ │ │ │ │ +DefaultEpsilon::value()*/) │ │ │ │ │ +408 { │ │ │ │ │ +409 return Impl::trunc_t::trunc(val, epsilon); │ │ │ │ │ +410 } │ │ │ │ │ +411 template │ │ │ │ │ +_4_1_2 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()) │ │ │ │ │ +413 { │ │ │ │ │ +414 return trunc(val, epsilon); │ │ │ │ │ +415 } │ │ │ │ │ +416 template │ │ │ │ │ +417 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +418 { │ │ │ │ │ +419 return trunc(val, epsilon); │ │ │ │ │ +420 } │ │ │ │ │ +421 template │ │ │ │ │ +_4_2_2 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_,_ _d_e_f_a_u_l_t_C_m_p_S_t_y_l_e_>_:_:_v_a_l_u_e()) │ │ │ │ │ +423 { │ │ │ │ │ +424 return trunc(val, epsilon); │ │ │ │ │ +425 } │ │ │ │ │ +426 } //namespace Dune │ │ │ │ │ +427 │ │ │ │ │ +428 // oo interface │ │ │ │ │ +429 template │ │ │ │ │ +_4_3_0 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +431_ _F_l_o_a_t_C_m_p_O_p_s(_E_p_s_i_l_o_n_T_y_p_e epsilon) : epsilon_(epsilon) {} │ │ │ │ │ +432 │ │ │ │ │ +433 │ │ │ │ │ +434 template │ │ │ │ │ +435 typename _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_E_p_s_i_l_o_n_T_y_p_e │ │ │ │ │ +_4_3_6 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_e_p_s_i_l_o_n() const │ │ │ │ │ +437 { │ │ │ │ │ +438 return epsilon_; │ │ │ │ │ +439 } │ │ │ │ │ +440 │ │ │ │ │ +441 template │ │ │ │ │ +442 void │ │ │ │ │ +_4_4_3 _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_:_e_p_s_i_l_o_n(_E_p_s_i_l_o_n_T_y_p_e epsilon__) │ │ │ │ │ +444 { │ │ │ │ │ +445 epsilon_ = epsilon__; │ │ │ │ │ +446 } │ │ │ │ │ +447 │ │ │ │ │ +448 │ │ │ │ │ +449 template │ │ │ │ │ +_4_5_0 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +451_ _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 │ │ │ │ │ +452 { │ │ │ │ │ +453 return Dune::FloatCmp::eq(first, second, epsilon_); │ │ │ │ │ +454 } │ │ │ │ │ +455 │ │ │ │ │ +456 template │ │ │ │ │ +_4_5_7 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +458_ _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 │ │ │ │ │ +459 { │ │ │ │ │ +460 return Dune::FloatCmp::ne(first, second, epsilon_); │ │ │ │ │ +461 } │ │ │ │ │ +462 │ │ │ │ │ +463 template │ │ │ │ │ +_4_6_4 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +465_ _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 │ │ │ │ │ +466 { │ │ │ │ │ +467 return Dune::FloatCmp::gt(first, second, epsilon_); │ │ │ │ │ +468 } │ │ │ │ │ +469 │ │ │ │ │ +470 template │ │ │ │ │ +_4_7_1 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +472_ _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 │ │ │ │ │ +473 { │ │ │ │ │ +474 return Dune::FloatCmp::lt(first, second, epsilon_); │ │ │ │ │ +475 } │ │ │ │ │ +476 │ │ │ │ │ +477 template │ │ │ │ │ +_4_7_8 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +479_ _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 │ │ │ │ │ +480 { │ │ │ │ │ +481 return Dune::FloatCmp::ge(first, second, epsilon_); │ │ │ │ │ +482 } │ │ │ │ │ +483 │ │ │ │ │ +484 template │ │ │ │ │ +_4_8_5 bool _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +486_ _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 │ │ │ │ │ +487 { │ │ │ │ │ +488 return Dune::FloatCmp::le(first, second, epsilon_); │ │ │ │ │ +489 } │ │ │ │ │ +490 │ │ │ │ │ +491 │ │ │ │ │ +492 template │ │ │ │ │ +493 template │ │ │ │ │ +_4_9_4 I _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +495_ _r_o_u_n_d(const _V_a_l_u_e_T_y_p_e &val) const │ │ │ │ │ +496 { │ │ │ │ │ +497 return Dune::FloatCmp::round(val, epsilon_); │ │ │ │ │ +498 } │ │ │ │ │ +499 │ │ │ │ │ +500 template │ │ │ │ │ +501 template │ │ │ │ │ +_5_0_2 I _F_l_o_a_t_C_m_p_O_p_s_<_T_,_ _c_s_t_y_l_e___,_ _r_s_t_y_l_e___>_:_: │ │ │ │ │ +503_ _t_r_u_n_c(const _V_a_l_u_e_T_y_p_e &val) const │ │ │ │ │ +504 { │ │ │ │ │ +505 return Dune::FloatCmp::trunc(val, epsilon_); │ │ │ │ │ +506 } │ │ │ │ │ +507 │ │ │ │ │ +508} //namespace Dune │ │ │ │ │ +_f_l_o_a_t___c_m_p_._h_h │ │ │ │ │ +Various ways to compare floating-point numbers. │ │ │ │ │ +_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. │ │ │ │ │ +_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_:_:_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_:_:_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_:_:_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 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +Dune namespace. │ │ │ │ │ +DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ +_D_u_n_e_:_:_s_i_z_e │ │ │ │ │ +constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std:: │ │ │ │ │ +integer_sequence< T, II... >) │ │ │ │ │ +Return the size of the sequence. │ │ │ │ │ +DDeeffiinniittiioonn integersequence.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +vector space out of a tensor product of fields. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e │ │ │ │ │ +Mapping of value type to epsilon type. │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:23 │ │ │ │ │ +_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_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ +EpsilonType< T >::Type Type │ │ │ │ │ +The epsilon type corresponding to value type std::vector │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:36 │ │ │ │ │ +_D_u_n_e_:_:_F_l_o_a_t_C_m_p_:_:_E_p_s_i_l_o_n_T_y_p_e_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _n_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ +EpsilonType< T >::Type Type │ │ │ │ │ +The epsilon type corresponding to value type Dune::FieldVector │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:47 │ │ │ │ │ +_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_,_ _r_e_l_a_t_i_v_e_W_e_a_k_ _>_:_:_v_a_l_u_e │ │ │ │ │ +static EpsilonType< T >::Type value() │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:53 │ │ │ │ │ +_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_,_ _r_e_l_a_t_i_v_e_S_t_r_o_n_g_ _>_:_:_v_a_l_u_e │ │ │ │ │ +static EpsilonType< T >::Type value() │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:58 │ │ │ │ │ +_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_,_ _a_b_s_o_l_u_t_e_ _>_:_:_v_a_l_u_e │ │ │ │ │ +static EpsilonType< T >::Type value() │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:63 │ │ │ │ │ +_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_:_:_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_:_:_F_l_o_a_t_C_m_p_O_p_s │ │ │ │ │ +FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value()) │ │ │ │ │ +construct an operations object │ │ │ │ │ +DDeeffiinniittiioonn float_cmp.cc:431 │ │ │ │ │ +_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_:_:_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_:_:_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/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: matrixconcepts.hh File Reference │ │ │ │ +dune-common: dynmatrixev.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,30 +70,47 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
matrixconcepts.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
dynmatrixev.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ + │ │ │ │ +

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

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

Go to the source code of this file.

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

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

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

Detailed Description

│ │ │ │ +

utility functions to compute eigenvalues for dense matrices.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,18 +1,32 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -matrixconcepts.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#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> │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +dynmatrixev.hh File Reference │ │ │ │ │ +utility functions to compute eigenvalues for dense matrices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_d_y_n_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_f_m_a_t_r_i_x_e_v_._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_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_H_e_l_p │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +static void  _D_u_n_e_:_:_D_y_n_a_m_i_c_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 _D_y_n_a_m_i_c_M_a_t_r_i_x< K │ │ │ │ │ + > &matrix, _D_y_n_a_m_i_c_V_e_c_t_o_r< C > &eigenValues, std::vector< │ │ │ │ │ + _D_y_n_a_m_i_c_V_e_c_t_o_r< K > > *eigenVectors=nullptr) │ │ │ │ │ +  calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +utility functions to compute eigenvalues for dense matrices. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: matrixconcepts.hh Source File │ │ │ │ +dune-common: dynmatrixev.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,109 +74,125 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixconcepts.hh
│ │ │ │ +
dynmatrixev.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_COMMON_MATRIXCONCEPTS_HH
│ │ │ │ -
6#define DUNE_COMMON_MATRIXCONCEPTS_HH
│ │ │ │ +
5#ifndef DUNE_DYNMATRIXEIGENVALUES_HH
│ │ │ │ +
6#define DUNE_DYNMATRIXEIGENVALUES_HH
│ │ │ │
7
│ │ │ │ -
8
│ │ │ │ -
9
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <memory>
│ │ │ │ +
10
│ │ │ │ +
11#include <dune-common-config.hh> // HAVE_LAPACK
│ │ │ │
12
│ │ │ │ - │ │ │ │ -
14
│ │ │ │ +
13#include "dynmatrix.hh"
│ │ │ │ +
14#include "fmatrixev.hh"
│ │ │ │
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18
│ │ │ │ -
19 template<class, int, int>
│ │ │ │ -
20 class FieldMatrix;
│ │ │ │ -
21
│ │ │ │ -
22 template<class>
│ │ │ │ -
23 class DynamicMatrix;
│ │ │ │ -
24
│ │ │ │ -
25}
│ │ │ │ -
26
│ │ │ │ -
27namespace Dune::Impl {
│ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30 // Some traits for checking matrix concepts. Currently these are
│ │ │ │ -
31 // all technical internal helpers that just serve different headers
│ │ │ │ -
32 // to do internal checks and are thus collected here.
│ │ │ │ -
33
│ │ │ │ -
34 template<class T>
│ │ │ │ -
35 using IsMatrixHelper = std::void_t<decltype(std::declval<T>().N(), std::declval<T>().M())>;
│ │ │ │ -
36
│ │ │ │ -
37 template<class T>
│ │ │ │ -
38 struct IsMatrix : public Dune::Std::is_detected<IsMatrixHelper, T> {};
│ │ │ │ -
39
│ │ │ │ -
40 // Check if T is a matrix by checking for member functions N() and M().
│ │ │ │ -
41 template<class T>
│ │ │ │ -
42 constexpr bool IsMatrix_v = Impl::IsMatrix<T>::value;
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
45
│ │ │ │ -
46 template<class T>
│ │ │ │ -
47 using IsStaticSizeMatrixHelper = std::void_t<decltype(T::rows, T::cols)>;
│ │ │ │ -
48
│ │ │ │ -
49 template<class T>
│ │ │ │ -
50 struct IsStaticSizeMatrix : public Dune::Std::is_detected<IsStaticSizeMatrixHelper, T> {};
│ │ │ │ -
51
│ │ │ │ -
52 // Check if T is a statically sized matrix by checking for static members rows and cols.
│ │ │ │ -
53 template<class T>
│ │ │ │ -
54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix<T>::value;
│ │ │ │ -
55
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25
│ │ │ │ +
│ │ │ │ +
26 namespace DynamicMatrixHelp {
│ │ │ │ +
27
│ │ │ │ +
28#if HAVE_LAPACK
│ │ │ │ +
29 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;
│ │ │ │ +
30#endif
│ │ │ │ +
31
│ │ │ │ +
40 template <typename K, class C>
│ │ │ │ +
│ │ │ │ +
41 static void eigenValuesNonSym(const DynamicMatrix<K>& matrix,
│ │ │ │ +
42 DynamicVector<C>& eigenValues,
│ │ │ │ +
43 std::vector<DynamicVector<K>>* eigenVectors = nullptr
│ │ │ │ +
44 )
│ │ │ │ +
45 {
│ │ │ │ +
46
│ │ │ │ +
47#if HAVE_LAPACK
│ │ │ │ +
48 {
│ │ │ │ +
49 const long int N = matrix.rows();
│ │ │ │ +
50 const char jobvl = 'n';
│ │ │ │ +
51 const char jobvr = eigenVectors ? 'v' : 'n';
│ │ │ │ +
52
│ │ │ │ +
53
│ │ │ │ +
54 // matrix to put into dgeev
│ │ │ │ +
55 auto matrixVector = std::make_unique<double[]>(N*N);
│ │ │ │
56
│ │ │ │ -
57
│ │ │ │ -
58 template<class T>
│ │ │ │ -
59 class IsFieldMatrix : public std::false_type {};
│ │ │ │ -
60
│ │ │ │ -
61 template< class K, int ROWS, int COLS>
│ │ │ │ -
62 class IsFieldMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
│ │ │ │ -
63
│ │ │ │ -
64 // Check if T is an instance of FieldMatrix
│ │ │ │ -
65 template<class T>
│ │ │ │ -
66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix<T>::value;
│ │ │ │ -
67
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
70 template<class T>
│ │ │ │ -
71 class IsDenseMatrix : public std::false_type {};
│ │ │ │ -
72
│ │ │ │ -
73 template<class K, int ROWS, int COLS>
│ │ │ │ -
74 class IsDenseMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
│ │ │ │ -
75
│ │ │ │ -
76 template<class K>
│ │ │ │ -
77 class IsDenseMatrix<Dune::DynamicMatrix<K>> : public std::true_type {};
│ │ │ │ -
78
│ │ │ │ -
79 // Check if T is a dense matrix. This is implemented by specialization.
│ │ │ │ -
80 template<class T>
│ │ │ │ -
81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix<T>::value;
│ │ │ │ +
57 // copy matrix
│ │ │ │ +
58 int row = 0;
│ │ │ │ +
59 for(int i=0; i<N; ++i)
│ │ │ │ +
60 {
│ │ │ │ +
61 for(int j=0; j<N; ++j, ++row)
│ │ │ │ +
62 {
│ │ │ │ +
63 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ +
64 }
│ │ │ │ +
65 }
│ │ │ │ +
66
│ │ │ │ +
67 // working memory
│ │ │ │ +
68 auto eigenR = std::make_unique<double[]>(N);
│ │ │ │ +
69 auto eigenI = std::make_unique<double[]>(N);
│ │ │ │ +
70
│ │ │ │ +
71 const long int lwork = eigenVectors ? 4*N : 3*N;
│ │ │ │ +
72 auto work = std::make_unique<double[]>(lwork);
│ │ │ │ +
73 auto vr = eigenVectors ? std::make_unique<double[]>(N*N) : std::unique_ptr<double[]>{};
│ │ │ │ +
74
│ │ │ │ +
75 // return value information
│ │ │ │ +
76 long int info = 0;
│ │ │ │ +
77
│ │ │ │ +
78 // call LAPACK routine (see fmatrixev_ext.cc)
│ │ │ │ +
79 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,
│ │ │ │ +
80 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),
│ │ │ │ +
81 &lwork, &info);
│ │ │ │
82
│ │ │ │ -
83
│ │ │ │ -
84
│ │ │ │ -
85} // namespace Dune::Impl
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ +
83 if( info != 0 )
│ │ │ │ +
84 {
│ │ │ │ +
85 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ +
86 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ +
87 }
│ │ │ │
88
│ │ │ │ -
89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH
│ │ │ │ - │ │ │ │ -
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition type_traits.hh:145
│ │ │ │ +
89 eigenValues.resize(N);
│ │ │ │ +
90 for (int i=0; i<N; ++i)
│ │ │ │ +
91 eigenValues[i] = std::complex<double>(eigenR[i], eigenI[i]);
│ │ │ │ +
92
│ │ │ │ +
93 if (eigenVectors) {
│ │ │ │ +
94 eigenVectors->resize(N);
│ │ │ │ +
95 for (int i = 0; i < N; ++i) {
│ │ │ │ +
96 auto& v = (*eigenVectors)[i];
│ │ │ │ +
97 v.resize(N);
│ │ │ │ +
98 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);
│ │ │ │ +
99 }
│ │ │ │ +
100 }
│ │ │ │ +
101 }
│ │ │ │ +
102#else // #if HAVE_LAPACK
│ │ │ │ +
103 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ +
104#endif
│ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107
│ │ │ │ +
108}
│ │ │ │ +
110#endif
│ │ │ │ +
Eigenvalue computations for the FieldMatrix class.
│ │ │ │ +
This file implements a dense matrix with dynamic numbers of rows and columns.
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
calculates the eigenvalues of a symmetric field matrix
Definition dynmatrixev.hh:41
│ │ │ │ +
constexpr size_type rows() const
number of rows
Definition densematrix.hh:709
│ │ │ │ +
Construct a matrix with a dynamic size.
Definition dynmatrix.hh:61
│ │ │ │ +
Construct a vector with a dynamic size.
Definition dynvector.hh:59
│ │ │ │ +
void resize(size_type n, value_type c=value_type())
Definition dynvector.hh:141
│ │ │ │ +
Default exception for dummy implementations.
Definition exceptions.hh:263
│ │ │ │ +
Default exception if a function was called while the object is not in a valid state for that function...
Definition exceptions.hh:281
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,113 +1,142 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -matrixconcepts.hh │ │ │ │ │ +dynmatrixev.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_COMMON_MATRIXCONCEPTS_HH │ │ │ │ │ -6#define DUNE_COMMON_MATRIXCONCEPTS_HH │ │ │ │ │ +5#ifndef DUNE_DYNMATRIXEIGENVALUES_HH │ │ │ │ │ +6#define DUNE_DYNMATRIXEIGENVALUES_HH │ │ │ │ │ 7 │ │ │ │ │ -8 │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#include // HAVE_LAPACK │ │ │ │ │ 12 │ │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -14 │ │ │ │ │ +13#include "_d_y_n_m_a_t_r_i_x_._h_h" │ │ │ │ │ +14#include "_f_m_a_t_r_i_x_e_v_._h_h" │ │ │ │ │ 15 │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ │ -18 │ │ │ │ │ -19 template │ │ │ │ │ -20 class FieldMatrix; │ │ │ │ │ -21 │ │ │ │ │ -22 template │ │ │ │ │ -23 class DynamicMatrix; │ │ │ │ │ -24 │ │ │ │ │ -25} │ │ │ │ │ -26 │ │ │ │ │ -27namespace Dune::Impl { │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30 // Some traits for checking matrix concepts. Currently these are │ │ │ │ │ -31 // all technical internal helpers that just serve different headers │ │ │ │ │ -32 // to do internal checks and are thus collected here. │ │ │ │ │ -33 │ │ │ │ │ -34 template │ │ │ │ │ -35 using IsMatrixHelper = std::void_t().N(), std:: │ │ │ │ │ -declval().M())>; │ │ │ │ │ -36 │ │ │ │ │ -37 template │ │ │ │ │ -38 struct IsMatrix : public _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d {}; │ │ │ │ │ -39 │ │ │ │ │ -40 // Check if T is a matrix by checking for member functions N() and M(). │ │ │ │ │ -41 template │ │ │ │ │ -42 constexpr bool IsMatrix_v = Impl::IsMatrix::value; │ │ │ │ │ -43 │ │ │ │ │ -44 │ │ │ │ │ -45 │ │ │ │ │ -46 template │ │ │ │ │ -47 using IsStaticSizeMatrixHelper = std::void_t; │ │ │ │ │ -48 │ │ │ │ │ -49 template │ │ │ │ │ -50 struct IsStaticSizeMatrix : public _D_u_n_e_:_:_S_t_d_:_: │ │ │ │ │ -_i_s___d_e_t_e_c_t_e_d {}; │ │ │ │ │ -51 │ │ │ │ │ -52 // Check if T is a statically sized matrix by checking for static members │ │ │ │ │ -rows and cols. │ │ │ │ │ -53 template │ │ │ │ │ -54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix::value; │ │ │ │ │ -55 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25 │ │ │ │ │ +_2_6 namespace DynamicMatrixHelp { │ │ │ │ │ +27 │ │ │ │ │ +28#if HAVE_LAPACK │ │ │ │ │ +29 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall; │ │ │ │ │ +30#endif │ │ │ │ │ +31 │ │ │ │ │ +40 template │ │ │ │ │ +_4_1 static void _e_i_g_e_n_V_a_l_u_e_s_N_o_n_S_y_m(const _D_y_n_a_m_i_c_M_a_t_r_i_x_<_K_>& matrix, │ │ │ │ │ +42 _D_y_n_a_m_i_c_V_e_c_t_o_r_<_C_>& eigenValues, │ │ │ │ │ +43 std::vector<_D_y_n_a_m_i_c_V_e_c_t_o_r_<_K_>>* eigenVectors = nullptr │ │ │ │ │ +44 ) │ │ │ │ │ +45 { │ │ │ │ │ +46 │ │ │ │ │ +47#if HAVE_LAPACK │ │ │ │ │ +48 { │ │ │ │ │ +49 const long int N = matrix._r_o_w_s(); │ │ │ │ │ +50 const char jobvl = 'n'; │ │ │ │ │ +51 const char jobvr = eigenVectors ? 'v' : 'n'; │ │ │ │ │ +52 │ │ │ │ │ +53 │ │ │ │ │ +54 // matrix to put into dgeev │ │ │ │ │ +55 auto matrixVector = std::make_unique(N*N); │ │ │ │ │ 56 │ │ │ │ │ -57 │ │ │ │ │ -58 template │ │ │ │ │ -59 class IsFieldMatrix : public std::false_type {}; │ │ │ │ │ -60 │ │ │ │ │ -61 template< class K, int ROWS, int COLS> │ │ │ │ │ -62 class IsFieldMatrix<_D_u_n_e::FieldMatrix> : public std:: │ │ │ │ │ -true_type {}; │ │ │ │ │ -63 │ │ │ │ │ -64 // Check if T is an instance of FieldMatrix │ │ │ │ │ -65 template │ │ │ │ │ -66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix::value; │ │ │ │ │ -67 │ │ │ │ │ -68 │ │ │ │ │ -69 │ │ │ │ │ -70 template │ │ │ │ │ -71 class IsDenseMatrix : public std::false_type {}; │ │ │ │ │ -72 │ │ │ │ │ -73 template │ │ │ │ │ -74 class IsDenseMatrix<_D_u_n_e::FieldMatrix> : public std:: │ │ │ │ │ -true_type {}; │ │ │ │ │ -75 │ │ │ │ │ -76 template │ │ │ │ │ -77 class IsDenseMatrix<_D_u_n_e::DynamicMatrix> : public std::true_type {}; │ │ │ │ │ -78 │ │ │ │ │ -79 // Check if T is a dense matrix. This is implemented by specialization. │ │ │ │ │ -80 template │ │ │ │ │ -81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix::value; │ │ │ │ │ +57 // copy matrix │ │ │ │ │ +58 int row = 0; │ │ │ │ │ +59 for(int i=0; i(N); │ │ │ │ │ +69 auto eigenI = std::make_unique(N); │ │ │ │ │ +70 │ │ │ │ │ +71 const long int lwork = eigenVectors ? 4*N : 3*N; │ │ │ │ │ +72 auto work = std::make_unique(lwork); │ │ │ │ │ +73 auto vr = eigenVectors ? std::make_unique(N*N) : std:: │ │ │ │ │ +unique_ptr{}; │ │ │ │ │ +74 │ │ │ │ │ +75 // return value information │ │ │ │ │ +76 long int info = 0; │ │ │ │ │ +77 │ │ │ │ │ +78 // call LAPACK routine (see fmatrixev_ext.cc) │ │ │ │ │ +79 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N, │ │ │ │ │ +80 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(), │ │ │ │ │ +81 &lwork, &info); │ │ │ │ │ 82 │ │ │ │ │ -83 │ │ │ │ │ -84 │ │ │ │ │ -85} // namespace Dune::Impl │ │ │ │ │ -86 │ │ │ │ │ -87 │ │ │ │ │ +83 if( info != 0 ) │ │ │ │ │ +84 { │ │ │ │ │ +85 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " │ │ │ │ │ +<< std::endl; │ │ │ │ │ +86 _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,"eigenValues: Eigenvalue calculation │ │ │ │ │ +failed!"); │ │ │ │ │ +87 } │ │ │ │ │ 88 │ │ │ │ │ -89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d │ │ │ │ │ -typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ -Detects whether Op is valid. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:145 │ │ │ │ │ +89 eigenValues._r_e_s_i_z_e(N); │ │ │ │ │ +90 for (int i=0; i(eigenR[i], eigenI[i]); │ │ │ │ │ +92 │ │ │ │ │ +93 if (eigenVectors) { │ │ │ │ │ +94 eigenVectors->_r_e_s_i_z_e(N); │ │ │ │ │ +95 for (int i = 0; i < N; ++i) { │ │ │ │ │ +96 auto& v = (*eigenVectors)[i]; │ │ │ │ │ +97 v.resize(N); │ │ │ │ │ +98 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]); │ │ │ │ │ +99 } │ │ │ │ │ +100 } │ │ │ │ │ +101 } │ │ │ │ │ +102#else // #if HAVE_LAPACK │ │ │ │ │ +103 _D_U_N_E___T_H_R_O_W(_N_o_t_I_m_p_l_e_m_e_n_t_e_d,"LAPACK not found!"); │ │ │ │ │ +104#endif │ │ │ │ │ +105 } │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +108} │ │ │ │ │ +110#endif │ │ │ │ │ +_f_m_a_t_r_i_x_e_v_._h_h │ │ │ │ │ +Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ +_d_y_n_m_a_t_r_i_x_._h_h │ │ │ │ │ +This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ +_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_:_:_D_y_n_a_m_i_c_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 DynamicMatrix< K > &matrix, DynamicVector< │ │ │ │ │ +C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr) │ │ │ │ │ +calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ +DDeeffiinniittiioonn dynmatrixev.hh:41 │ │ │ │ │ +_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_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_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_:_:_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 │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: boundschecking.hh File Reference │ │ │ │ +dune-common: float_cmp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,33 +70,101 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
boundschecking.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Enumerations | │ │ │ │ +Functions
│ │ │ │ +
float_cmp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Macro for wrapping boundary checks. │ │ │ │ +

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

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

Go to the source code of this file.

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

│ │ │ │ -Macros

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

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

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

│ │ │ │ -

Macro for wrapping boundary checks.

│ │ │ │ +

Various ways to compare floating-point numbers.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,81 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -boundschecking.hh File Reference │ │ │ │ │ -Macro for wrapping boundary checks. _M_o_r_e_._._. │ │ │ │ │ -#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 | _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_. │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(cond) │ │ │ │ │ -  If DUNE_CHECK_BOUNDS is defined: check if condition ccoonndd holds; │ │ │ │ │ - otherwise, do nothing. │ │ │ │ │ +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. │ │ │ │ │ +  │ │ │ │ │ +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 │ │ │ │ │ +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 ********** │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ +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/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: boundschecking.hh Source File │ │ │ │ +dune-common: float_cmp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,42 +74,197 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
boundschecking.hh
│ │ │ │ +
float_cmp.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_BOUNDSCHECKING_HH
│ │ │ │ -
4#define DUNE_BOUNDSCHECKING_HH
│ │ │ │ -
5
│ │ │ │ - │ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
3// SPDX-FileCopyrightInfo: Copyright © 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_FLOAT_CMP_HH
│ │ │ │ +
6#define DUNE_COMMON_FLOAT_CMP_HH
│ │ │ │
7
│ │ │ │ -
19#ifndef DUNE_ASSERT_BOUNDS
│ │ │ │ -
20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)
│ │ │ │ -
21
│ │ │ │ -
│ │ │ │ -
30#define DUNE_ASSERT_BOUNDS(cond) \
│ │ │ │ -
31 do { \
│ │ │ │ -
32 if (!(cond)) \
│ │ │ │ -
33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \
│ │ │ │ -
34 } while (false)
│ │ │ │ -
│ │ │ │ -
35
│ │ │ │ -
36#else
│ │ │ │ -
37#define DUNE_ASSERT_BOUNDS(cond)
│ │ │ │ -
38#endif
│ │ │ │ -
39#endif
│ │ │ │ -
40
│ │ │ │ -
43#endif // DUNE_BOUNDSCHECKING_HH
│ │ │ │ -
A few common exception classes.
│ │ │ │ +
97namespace Dune {
│ │ │ │ +
100 namespace FloatCmp {
│ │ │ │ +
101 // basic constants
│ │ │ │ +
│ │ │ │ +
104 enum CmpStyle {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
113 };
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
127 };
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
129 template<class T> struct EpsilonType;
│ │ │ │ +
130
│ │ │ │ +
132
│ │ │ │ +
137 template<class T, CmpStyle style = defaultCmpStyle>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
140 static typename EpsilonType<T>::Type value();
│ │ │ │ +
141 };
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
143 // operations in functional style
│ │ │ │ +
144
│ │ │ │ +
147
│ │ │ │ +
149
│ │ │ │ +
156 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
157 bool eq(const T &first,
│ │ │ │ +
158 const T &second,
│ │ │ │ + │ │ │ │ +
161
│ │ │ │ +
169 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
170 bool ne(const T &first,
│ │ │ │ +
171 const T &second,
│ │ │ │ + │ │ │ │ +
174
│ │ │ │ +
185 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
186 bool gt(const T &first,
│ │ │ │ +
187 const T &second,
│ │ │ │ + │ │ │ │ +
190
│ │ │ │ +
201 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
202 bool lt(const T &first,
│ │ │ │ +
203 const T &second,
│ │ │ │ + │ │ │ │ +
206
│ │ │ │ +
217 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
218 bool ge(const T &first,
│ │ │ │ +
219 const T &second,
│ │ │ │ + │ │ │ │ +
222
│ │ │ │ +
233 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
234 bool le(const T &first,
│ │ │ │ +
235 const T &second,
│ │ │ │ + │ │ │ │ +
237
│ │ │ │ +
238 // rounding operations
│ │ │ │ +
240
│ │ │ │ +
253 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
│ │ │ │ +
254 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
│ │ │ │ +
255 // truncation
│ │ │ │ +
257
│ │ │ │ +
270 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
│ │ │ │ +
271 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
│ │ │ │ +
272
│ │ │ │ +
274 // group FloatCmp
│ │ │ │ +
275 } //namespace FloatCmp
│ │ │ │ +
276
│ │ │ │ +
277
│ │ │ │ +
278 // oo interface
│ │ │ │ +
280
│ │ │ │ +
286 template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
291
│ │ │ │ +
292 public:
│ │ │ │ +
293 // record template parameters
│ │ │ │ +
295 static const CmpStyle cstyle = cstyle_;
│ │ │ │ +
297 static const RoundingStyle rstyle = rstyle_;
│ │ │ │ +
299 typedef T ValueType;
│ │ │ │ +
301
│ │ │ │ + │ │ │ │ +
305
│ │ │ │ +
306 private:
│ │ │ │ +
307 EpsilonType epsilon_;
│ │ │ │ +
308
│ │ │ │ + │ │ │ │ +
310
│ │ │ │ +
311 public:
│ │ │ │ +
313
│ │ │ │ + │ │ │ │ +
317
│ │ │ │ +
319 EpsilonType epsilon() const;
│ │ │ │ +
321 void epsilon(EpsilonType epsilon__);
│ │ │ │ +
322
│ │ │ │ +
324 bool eq(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
326
│ │ │ │ +
329 bool ne(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
331
│ │ │ │ +
335 bool gt(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
337
│ │ │ │ +
341 bool lt(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
343
│ │ │ │ +
347 bool ge(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
349
│ │ │ │ +
353 bool le(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
354
│ │ │ │ +
356
│ │ │ │ +
365 template<class I>
│ │ │ │ +
366 I round(const ValueType &val) const;
│ │ │ │ +
367
│ │ │ │ +
369
│ │ │ │ +
378 template<class I>
│ │ │ │ +
379 I trunc(const ValueType &val) const;
│ │ │ │ +
380
│ │ │ │ +
381 };
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
383} //namespace Dune
│ │ │ │ +
384
│ │ │ │ +
385#include "float_cmp.cc"
│ │ │ │ +
386
│ │ │ │ +
387#endif //DUNE_COMMON_FLOAT_CMP_HH
│ │ │ │ + │ │ │ │ +
bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for inequality using epsilon
Definition float_cmp.cc:151
│ │ │ │ +
CmpStyle
Definition float_cmp.hh:104
│ │ │ │ +
bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for equality using epsilon
Definition float_cmp.cc:144
│ │ │ │ +
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition float_cmp.cc:311
│ │ │ │ +
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition float_cmp.cc:407
│ │ │ │ +
RoundingStyle
Definition float_cmp.hh:116
│ │ │ │ +
bool lt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first lesser than second
Definition float_cmp.cc:165
│ │ │ │ +
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition float_cmp.cc:158
│ │ │ │ +
bool ge(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater or equal second
Definition float_cmp.cc:172
│ │ │ │ +
bool le(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first lesser or equal second
Definition float_cmp.cc:179
│ │ │ │ +
@ defaultCmpStyle
the global default compare style (relative_weak)
Definition float_cmp.hh:112
│ │ │ │ +
@ relativeStrong
|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon
Definition float_cmp.hh:108
│ │ │ │ +
@ relativeWeak
|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon
Definition float_cmp.hh:106
│ │ │ │ +
@ absolute
|a-b| <= epsilon
Definition float_cmp.hh:110
│ │ │ │ +
@ towardZero
always round toward 0
Definition float_cmp.hh:118
│ │ │ │ +
@ towardInf
always round away from 0
Definition float_cmp.hh:120
│ │ │ │ +
@ upward
round toward
Definition float_cmp.hh:124
│ │ │ │ +
@ downward
round toward
Definition float_cmp.hh:122
│ │ │ │ +
@ defaultRoundingStyle
the global default rounding style (toward_zero)
Definition float_cmp.hh:126
│ │ │ │ +
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ +
T Type
The epsilon type corresponding to value type T.
Definition float_cmp.cc:25
│ │ │ │ +
mapping from a value type and a compare style to a default epsilon
Definition float_cmp.hh:138
│ │ │ │ +
static EpsilonType< T >::Type value()
Returns the default epsilon for the given value type and compare style.
│ │ │ │ +
Class encapsulating a default epsilon.
Definition float_cmp.hh:288
│ │ │ │ +
bool le(const ValueType &first, const ValueType &second) const
test if first lesser or equal second
Definition float_cmp.cc:486
│ │ │ │ +
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,35 +1,298 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -boundschecking.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// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ -2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_BOUNDSCHECKING_HH │ │ │ │ │ -4#define DUNE_BOUNDSCHECKING_HH │ │ │ │ │ -5 │ │ │ │ │ -6#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +5#ifndef DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ +6#define DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ 7 │ │ │ │ │ -19#ifndef DUNE_ASSERT_BOUNDS │ │ │ │ │ -20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN) │ │ │ │ │ -21 │ │ │ │ │ -_3_0#define DUNE_ASSERT_BOUNDS(cond) \ │ │ │ │ │ -31 do { \ │ │ │ │ │ -32 if (!(cond)) \ │ │ │ │ │ -33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \ │ │ │ │ │ -34 } while (false) │ │ │ │ │ -35 │ │ │ │ │ -36#else │ │ │ │ │ -37#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -38#endif │ │ │ │ │ -39#endif │ │ │ │ │ -40 │ │ │ │ │ -43#endif // DUNE_BOUNDSCHECKING_HH │ │ │ │ │ -_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ -A few common exception classes. │ │ │ │ │ +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_:_:_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/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: sllist.hh File Reference │ │ │ │ +dune-common: fvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,57 +73,84 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
sllist.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <memory>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include "iteratorfacades.hh"
│ │ │ │ -#include <ostream>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <cstring>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ │ +#include <dune/common/densevector.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/promotiontraits.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::SLList< T, A >
 A single linked list. More...
struct  Dune::DenseMatVecTraits< FieldVector< K, SIZE > >
 
class  Dune::SLListIterator< T, A >
 A mutable iterator for the SLList. More...
struct  Dune::FieldTraits< FieldVector< K, SIZE > >
 
class  Dune::SLListConstIterator< T, A >
 A constant iterator for the SLList. More...
struct  Dune::IsFieldVectorSizeCorrect< C, SIZE >
 TMP to check the size of a DenseVectors statically, if possible. More...
 
class  Dune::SLListModifyIterator< T, A >
 A mutable iterator for the SLList. More...
struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE >, SIZE >
 
struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE1 >, SIZE >
 
class  Dune::FieldVector< K, SIZE >
 vector space out of a tensor product of fields. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<typename T , typename A >
std::ostream & Dune::operator<< (std::ostream &os, const SLList< T, A > &sllist)
 
template<class K , int SIZE>
auto Dune::MathOverloads::isFinite (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 Returns whether all entries are finite.
 
template<class K , int SIZE>
bool Dune::MathOverloads::isInf (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 Returns whether any entry is infinite.
 
template<class K , int SIZE, std::enable_if_t< HasNaN< K >::value, int > = 0>
bool Dune::MathOverloads::isNaN (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 Returns whether any entry is NaN.
 
template<class K , std::enable_if_t< HasNaN< K >::value, int > = 0>
bool Dune::MathOverloads::isUnordered (const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
 Returns true if either b or c is NaN.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implements a singly linked list together with the necessary iterators.

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

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

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,75 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -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 │ │ │ │ │ +fvector.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 vector constructed from a given type representing a field and a │ │ │ │ │ +compile-time given size. _M_o_r_e_._._. │ │ │ │ │ +#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_/_d_e_n_s_e_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_t_r_a_i_t_s_._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_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> │ │ │ │ │ +#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_L_L_i_s_t_<_ _T_,_ _A_ _> │ │ │ │ │ -  A single linked list. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_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_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_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_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t_<_ _C_,_ _S_I_Z_E_ _> │ │ │ │ │ +  TMP to check the size of a DenseVectors statically, if possible. │ │ │ │ │ + _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_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _S_I_Z_E_ _>_,_ _S_I_Z_E_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _S_I_Z_E_1_ _>_,_ _S_I_Z_E_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _> │ │ │ │ │ +  vector space out of a tensor product of fields. _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 │ │ │ │ │ +  │ │ │ │ │ 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) │ │ │ │ │ +template │ │ │ │ │ +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 _F_i_e_l_d_V_e_c_t_o_r< K, SIZE > &b, │ │ │ │ │ + _P_r_i_o_r_i_t_y_T_a_g< 2 >, _A_D_L_T_a_g) │ │ │ │ │ +  Returns whether all entries are finite. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_I_n_f (const _F_i_e_l_d_V_e_c_t_o_r< K, SIZE > &b, _P_r_i_o_r_i_t_y_T_a_g< │ │ │ │ │ + 2 >, _A_D_L_T_a_g) │ │ │ │ │ +  Returns whether any entry is infinite. │ │ │ │ │ +  │ │ │ │ │ +template::value, int > = 0> │ │ │ │ │ +bool  _D_u_n_e_:_:_M_a_t_h_O_v_e_r_l_o_a_d_s_:_:_i_s_N_a_N (const _F_i_e_l_d_V_e_c_t_o_r< K, SIZE > &b, _P_r_i_o_r_i_t_y_T_a_g< │ │ │ │ │ + 2 >, _A_D_L_T_a_g) │ │ │ │ │ +  Returns whether any entry is NaN. │ │ │ │ │ +  │ │ │ │ │ +template::value, int > = 0> │ │ │ │ │ +bool  _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 _F_i_e_l_d_V_e_c_t_o_r< K, 1 > &b, const │ │ │ │ │ + _F_i_e_l_d_V_e_c_t_o_r< K, 1 > &c, _P_r_i_o_r_i_t_y_T_a_g< 2 >, _A_D_L_T_a_g) │ │ │ │ │ +  Returns true if either b or c is NaN. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +Implements a vector constructed from a given type representing a field and a │ │ │ │ │ +compile-time given size. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: sllist.hh Source File │ │ │ │ +dune-common: fvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,780 +74,673 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
sllist.hh
│ │ │ │ +
fvector.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_SLLIST_HH
│ │ │ │ -
6#define DUNE_SLLIST_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_FVECTOR_HH
│ │ │ │ +
6#define DUNE_COMMON_FVECTOR_HH
│ │ │ │
7
│ │ │ │ -
8#include <memory>
│ │ │ │ -
9#include <cassert>
│ │ │ │ -
10#include "iteratorfacades.hh"
│ │ │ │ -
11#include <ostream>
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
26 template<typename T, class A>
│ │ │ │ -
27 class SLListIterator;
│ │ │ │ -
28
│ │ │ │ -
29 template<typename T, class A>
│ │ │ │ -
30 class SLListConstIterator;
│ │ │ │ -
31
│ │ │ │ -
32 template<typename T, class A>
│ │ │ │ -
33 class SLListModifyIterator;
│ │ │ │ -
34
│ │ │ │ -
42 template<typename T, class A=std::allocator<T> >
│ │ │ │ -
│ │ │ │ -
43 class SLList
│ │ │ │ -
44 {
│ │ │ │ -
45 struct Element;
│ │ │ │ -
46 friend class SLListIterator<T,A>;
│ │ │ │ -
47 friend class SLListConstIterator<T,A>;
│ │ │ │ -
48
│ │ │ │ -
49 public:
│ │ │ │ -
50
│ │ │ │ -
54 typedef typename A::size_type size_type;
│ │ │ │ -
55
│ │ │ │ -
59 typedef T MemberType;
│ │ │ │ -
60
│ │ │ │ -
64 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
│ │ │ │ -
65
│ │ │ │ - │ │ │ │ -
70
│ │ │ │ - │ │ │ │ +
8#include <array>
│ │ │ │ +
9#include <cmath>
│ │ │ │ +
10#include <cstdlib>
│ │ │ │ +
11#include <cstring>
│ │ │ │ +
12#include <type_traits>
│ │ │ │ +
13#include <utility>
│ │ │ │ +
14#include <initializer_list>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
19#include <dune/common/math.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25
│ │ │ │ +
35 template< class K, int SIZE > class FieldVector;
│ │ │ │ +
36 template< class K, int SIZE >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
38 {
│ │ │ │ + │ │ │ │ +
40 typedef std::array<K,SIZE> container_type;
│ │ │ │ +
41 typedef K value_type;
│ │ │ │ +
42 typedef typename container_type::size_type size_type;
│ │ │ │ +
43 };
│ │ │ │ +
│ │ │ │ +
44
│ │ │ │ +
45 template< class K, int SIZE >
│ │ │ │ +
│ │ │ │ +
46 struct FieldTraits< FieldVector<K,SIZE> >
│ │ │ │ +
47 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
50 };
│ │ │ │ +
│ │ │ │ +
51
│ │ │ │ +
60 template<typename C, int SIZE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
62 {
│ │ │ │ +
67 constexpr static bool value = true;
│ │ │ │ +
68 };
│ │ │ │ +
│ │ │ │ +
69
│ │ │ │ +
70 template<typename T, int SIZE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
72 {
│ │ │ │ +
73 constexpr static bool value = true;
│ │ │ │ +
74 };
│ │ │ │ +
│ │ │ │
75
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
84 template<typename T1, typename A1>
│ │ │ │ -
│ │ │ │ -
85 SLList(const SLList<T1,A1>& other);
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ -
90 SLList(const SLList<T,A>& other);
│ │ │ │ -
91
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
98
│ │ │ │ - │ │ │ │ -
104
│ │ │ │ +
76 template<typename T, int SIZE, int SIZE1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
78 {
│ │ │ │ +
79 constexpr static bool value = false;
│ │ │ │ +
80 };
│ │ │ │ +
│ │ │ │ +
81
│ │ │ │ +
82
│ │ │ │ +
88 template< class K, int SIZE >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
90 public DenseVector< FieldVector<K,SIZE> >
│ │ │ │ +
91 {
│ │ │ │ +
92 std::array<K,SIZE> _data;
│ │ │ │ + │ │ │ │ +
94 public:
│ │ │ │ +
96 constexpr static int dimension = SIZE;
│ │ │ │ +
97
│ │ │ │ +
98 typedef typename Base::size_type size_type;
│ │ │ │ +
99 typedef typename Base::value_type value_type;
│ │ │ │ +
100
│ │ │ │ + │ │ │ │ +
103
│ │ │ │ + │ │ │ │ +
106
│ │ │ │
│ │ │ │ - │ │ │ │ -
109
│ │ │ │ -
110
│ │ │ │ -
│ │ │ │ -
115 inline void push_back(const MemberType& item);
│ │ │ │ -
116
│ │ │ │ +
108 constexpr FieldVector () noexcept
│ │ │ │ +
109 : _data{}
│ │ │ │ +
110 {}
│ │ │ │ +
│ │ │ │ +
111
│ │ │ │ +
│ │ │ │ +
113 explicit constexpr FieldVector (const K& k)
│ │ │ │ +
114 noexcept(std::is_nothrow_copy_assignable_v<K>)
│ │ │ │ +
115 {
│ │ │ │ +
116 for (auto& d : _data)
│ │ │ │ +
117 d = k;
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │
│ │ │ │ -
121 inline void push_front(const MemberType& item);
│ │ │ │ -
122
│ │ │ │ -
│ │ │ │ -
126 inline void pop_front();
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ -
129 inline void clear();
│ │ │ │ -
130
│ │ │ │ -
│ │ │ │ -
138 inline iterator begin();
│ │ │ │ +
121 constexpr FieldVector (const std::initializer_list<K>& l)
│ │ │ │ +
122 : _data{}
│ │ │ │ +
123 {
│ │ │ │ +
124 assert(l.size() == dimension);
│ │ │ │ +
125 for (int i = 0; i < dimension; ++i)
│ │ │ │ +
126 _data[i] = std::data(l)[i];
│ │ │ │ +
127 }
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
130 template<class T,
│ │ │ │ +
131 std::enable_if_t<IsFieldVectorSizeCorrect<T,dimension>::value, int> = 0,
│ │ │ │ +
132 decltype(std::declval<K&>() = std::declval<const T&>()[0], bool{}) = true>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
134 {
│ │ │ │ +
135 assert(x.size() == dimension);
│ │ │ │ +
136 for (int i = 0; i < dimension; ++i)
│ │ │ │ +
137 _data[i] = x[i];
│ │ │ │ +
138 }
│ │ │ │ +
│ │ │ │
139
│ │ │ │ -
│ │ │ │ -
147 inline const_iterator begin() const;
│ │ │ │ -
148
│ │ │ │ -
│ │ │ │ - │ │ │ │ +
141 template<class T,
│ │ │ │ +
142 std::enable_if_t<std::is_assignable_v<K&, const T&>, int> = 0>
│ │ │ │ +
│ │ │ │ +
143 explicit constexpr FieldVector (const FieldVector<T, SIZE>& x)
│ │ │ │ +
144 noexcept(std::is_nothrow_assignable_v<K&, const T&>)
│ │ │ │ +
145 {
│ │ │ │ +
146 for (int i = 0; i < dimension; ++i)
│ │ │ │ +
147 _data[i] = x[i];
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
151 template<class K1, int SIZE1,
│ │ │ │ +
152 std::enable_if_t<(SIZE1 != SIZE), int> = 0>
│ │ │ │ +
153 explicit FieldVector (const FieldVector<K1, SIZE1>&) = delete;
│ │ │ │ +
154
│ │ │ │ +
156 FieldVector (const FieldVector&) = default;
│ │ │ │
157
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ -
│ │ │ │ -
173 inline iterator end();
│ │ │ │ -
174
│ │ │ │ -
│ │ │ │ -
181 inline const_iterator end() const;
│ │ │ │ -
182
│ │ │ │ -
│ │ │ │ -
188 inline bool empty() const;
│ │ │ │ +
158
│ │ │ │ +
160 template<class T,
│ │ │ │ +
161 std::enable_if_t<IsFieldVectorSizeCorrect<T,dimension>::value, int> = 0,
│ │ │ │ +
162 decltype(std::declval<K&>() = std::declval<const T&>()[0], bool{}) = true>
│ │ │ │ +
│ │ │ │ +
163 FieldVector& operator= (const DenseVector<T>& x)
│ │ │ │ +
164 {
│ │ │ │ +
165 assert(x.size() == dimension);
│ │ │ │ +
166 for (int i = 0; i < dimension; ++i)
│ │ │ │ +
167 _data[i] = x[i];
│ │ │ │ +
168 return *this;
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
172 template<class T,
│ │ │ │ +
173 std::enable_if_t<std::is_assignable_v<K&, const T&>, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
175 noexcept(std::is_nothrow_assignable_v<K&, const T&>)
│ │ │ │ +
176 {
│ │ │ │ +
177 for (int i = 0; i < dimension; ++i)
│ │ │ │ +
178 _data[i] = x[i];
│ │ │ │ +
179 return *this;
│ │ │ │ +
180 }
│ │ │ │ +
│ │ │ │ +
181
│ │ │ │ +
183 template<class K1, int SIZE1,
│ │ │ │ +
184 std::enable_if_t<(SIZE1 != SIZE), int> = 0>
│ │ │ │ +
185 FieldVector& operator= (const FieldVector<K1, SIZE1>&) = delete;
│ │ │ │ +
186
│ │ │ │ +
188 constexpr FieldVector& operator= (const FieldVector&) = default;
│ │ │ │
189
│ │ │ │ -
│ │ │ │ -
194 inline int size() const;
│ │ │ │ -
195
│ │ │ │ +
190 using Base::operator=;
│ │ │ │ +
191
│ │ │ │ +
193 static constexpr size_type size () noexcept { return dimension; }
│ │ │ │ +
194
│ │ │ │
│ │ │ │ -
196 bool operator==(const SLList& sl) const;
│ │ │ │ -
197
│ │ │ │ -
198
│ │ │ │ -
│ │ │ │ -
199 bool operator!=(const SLList& sl) const;
│ │ │ │ -
200
│ │ │ │ -
201 private:
│ │ │ │ -
203 struct Element
│ │ │ │ -
204 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
213
│ │ │ │ -
│ │ │ │ -
214 Element(const MemberType& item, Element* next_=0);
│ │ │ │ -
215
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ + │ │ │ │ +
199 return _data[i];
│ │ │ │ +
200 }
│ │ │ │ +
│ │ │ │ +
201
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
204 {
│ │ │ │ + │ │ │ │ +
206 return _data[i];
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
│ │ │ │ +
210 constexpr K* data () noexcept
│ │ │ │ +
211 {
│ │ │ │ +
212 return _data.data();
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │
│ │ │ │ - │ │ │ │ -
217
│ │ │ │ - │ │ │ │ -
219 };
│ │ │ │ -
220
│ │ │ │ -
225 void deleteNext(Element* current);
│ │ │ │ -
226
│ │ │ │ -
231 void copyElements(const SLList<T,A>& other);
│ │ │ │ -
232
│ │ │ │ -
240 template<bool watchForTail>
│ │ │ │ -
241 void deleteNext(Element* current);
│ │ │ │ -
247 void insertAfter(Element* current, const T& item);
│ │ │ │ -
248
│ │ │ │ -
250 Element beforeHead_;
│ │ │ │ -
251
│ │ │ │ -
257 Element* tail_;
│ │ │ │ -
258
│ │ │ │ -
260 Allocator allocator_;
│ │ │ │ -
261
│ │ │ │ -
263 int size_;
│ │ │ │ -
264 };
│ │ │ │ -
265
│ │ │ │ -
269 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
270 class SLListIterator : public Dune::ForwardIteratorFacade<SLListIterator<T,A>, T, T&, std::size_t>
│ │ │ │ -
271 {
│ │ │ │ -
272 friend class SLListConstIterator<T,A>;
│ │ │ │ -
273 friend class SLListModifyIterator<T,A>;
│ │ │ │ -
274 friend class SLList<T,A>;
│ │ │ │ -
275
│ │ │ │ -
276 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
278 SLList<T,A>* sllist)
│ │ │ │ -
279 : current_(item), list_(sllist)
│ │ │ │ -
280 {}
│ │ │ │ -
│ │ │ │ -
281
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 : current_(0), list_(0)
│ │ │ │ -
284 {}
│ │ │ │ -
│ │ │ │ -
285
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
287 : current_(other.iterator_.current_), list_(other.iterator_.list_)
│ │ │ │ -
288 {}
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
│ │ │ │ -
294 inline T& dereference() const
│ │ │ │ -
295 {
│ │ │ │ -
296 return current_->item_;
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
│ │ │ │ -
304 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
305 {
│ │ │ │ -
306 return current_==other.current_;
│ │ │ │ -
307 }
│ │ │ │ +
216 constexpr const K* data () const noexcept
│ │ │ │ +
217 {
│ │ │ │ +
218 return _data.data();
│ │ │ │ +
219 }
│ │ │ │
│ │ │ │ +
220
│ │ │ │ +
222 template<class Scalar,
│ │ │ │ +
223 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
224 friend constexpr auto operator* (const FieldVector& vector, Scalar scalar)
│ │ │ │ +
225 {
│ │ │ │ + │ │ │ │ +
227 FieldVector<T,SIZE> result;
│ │ │ │ +
228
│ │ │ │ +
229 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
230 result[i] = vector[i] * scalar;
│ │ │ │ +
231 return result;
│ │ │ │ +
232 }
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
235 template<class Scalar,
│ │ │ │ +
236 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
237 friend constexpr auto operator* (Scalar scalar, const FieldVector& vector)
│ │ │ │ +
238 {
│ │ │ │ + │ │ │ │ +
240 FieldVector<T,SIZE> result;
│ │ │ │ +
241
│ │ │ │ +
242 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
243 result[i] = scalar * vector[i];
│ │ │ │ +
244 return result;
│ │ │ │ +
245 }
│ │ │ │ +
│ │ │ │ +
246
│ │ │ │ +
248 template<class Scalar,
│ │ │ │ +
249 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
250 friend constexpr auto operator/ (const FieldVector& vector, Scalar scalar)
│ │ │ │ +
251 {
│ │ │ │ + │ │ │ │ +
253 FieldVector<T,SIZE> result;
│ │ │ │ +
254
│ │ │ │ +
255 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
256 result[i] = vector[i] / scalar;
│ │ │ │ +
257
│ │ │ │ +
258 return result;
│ │ │ │ +
259 }
│ │ │ │ +
│ │ │ │ +
260
│ │ │ │ +
261 };
│ │ │ │ +
│ │ │ │ +
262
│ │ │ │ +
274 template<class K, int SIZE>
│ │ │ │ +
│ │ │ │ +
275 std::istream &operator>> (std::istream& in, FieldVector<K, SIZE>& v)
│ │ │ │ +
276 {
│ │ │ │ + │ │ │ │ +
278 for (int i = 0; i < SIZE; ++i)
│ │ │ │ +
279 in >> w[i];
│ │ │ │ +
280 if (in)
│ │ │ │ +
281 v = w;
│ │ │ │ +
282 return in;
│ │ │ │ +
283 }
│ │ │ │ +
│ │ │ │ +
284
│ │ │ │ +
285#ifndef DOXYGEN
│ │ │ │ +
286 template< class K >
│ │ │ │ +
287 struct DenseMatVecTraits< FieldVector<K,1> >
│ │ │ │ +
288 {
│ │ │ │ +
289 typedef FieldVector<K,1> derived_type;
│ │ │ │ +
290 typedef K container_type;
│ │ │ │ +
291 typedef K value_type;
│ │ │ │ +
292 typedef size_t size_type;
│ │ │ │ +
293 };
│ │ │ │ +
294
│ │ │ │ +
297 template<class K>
│ │ │ │ +
298 class FieldVector<K, 1> :
│ │ │ │ +
299 public DenseVector< FieldVector<K,1> >
│ │ │ │ +
300 {
│ │ │ │ +
301 K _data;
│ │ │ │ +
302 typedef DenseVector< FieldVector<K,1> > Base;
│ │ │ │ +
303 public:
│ │ │ │ +
305 constexpr static int dimension = 1;
│ │ │ │ +
306
│ │ │ │ +
307 typedef typename Base::size_type size_type;
│ │ │ │
308
│ │ │ │ -
│ │ │ │ -
314 inline bool equals(const SLListIterator<T,A>& other) const
│ │ │ │ -
315 {
│ │ │ │ -
316 return current_==other.current_;
│ │ │ │ -
317 }
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
│ │ │ │ -
324 inline bool equals(const SLListModifyIterator<T,A>& other) const
│ │ │ │ -
325 {
│ │ │ │ -
326 return current_==other.iterator_.current_;
│ │ │ │ -
327 }
│ │ │ │ -
│ │ │ │ +
310 typedef K& reference;
│ │ │ │ +
311
│ │ │ │ +
313 typedef const K& const_reference;
│ │ │ │ +
314
│ │ │ │ +
315 //===== construction
│ │ │ │ +
316
│ │ │ │ +
318 constexpr FieldVector () noexcept
│ │ │ │ +
319 : _data()
│ │ │ │ +
320 {}
│ │ │ │ +
321
│ │ │ │ +
323 template<class T,
│ │ │ │ +
324 std::enable_if_t<std::is_constructible_v<K,T>, int> = 0>
│ │ │ │ +
325 constexpr FieldVector (const T& k) noexcept
│ │ │ │ +
326 : _data(k)
│ │ │ │ +
327 {}
│ │ │ │
328
│ │ │ │ -
│ │ │ │ -
332 inline void increment()
│ │ │ │ -
333 {
│ │ │ │ -
334 current_ = current_->next_;
│ │ │ │ -
335 }
│ │ │ │ -
│ │ │ │ -
336
│ │ │ │ -
│ │ │ │ -
342 inline void insertAfter(const T& v) const
│ │ │ │ -
343 {
│ │ │ │ -
344 assert(list_ );
│ │ │ │ -
345 list_->insertAfter(current_, v);
│ │ │ │ -
346 }
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ -
│ │ │ │ -
353 inline void deleteNext() const
│ │ │ │ -
354 {
│ │ │ │ -
355 assert(list_);
│ │ │ │ -
356 list_->deleteNext(current_);
│ │ │ │ -
357 }
│ │ │ │ -
│ │ │ │ +
330 constexpr FieldVector (const std::initializer_list<K>& l)
│ │ │ │ +
331 {
│ │ │ │ +
332 assert(l.size() == 1);
│ │ │ │ +
333 _data = *l.begin();
│ │ │ │ +
334 }
│ │ │ │ +
335
│ │ │ │ +
337 template<class T,
│ │ │ │ +
338 std::enable_if_t<std::is_constructible_v<K,T>, int> = 0>
│ │ │ │ +
339 constexpr FieldVector (const FieldVector<T,1>& x) noexcept
│ │ │ │ +
340 : _data(x[0])
│ │ │ │ +
341 {}
│ │ │ │ +
342
│ │ │ │ +
344 template<class T,
│ │ │ │ +
345 std::enable_if_t<IsFieldVectorSizeCorrect<T,1>::value, int> = 0,
│ │ │ │ +
346 decltype(std::declval<K&>() = std::declval<const T&>()[0], bool{}) = true>
│ │ │ │ +
347 FieldVector (const DenseVector<T>& x)
│ │ │ │ +
348 {
│ │ │ │ +
349 assert(x.size() == 1);
│ │ │ │ +
350 _data = x[0];
│ │ │ │ +
351 }
│ │ │ │ +
352
│ │ │ │ +
354 constexpr FieldVector (const FieldVector&) = default;
│ │ │ │ +
355
│ │ │ │ +
357 constexpr FieldVector& operator= (const FieldVector&) = default;
│ │ │ │
358
│ │ │ │ -
359 private:
│ │ │ │ -
361 typename SLList<T,A>::Element* current_;
│ │ │ │ - │ │ │ │ -
364 };
│ │ │ │ -
│ │ │ │ -
365
│ │ │ │ -
369 template<class T, class A>
│ │ │ │ -
│ │ │ │ -
370 class SLListConstIterator : public Dune::ForwardIteratorFacade<SLListConstIterator<T,A>, const T, const T&, std::size_t>
│ │ │ │ -
371 {
│ │ │ │ -
372 friend class SLListIterator<T,A>;
│ │ │ │ -
373 friend class SLList<T,A>;
│ │ │ │ -
374
│ │ │ │ -
375 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
377 : current_(0)
│ │ │ │ -
378 {}
│ │ │ │ -
│ │ │ │ -
379
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
381 : current_(item)
│ │ │ │ -
382 {}
│ │ │ │ -
│ │ │ │ -
383
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
385 : current_(other.current_)
│ │ │ │ -
386 {}
│ │ │ │ -
│ │ │ │ +
360 template<class T,
│ │ │ │ +
361 decltype(std::declval<K&>() = std::declval<const T&>(), bool{}) = true>
│ │ │ │ +
362 constexpr FieldVector& operator= (const FieldVector<T,1>& other) noexcept
│ │ │ │ +
363 {
│ │ │ │ +
364 _data = other[0];
│ │ │ │ +
365 return *this;
│ │ │ │ +
366 }
│ │ │ │ +
367
│ │ │ │ +
369 template<class T,
│ │ │ │ +
370 std::enable_if_t<IsFieldVectorSizeCorrect<T,1>::value, int> = 0,
│ │ │ │ +
371 decltype(std::declval<K&>() = std::declval<const T&>()[0], bool{}) = true>
│ │ │ │ +
372 FieldVector& operator= (const DenseVector<T>& other)
│ │ │ │ +
373 {
│ │ │ │ +
374 assert(other.size() == 1);
│ │ │ │ +
375 _data = other[0];
│ │ │ │ +
376 return *this;
│ │ │ │ +
377 }
│ │ │ │ +
378
│ │ │ │ +
380 template<class T,
│ │ │ │ +
381 decltype(std::declval<K&>() = std::declval<const T&>(), bool{}) = true>
│ │ │ │ +
382 constexpr FieldVector& operator= (const T& k) noexcept
│ │ │ │ +
383 {
│ │ │ │ +
384 _data = k;
│ │ │ │ +
385 return *this;
│ │ │ │ +
386 }
│ │ │ │
387
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
389 : current_(other.iterator_.current_)
│ │ │ │ -
390 {}
│ │ │ │ -
│ │ │ │ -
391
│ │ │ │ -
│ │ │ │ -
396 inline const T& dereference() const
│ │ │ │ +
388 //===== forward methods to container
│ │ │ │ +
389 static constexpr size_type size () noexcept { return 1; }
│ │ │ │ +
390
│ │ │ │ +
391 reference operator[] ([[maybe_unused]] size_type i)
│ │ │ │ +
392 {
│ │ │ │ +
393 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ +
394 return _data;
│ │ │ │ +
395 }
│ │ │ │ +
396 const_reference operator[] ([[maybe_unused]] size_type i) const
│ │ │ │
397 {
│ │ │ │ -
398 return current_->item_;
│ │ │ │ -
399 }
│ │ │ │ -
│ │ │ │ -
400
│ │ │ │ -
│ │ │ │ -
406 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
407 {
│ │ │ │ -
408 return current_==other.current_;
│ │ │ │ -
409 }
│ │ │ │ -
│ │ │ │ -
410
│ │ │ │ -
│ │ │ │ -
414 inline void increment()
│ │ │ │ -
415 {
│ │ │ │ -
416 current_ = current_->next_;
│ │ │ │ -
417 }
│ │ │ │ -
│ │ │ │ +
398 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ +
399 return _data;
│ │ │ │ +
400 }
│ │ │ │ +
401
│ │ │ │ +
403 constexpr K* data () noexcept
│ │ │ │ +
404 {
│ │ │ │ +
405 return &_data;
│ │ │ │ +
406 }
│ │ │ │ +
407
│ │ │ │ +
409 constexpr const K* data () const noexcept
│ │ │ │ +
410 {
│ │ │ │ +
411 return &_data;
│ │ │ │ +
412 }
│ │ │ │ +
413
│ │ │ │ +
414 //===== conversion operator
│ │ │ │ +
415
│ │ │ │ +
417 constexpr operator reference () noexcept { return _data; }
│ │ │ │
418
│ │ │ │ -
419 private:
│ │ │ │ -
421 typename SLList<T,A>::Element* current_;
│ │ │ │ -
422 };
│ │ │ │ -
│ │ │ │ -
423
│ │ │ │ -
427 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
428 class SLListModifyIterator : public Dune::ForwardIteratorFacade<SLListModifyIterator<T,A>, T, T&, std::size_t>
│ │ │ │ +
420 constexpr operator const_reference () const noexcept { return _data; }
│ │ │ │ +
421 };
│ │ │ │ +
422
│ │ │ │ +
423 /* ----- FV / FV ----- */
│ │ │ │ +
424 /* mostly not necessary as these operations are already covered via the cast operator */
│ │ │ │ +
425
│ │ │ │ +
427 template<class K>
│ │ │ │ +
428 constexpr bool operator> (const FieldVector<K,1>& a, const FieldVector<K,1>& b) noexcept
│ │ │ │
429 {
│ │ │ │ -
430 friend class SLListConstIterator<T,A>;
│ │ │ │ -
431 friend class SLListIterator<T,A>;
│ │ │ │ -
432 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
434 SLListIterator<T,A> _iterator)
│ │ │ │ -
435 : beforeIterator_(beforeIterator), iterator_(_iterator)
│ │ │ │ -
436 {}
│ │ │ │ -
│ │ │ │ -
437
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
439 : beforeIterator_(), iterator_()
│ │ │ │ -
440 {}
│ │ │ │ -
│ │ │ │ -
441
│ │ │ │ -
│ │ │ │ -
446 inline T& dereference() const
│ │ │ │ -
447 {
│ │ │ │ -
448 return *iterator_;
│ │ │ │ -
449 }
│ │ │ │ -
│ │ │ │ -
450
│ │ │ │ -
│ │ │ │ -
456 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
457 {
│ │ │ │ -
458 return iterator_== other;
│ │ │ │ -
459 }
│ │ │ │ -
│ │ │ │ -
460
│ │ │ │ -
461
│ │ │ │ -
│ │ │ │ -
467 inline bool equals(const SLListIterator<T,A>& other) const
│ │ │ │ -
468 {
│ │ │ │ -
469 return iterator_== other;
│ │ │ │ -
470 }
│ │ │ │ -
│ │ │ │ -
471
│ │ │ │ -
472
│ │ │ │ -
│ │ │ │ -
478 inline bool equals(const SLListModifyIterator<T,A>& other) const
│ │ │ │ -
479 {
│ │ │ │ -
480 return iterator_== other.iterator_;
│ │ │ │ -
481 }
│ │ │ │ -
│ │ │ │ -
482
│ │ │ │ -
│ │ │ │ -
486 inline void increment()
│ │ │ │ -
487 {
│ │ │ │ -
488 ++iterator_;
│ │ │ │ -
489 ++beforeIterator_;
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491
│ │ │ │ -
│ │ │ │ -
505 inline void insert(const T& v)
│ │ │ │ -
506 {
│ │ │ │ -
507 beforeIterator_.insertAfter(v);
│ │ │ │ -
508 ++beforeIterator_;
│ │ │ │ -
509 }
│ │ │ │ -
│ │ │ │ -
510
│ │ │ │ -
│ │ │ │ -
518 inline void remove()
│ │ │ │ -
519 {
│ │ │ │ -
520 ++iterator_;
│ │ │ │ -
521 beforeIterator_.deleteNext();
│ │ │ │ -
522 }
│ │ │ │ -
│ │ │ │ -
523
│ │ │ │ -
524 private:
│ │ │ │ -
526 SLListIterator<T,A> beforeIterator_;
│ │ │ │ -
528 SLListIterator<T,A> iterator_;
│ │ │ │ -
529 };
│ │ │ │ -
│ │ │ │ -
530
│ │ │ │ -
531 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ -
532 std::ostream& operator<<(std::ostream& os, const SLList<T,A>& sllist)
│ │ │ │ -
533 {
│ │ │ │ -
534 typedef typename SLList<T,A>::const_iterator Iterator;
│ │ │ │ -
535 Iterator end = sllist.end();
│ │ │ │ -
536 Iterator current= sllist.begin();
│ │ │ │ -
537
│ │ │ │ -
538 os << "{ ";
│ │ │ │ -
539
│ │ │ │ -
540 if(current!=end) {
│ │ │ │ -
541 os<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
│ │ │ │ -
542 ++current;
│ │ │ │ -
543
│ │ │ │ -
544 for(; current != end; ++current)
│ │ │ │ -
545 os<<", "<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
│ │ │ │ -
546 }
│ │ │ │ -
547 os<<"} ";
│ │ │ │ -
548 return os;
│ │ │ │ -
549 }
│ │ │ │ -
│ │ │ │ -
550
│ │ │ │ -
551 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
552 SLList<T,A>::Element::Element(const MemberType& item, Element* next)
│ │ │ │ -
553 : next_(next), item_(item)
│ │ │ │ -
554 {}
│ │ │ │ -
│ │ │ │ +
430 return a[0]>b[0];
│ │ │ │ +
431 }
│ │ │ │ +
432
│ │ │ │ +
434 template<class K>
│ │ │ │ +
435 constexpr bool operator>= (const FieldVector<K,1>& a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
436 {
│ │ │ │ +
437 return a[0]>=b[0];
│ │ │ │ +
438 }
│ │ │ │ +
439
│ │ │ │ +
441 template<class K>
│ │ │ │ +
442 constexpr bool operator< (const FieldVector<K,1>& a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
443 {
│ │ │ │ +
444 return a[0]<b[0];
│ │ │ │ +
445 }
│ │ │ │ +
446
│ │ │ │ +
448 template<class K>
│ │ │ │ +
449 constexpr bool operator<= (const FieldVector<K,1>& a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
450 {
│ │ │ │ +
451 return a[0]<=b[0];
│ │ │ │ +
452 }
│ │ │ │ +
453
│ │ │ │ +
454 /* ----- FV / scalar ----- */
│ │ │ │ +
455
│ │ │ │ +
457 template<class K>
│ │ │ │ +
458 constexpr FieldVector<K,1> operator+ (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
459 {
│ │ │ │ +
460 return a[0]+b;
│ │ │ │ +
461 }
│ │ │ │ +
462
│ │ │ │ +
464 template<class K>
│ │ │ │ +
465 constexpr FieldVector<K,1> operator- (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
466 {
│ │ │ │ +
467 return a[0]-b;
│ │ │ │ +
468 }
│ │ │ │ +
469
│ │ │ │ +
471 template<class K>
│ │ │ │ +
472 constexpr FieldVector<K,1> operator* (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
473 {
│ │ │ │ +
474 return a[0]*b;
│ │ │ │ +
475 }
│ │ │ │ +
476
│ │ │ │ +
478 template<class K>
│ │ │ │ +
479 constexpr FieldVector<K,1> operator/ (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
480 {
│ │ │ │ +
481 return a[0]/b;
│ │ │ │ +
482 }
│ │ │ │ +
483
│ │ │ │ +
485 template<class K>
│ │ │ │ +
486 constexpr bool operator> (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
487 {
│ │ │ │ +
488 return a[0]>b;
│ │ │ │ +
489 }
│ │ │ │ +
490
│ │ │ │ +
492 template<class K>
│ │ │ │ +
493 constexpr bool operator>= (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
494 {
│ │ │ │ +
495 return a[0]>=b;
│ │ │ │ +
496 }
│ │ │ │ +
497
│ │ │ │ +
499 template<class K>
│ │ │ │ +
500 constexpr bool operator< (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
501 {
│ │ │ │ +
502 return a[0]<b;
│ │ │ │ +
503 }
│ │ │ │ +
504
│ │ │ │ +
506 template<class K>
│ │ │ │ +
507 constexpr bool operator<= (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
508 {
│ │ │ │ +
509 return a[0]<=b;
│ │ │ │ +
510 }
│ │ │ │ +
511
│ │ │ │ +
513 template<class K>
│ │ │ │ +
514 constexpr bool operator== (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
515 {
│ │ │ │ +
516 return a[0]==b;
│ │ │ │ +
517 }
│ │ │ │ +
518
│ │ │ │ +
520 template<class K>
│ │ │ │ +
521 constexpr bool operator!= (const FieldVector<K,1>& a, const K b) noexcept
│ │ │ │ +
522 {
│ │ │ │ +
523 return a[0]!=b;
│ │ │ │ +
524 }
│ │ │ │ +
525
│ │ │ │ +
526 /* ----- scalar / FV ------ */
│ │ │ │ +
527
│ │ │ │ +
529 template<class K>
│ │ │ │ +
530 constexpr FieldVector<K,1> operator+ (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
531 {
│ │ │ │ +
532 return a+b[0];
│ │ │ │ +
533 }
│ │ │ │ +
534
│ │ │ │ +
536 template<class K>
│ │ │ │ +
537 constexpr FieldVector<K,1> operator- (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
538 {
│ │ │ │ +
539 return a-b[0];
│ │ │ │ +
540 }
│ │ │ │ +
541
│ │ │ │ +
543 template<class K>
│ │ │ │ +
544 constexpr FieldVector<K,1> operator* (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
545 {
│ │ │ │ +
546 return a*b[0];
│ │ │ │ +
547 }
│ │ │ │ +
548
│ │ │ │ +
550 template<class K>
│ │ │ │ +
551 constexpr FieldVector<K,1> operator/ (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
552 {
│ │ │ │ +
553 return a/b[0];
│ │ │ │ +
554 }
│ │ │ │
555
│ │ │ │ -
556 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
558 : next_(0), item_()
│ │ │ │ -
559 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
560
│ │ │ │ -
561 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
563 {
│ │ │ │ -
564 next_=0;
│ │ │ │ -
565 }
│ │ │ │ -
│ │ │ │ -
566
│ │ │ │ -
567 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ -
570 {
│ │ │ │ -
571 beforeHead_.next_=0;
│ │ │ │ -
572 assert(&beforeHead_==tail_);
│ │ │ │ -
573 assert(tail_->next_==0);
│ │ │ │ -
574 }
│ │ │ │ -
│ │ │ │ -
575
│ │ │ │ -
576 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ -
579 {
│ │ │ │ -
580 copyElements(other);
│ │ │ │ -
581 }
│ │ │ │ -
│ │ │ │ -
582
│ │ │ │ -
583 template<typename T, class A>
│ │ │ │ -
584 template<typename T1, class A1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ +
557 template<class K>
│ │ │ │ +
558 constexpr bool operator> (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
559 {
│ │ │ │ +
560 return a>b[0];
│ │ │ │ +
561 }
│ │ │ │ +
562
│ │ │ │ +
564 template<class K>
│ │ │ │ +
565 constexpr bool operator>= (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
566 {
│ │ │ │ +
567 return a>=b[0];
│ │ │ │ +
568 }
│ │ │ │ +
569
│ │ │ │ +
571 template<class K>
│ │ │ │ +
572 constexpr bool operator< (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
573 {
│ │ │ │ +
574 return a<b[0];
│ │ │ │ +
575 }
│ │ │ │ +
576
│ │ │ │ +
578 template<class K>
│ │ │ │ +
579 constexpr bool operator<= (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
580 {
│ │ │ │ +
581 return a<=b[0];
│ │ │ │ +
582 }
│ │ │ │ +
583
│ │ │ │ +
585 template<class K>
│ │ │ │ +
586 constexpr bool operator== (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │
587 {
│ │ │ │ -
588 copyElements(other);
│ │ │ │ +
588 return a==b[0];
│ │ │ │
589 }
│ │ │ │ -
│ │ │ │
590
│ │ │ │ -
591 template<typename T, typename A>
│ │ │ │ -
592 void SLList<T,A>::copyElements(const SLList<T,A>& other)
│ │ │ │ -
593 {
│ │ │ │ -
594 assert(tail_==&beforeHead_);
│ │ │ │ -
595 assert(size_==0);
│ │ │ │ -
596 typedef typename SLList<T,A>::const_iterator Iterator;
│ │ │ │ -
597 Iterator iend = other.end();
│ │ │ │ -
598 for(Iterator element=other.begin(); element != iend; ++element)
│ │ │ │ -
599 push_back(*element);
│ │ │ │ -
600
│ │ │ │ -
601 assert(other.size()==size());
│ │ │ │ -
602 }
│ │ │ │ -
603
│ │ │ │ -
604 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
606 {
│ │ │ │ -
607 clear();
│ │ │ │ -
608 }
│ │ │ │ -
│ │ │ │ -
609
│ │ │ │ -
610 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
611 bool SLList<T,A>::operator==(const SLList& other) const
│ │ │ │ -
612 {
│ │ │ │ -
613 if(size()!=other.size())
│ │ │ │ -
614 return false;
│ │ │ │ -
615 for(const_iterator iter=begin(), oiter=other.begin();
│ │ │ │ -
616 iter != end(); ++iter, ++oiter)
│ │ │ │ -
617 if(*iter!=*oiter)
│ │ │ │ -
618 return false;
│ │ │ │ -
619 return true;
│ │ │ │ -
620 }
│ │ │ │ -
│ │ │ │ -
621
│ │ │ │ -
622 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
623 bool SLList<T,A>::operator!=(const SLList& other) const
│ │ │ │ -
624 {
│ │ │ │ -
625 if(size()==other.size()) {
│ │ │ │ -
626 for(const_iterator iter=begin(), oiter=other.begin();
│ │ │ │ -
627 iter != end(); ++iter, ++oiter)
│ │ │ │ -
628 if(*iter!=*oiter)
│ │ │ │ -
629 return true;
│ │ │ │ -
630 return false;
│ │ │ │ -
631 }else
│ │ │ │ -
632 return true;
│ │ │ │ -
633 }
│ │ │ │ -
│ │ │ │ -
634 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
636 {
│ │ │ │ -
637 clear();
│ │ │ │ -
638 copyElements(other);
│ │ │ │ -
639 return *this;
│ │ │ │ -
640 }
│ │ │ │ -
│ │ │ │ -
641
│ │ │ │ -
642 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
643 inline void SLList<T,A>::push_back(const MemberType& item)
│ │ │ │ -
644 {
│ │ │ │ -
645 assert(size_>0 || tail_==&beforeHead_);
│ │ │ │ -
646 tail_->next_ = allocator_.allocate(1);
│ │ │ │ -
647 assert(size_>0 || tail_==&beforeHead_);
│ │ │ │ -
648 tail_ = tail_->next_;
│ │ │ │ -
649 ::new (static_cast<void*>(&(tail_->item_)))T(item);
│ │ │ │ -
650 tail_->next_=0;
│ │ │ │ -
651 assert(tail_->next_==0);
│ │ │ │ -
652 ++size_;
│ │ │ │ -
653 }
│ │ │ │ -
│ │ │ │ -
654
│ │ │ │ -
655 template<typename T, class A>
│ │ │ │ -
656 inline void SLList<T,A>::insertAfter(Element* current, const T& item)
│ │ │ │ -
657 {
│ │ │ │ -
658 assert(current);
│ │ │ │ -
659
│ │ │ │ -
660#ifndef NDEBUG
│ │ │ │ -
661 bool changeTail = (current == tail_);
│ │ │ │ -
662#endif
│ │ │ │ -
663
│ │ │ │ -
664 // Save old next element
│ │ │ │ -
665 Element* tmp = current->next_;
│ │ │ │ -
666
│ │ │ │ -
667 assert(!changeTail || !tmp);
│ │ │ │ -
668
│ │ │ │ -
669 // Allocate space
│ │ │ │ -
670 current->next_ = allocator_.allocate(1);
│ │ │ │ -
671
│ │ │ │ -
672 // Use copy constructor to initialize memory
│ │ │ │ -
673 std::allocator_traits<Allocator>::construct(allocator_, current->next_, Element(item,tmp));
│ │ │ │ -
674
│ │ │ │ -
675 //::new(static_cast<void*>(&(current->next_->item_))) T(item);
│ │ │ │ -
676
│ │ │ │ -
677 if(!current->next_->next_) {
│ │ │ │ -
678 // Update tail
│ │ │ │ -
679 assert(changeTail);
│ │ │ │ -
680 tail_ = current->next_;
│ │ │ │ -
681 }
│ │ │ │ -
682 ++size_;
│ │ │ │ -
683 assert(!tail_->next_);
│ │ │ │ -
684 }
│ │ │ │ -
685
│ │ │ │ -
686 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
687 inline void SLList<T,A>::push_front(const MemberType& item)
│ │ │ │ -
688 {
│ │ │ │ -
689 if(tail_ == &beforeHead_) {
│ │ │ │ -
690 // list was empty
│ │ │ │ -
691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0);
│ │ │ │ -
692 ::new(static_cast<void*>(&beforeHead_.next_->item_))T(item);
│ │ │ │ -
693 beforeHead_.next_->next_=0;
│ │ │ │ -
694 }else{
│ │ │ │ -
695 Element* added = allocator_.allocate(1, 0);
│ │ │ │ -
696 ::new(static_cast<void*>(&added->item_))T(item);
│ │ │ │ -
697 added->next_=beforeHead_.next_;
│ │ │ │ -
698 beforeHead_.next_=added;
│ │ │ │ -
699 }
│ │ │ │ -
700 assert(tail_->next_==0);
│ │ │ │ -
701 ++size_;
│ │ │ │ -
702 }
│ │ │ │ -
│ │ │ │ -
703
│ │ │ │ -
704
│ │ │ │ -
705 template<typename T, class A>
│ │ │ │ -
706 inline void SLList<T,A>::deleteNext(Element* current)
│ │ │ │ -
707 {
│ │ │ │ -
708 this->template deleteNext<true>(current);
│ │ │ │ -
709 }
│ │ │ │ -
710
│ │ │ │ -
711 template<typename T, class A>
│ │ │ │ -
712 template<bool watchForTail>
│ │ │ │ -
713 inline void SLList<T,A>::deleteNext(Element* current)
│ │ │ │ -
714 {
│ │ │ │ -
715 assert(current->next_);
│ │ │ │ -
716 Element* next = current->next_;
│ │ │ │ -
717
│ │ │ │ -
718 if(watchForTail)
│ │ │ │ -
719 if(next == tail_) {
│ │ │ │ -
720 // deleting last element changes tail!
│ │ │ │ -
721 tail_ = current;
│ │ │ │ -
722 }
│ │ │ │ -
723
│ │ │ │ -
724 current->next_ = next->next_;
│ │ │ │ -
725 std::allocator_traits<Allocator>::destroy(allocator_, next);
│ │ │ │ -
726 allocator_.deallocate(next, 1);
│ │ │ │ -
727 --size_;
│ │ │ │ -
728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0);
│ │ │ │ -
729 }
│ │ │ │ -
730
│ │ │ │ -
731 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
733 {
│ │ │ │ -
734 deleteNext(&beforeHead_);
│ │ │ │ -
735 }
│ │ │ │ -
│ │ │ │ -
736
│ │ │ │ -
737 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
738 inline void SLList<T,A>::clear()
│ │ │ │ -
739 {
│ │ │ │ -
740 while(beforeHead_.next_ ) {
│ │ │ │ -
741 this->template deleteNext<false>(&beforeHead_);
│ │ │ │ -
742 }
│ │ │ │ -
743
│ │ │ │ -
744 assert(size_==0);
│ │ │ │ -
745 // update the tail!
│ │ │ │ -
746 tail_ = &beforeHead_;
│ │ │ │ -
747 }
│ │ │ │ -
│ │ │ │ -
748
│ │ │ │ -
749 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
750 inline bool SLList<T,A>::empty() const
│ │ │ │ -
751 {
│ │ │ │ -
752 return (&beforeHead_ == tail_);
│ │ │ │ -
753 }
│ │ │ │ -
│ │ │ │ -
754
│ │ │ │ -
755 template<typename T, class A>
│ │ │ │ -
│ │ │ │ -
756 inline int SLList<T,A>::size() const
│ │ │ │ -
757 {
│ │ │ │ -
758 return size_;
│ │ │ │ -
759 }
│ │ │ │ -
│ │ │ │ -
760
│ │ │ │ -
761 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
763 {
│ │ │ │ -
764 return iterator(beforeHead_.next_, this);
│ │ │ │ -
765 }
│ │ │ │ -
│ │ │ │ -
766
│ │ │ │ -
767 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
769 {
│ │ │ │ -
770 return const_iterator(beforeHead_.next_);
│ │ │ │ -
771 }
│ │ │ │ -
│ │ │ │ -
772
│ │ │ │ -
773 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
775 {
│ │ │ │ -
776 return iterator();
│ │ │ │ -
777 }
│ │ │ │ -
│ │ │ │ -
778
│ │ │ │ -
779 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
781 {
│ │ │ │ -
782 return SLListModifyIterator<T,A>(iterator(tail_, this),iterator());
│ │ │ │ -
783 }
│ │ │ │ -
│ │ │ │ -
784
│ │ │ │ -
785
│ │ │ │ -
786 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
788 {
│ │ │ │ -
789 return SLListModifyIterator<T,A>(iterator(&beforeHead_, this),
│ │ │ │ -
790 iterator(beforeHead_.next_, this));
│ │ │ │ -
791 }
│ │ │ │ -
│ │ │ │ -
792
│ │ │ │ -
793 template<typename T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
795 {
│ │ │ │ -
796 return const_iterator();
│ │ │ │ -
797 }
│ │ │ │ -
│ │ │ │ -
798
│ │ │ │ -
800}
│ │ │ │ -
801#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
This file implements iterator facade classes for writing stl conformant iterators.
│ │ │ │ -
void push_front(const MemberType &item)
Add a new entry to the beginning of the list.
Definition sllist.hh:687
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Equality test for the iterator facade.
Definition sllist.hh:406
│ │ │ │ -
void push_back(const MemberType &item)
Add a new entry to the end of the list.
Definition sllist.hh:643
│ │ │ │ -
ModifyIterator endModify()
Get an iterator capable of deleting and inserting elements.
Definition sllist.hh:780
│ │ │ │ -
SLListModifyIterator()
Definition sllist.hh:438
│ │ │ │ -
Element()
Definition sllist.hh:557
│ │ │ │ -
T & dereference() const
Dereferencing function for the iterator facade.
Definition sllist.hh:294
│ │ │ │ -
bool operator!=(const SLList &sl) const
Definition sllist.hh:623
│ │ │ │ -
MemberType item_
The element we hold.
Definition sllist.hh:212
│ │ │ │ -
SLListConstIterator(typename SLList< T, A >::Element *item)
Definition sllist.hh:380
│ │ │ │ -
typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
The allocator to use.
Definition sllist.hh:64
│ │ │ │ -
void insertAfter(const T &v) const
Insert an element in the underlying list after the current position.
Definition sllist.hh:342
│ │ │ │ -
SLListIterator< T, A > iterator
The mutable iterator of the list.
Definition sllist.hh:69
│ │ │ │ -
SLListConstIterator(const SLListModifyIterator< T, A > &other)
Definition sllist.hh:388
│ │ │ │ -
SLListIterator()
Definition sllist.hh:282
│ │ │ │ -
~Element()
Definition sllist.hh:562
│ │ │ │ -
bool operator==(const SLList &sl) const
Definition sllist.hh:611
│ │ │ │ -
void deleteNext() const
Delete the entry after the current position.
Definition sllist.hh:353
│ │ │ │ -
SLList(const SLList< T, A > &other)
Copy constructor.
Definition sllist.hh:577
│ │ │ │ -
bool equals(const SLListModifyIterator< T, A > &other) const
Equality test for the iterator facade.
Definition sllist.hh:324
│ │ │ │ -
T & dereference() const
Dereferencing function for the iterator facade.
Definition sllist.hh:446
│ │ │ │ -
int size() const
Get the number of elements the list contains.
Definition sllist.hh:756
│ │ │ │ -
const_iterator begin() const
Get an iterator pointing to the first element in the list.
Definition sllist.hh:768
│ │ │ │ -
iterator end()
Get an iterator pointing to the end of the list.
Definition sllist.hh:774
│ │ │ │ -
void clear()
Remove all elements from the list.
Definition sllist.hh:738
│ │ │ │ -
SLList(const SLList< T1, A1 > &other)
Copy constructor with type conversion.
Definition sllist.hh:585
│ │ │ │ -
T MemberType
The type we store.
Definition sllist.hh:59
│ │ │ │ -
bool equals(const SLListModifyIterator< T, A > &other) const
Test whether another iterator is equal.
Definition sllist.hh:478
│ │ │ │ -
ModifyIterator beginModify()
Get an iterator capable of deleting and inserting elements.
Definition sllist.hh:787
│ │ │ │ -
SLList< T, A > & operator=(const SLList< T, A > &other)
Assignment operator.
Definition sllist.hh:635
│ │ │ │ -
SLListConstIterator(const SLListIterator< T, A > &other)
Definition sllist.hh:384
│ │ │ │ -
SLListConstIterator< T, A > const_iterator
The constant iterator of the list.
Definition sllist.hh:74
│ │ │ │ -
bool empty() const
Check whether the list is empty.
Definition sllist.hh:750
│ │ │ │ -
SLListConstIterator()
Definition sllist.hh:376
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Equality test for the iterator facade.
Definition sllist.hh:304
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Test whether another iterator is equal.
Definition sllist.hh:456
│ │ │ │ -
SLListModifyIterator< T, A > ModifyIterator
The type of the iterator capable of deletion and insertion.
Definition sllist.hh:103
│ │ │ │ -
const_iterator end() const
Get an iterator pointing to the end of the list.
Definition sllist.hh:794
│ │ │ │ -
SLList()
Constructor.
Definition sllist.hh:568
│ │ │ │ -
void insert(const T &v)
Insert an element at the current position.
Definition sllist.hh:505
│ │ │ │ -
SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist)
Definition sllist.hh:277
│ │ │ │ -
SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T, A > _iterator)
Definition sllist.hh:433
│ │ │ │ -
void pop_front()
Remove the first item in the list.
Definition sllist.hh:732
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition sllist.hh:332
│ │ │ │ -
SLListIterator(const SLListModifyIterator< T, A > &other)
Definition sllist.hh:286
│ │ │ │ -
A::size_type size_type
The size type.
Definition sllist.hh:54
│ │ │ │ -
void remove()
Delete the entry at the current position.
Definition sllist.hh:518
│ │ │ │ -
const T & dereference() const
Dereferencing function for the facade.
Definition sllist.hh:396
│ │ │ │ -
Element * next_
The next element in the list.
Definition sllist.hh:208
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition sllist.hh:486
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition sllist.hh:414
│ │ │ │ -
~SLList()
Destructor.
Definition sllist.hh:605
│ │ │ │ -
bool equals(const SLListIterator< T, A > &other) const
Test whether another iterator is equal.
Definition sllist.hh:467
│ │ │ │ -
iterator begin()
Get an iterator pointing to the first element in the list.
Definition sllist.hh:762
│ │ │ │ -
bool equals(const SLListIterator< T, A > &other) const
Equality test for the iterator facade.
Definition sllist.hh:314
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ │ +
592 template<class K>
│ │ │ │ +
593 constexpr bool operator!= (const K a, const FieldVector<K,1>& b) noexcept
│ │ │ │ +
594 {
│ │ │ │ +
595 return a!=b[0];
│ │ │ │ +
596 }
│ │ │ │ +
597#endif
│ │ │ │ +
598
│ │ │ │ +
599 /* Overloads for common classification functions */
│ │ │ │ +
│ │ │ │ +
600 namespace MathOverloads {
│ │ │ │ +
601
│ │ │ │ +
603 template<class K, int SIZE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
605 {
│ │ │ │ +
606 bool out = true;
│ │ │ │ +
607 for (int i = 0; i < SIZE; ++i) {
│ │ │ │ +
608 out &= Dune::isFinite(b[i]);
│ │ │ │ +
609 }
│ │ │ │ +
610 return out;
│ │ │ │ +
611 }
│ │ │ │ +
│ │ │ │ +
612
│ │ │ │ +
614 template<class K, int SIZE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
616 {
│ │ │ │ +
617 bool out = false;
│ │ │ │ +
618 for (int i = 0; i < SIZE; ++i) {
│ │ │ │ +
619 out |= Dune::isInf(b[i]);
│ │ │ │ +
620 }
│ │ │ │ +
621 return out;
│ │ │ │ +
622 }
│ │ │ │ +
│ │ │ │ +
623
│ │ │ │ +
625 template<class K, int SIZE,
│ │ │ │ +
626 std::enable_if_t<HasNaN<K>::value, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
628 {
│ │ │ │ +
629 bool out = false;
│ │ │ │ +
630 for (int i = 0; i < SIZE; ++i) {
│ │ │ │ +
631 out |= Dune::isNaN(b[i]);
│ │ │ │ +
632 }
│ │ │ │ +
633 return out;
│ │ │ │ +
634 }
│ │ │ │ +
│ │ │ │ +
635
│ │ │ │ +
637 template<class K,
│ │ │ │ +
638 std::enable_if_t<HasNaN<K>::value, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
641 {
│ │ │ │ +
642 return Dune::isUnordered(b[0],c[0]);
│ │ │ │ +
643 }
│ │ │ │ +
│ │ │ │ +
644
│ │ │ │ +
645 } // end namespace MathOverloads
│ │ │ │ +
│ │ │ │ +
646
│ │ │ │ +
649} // end namespace Dune
│ │ │ │ +
650
│ │ │ │ +
651#endif // DUNE_COMMON_FVECTOR_HH
│ │ │ │ +
Implements the dense vector interface, with an exchangeable storage class.
│ │ │ │ +
Some useful basic math stuff.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ │ +
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
│ │ │ │ +
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:549
│ │ │ │ +
bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:556
│ │ │ │ +
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:542
│ │ │ │ +
bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:535
│ │ │ │ +
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:638
│ │ │ │ +
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:684
│ │ │ │ +
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:661
│ │ │ │ +
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:238
│ │ │ │ +
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:706
│ │ │ │ +
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:260
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
constexpr std::integer_sequence< T, II..., T(IN)> push_back(std::integer_sequence< T, II... >, std::integral_constant< T, IN >={})
Append an index IN to the back of the sequence.
Definition integersequence.hh:69
│ │ │ │ -
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:142
│ │ │ │ -
A mutable iterator for the SLList.
Definition sllist.hh:271
│ │ │ │ -
A constant iterator for the SLList.
Definition sllist.hh:371
│ │ │ │ -
A mutable iterator for the SLList.
Definition sllist.hh:429
│ │ │ │ -
A single linked list.
Definition sllist.hh:44
│ │ │ │ +
bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Returns whether any entry is NaN.
Definition fvector.hh:627
│ │ │ │ +
bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Returns whether any entry is infinite.
Definition fvector.hh:615
│ │ │ │ +
auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Returns whether all entries are finite.
Definition fvector.hh:604
│ │ │ │ +
bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
Returns true if either b or c is NaN.
Definition fvector.hh:639
│ │ │ │ +
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ +
constexpr FieldVector(const K &k) noexcept(std::is_nothrow_copy_assignable_v< K >)
Constructor making vector with identical coordinates.
Definition fvector.hh:113
│ │ │ │ +
const value_type & const_reference
The type used for const references to the vector entry.
Definition fvector.hh:105
│ │ │ │ +
constexpr FieldVector(const std::initializer_list< K > &l)
Construct from a std::initializer_list.
Definition fvector.hh:121
│ │ │ │ +
static constexpr size_type size() noexcept
Obtain the number of elements stored in the vector.
Definition fvector.hh:193
│ │ │ │ +
Base::size_type size_type
Definition fvector.hh:98
│ │ │ │ +
FieldVector & operator=(const DenseVector< T > &x)
Assignment from another dense vector.
Definition fvector.hh:163
│ │ │ │ +
static constexpr int dimension
The size of this vector.
Definition fvector.hh:96
│ │ │ │ +
constexpr FieldVector() noexcept
Default constructor, making value-initialized vector with all components set to zero.
Definition fvector.hh:108
│ │ │ │ +
friend constexpr auto operator/(const FieldVector &vector, Scalar scalar)
Vector space division by scalar.
Definition fvector.hh:250
│ │ │ │ +
friend constexpr auto operator*(const FieldVector &vector, Scalar scalar)
Vector space multiplication with scalar.
Definition fvector.hh:224
│ │ │ │ +
value_type & reference
The type used for references to the vector entry.
Definition fvector.hh:102
│ │ │ │ +
Base::value_type value_type
Definition fvector.hh:99
│ │ │ │ +
constexpr FieldVector(const FieldVector< T, SIZE > &x) noexcept(std::is_nothrow_assignable_v< K &, const T & >)
Converting constructor from FieldVector with different element type.
Definition fvector.hh:143
│ │ │ │ +
constexpr const K * data() const noexcept
Return pointer to underlying array.
Definition fvector.hh:216
│ │ │ │ +
FieldVector(const FieldVector &)=default
Copy constructor with default behavior.
│ │ │ │ +
reference operator[](size_type i)
Return a reference to the ith element.
Definition fvector.hh:196
│ │ │ │ +
constexpr K * data() noexcept
Return pointer to underlying array.
Definition fvector.hh:210
│ │ │ │ +
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
│ │ │ │ +
size_type size() const
size method
Definition densevector.hh:336
│ │ │ │ +
Traits::size_type size_type
The type used for the index access and size operation.
Definition densevector.hh:259
│ │ │ │ +
Definition ftraits.hh:26
│ │ │ │ +
T field_type
export the type representing the field
Definition ftraits.hh:28
│ │ │ │ +
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ │ + │ │ │ │ +
std::array< K, SIZE > container_type
Definition fvector.hh:40
│ │ │ │ +
container_type::size_type size_type
Definition fvector.hh:42
│ │ │ │ +
FieldVector< K, SIZE > derived_type
Definition fvector.hh:39
│ │ │ │ +
FieldTraits< K >::real_type real_type
Definition fvector.hh:49
│ │ │ │ +
FieldTraits< K >::field_type field_type
Definition fvector.hh:48
│ │ │ │ +
TMP to check the size of a DenseVectors statically, if possible.
Definition fvector.hh:62
│ │ │ │ +
static constexpr bool value
True if C is not of type FieldVector or its dimension is not equal SIZE.
Definition fvector.hh:67
│ │ │ │ +
Tag to make sure the functions in this namespace can be found by ADL.
Definition math.hh:230
│ │ │ │ +
Definition matvectraits.hh:31
│ │ │ │ +
decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
Definition promotiontraits.hh:28
│ │ │ │ +
Helper class for tagging priorities.
Definition typeutilities.hh:73
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,808 +1,791 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -sllist.hh │ │ │ │ │ +fvector.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_SLLIST_HH │ │ │ │ │ -6#define DUNE_SLLIST_HH │ │ │ │ │ +5#ifndef DUNE_COMMON_FVECTOR_HH │ │ │ │ │ +6#define DUNE_COMMON_FVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include "_i_t_e_r_a_t_o_r_f_a_c_a_d_e_s_._h_h" │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13namespace _D_u_n_e │ │ │ │ │ -14{ │ │ │ │ │ -26 template │ │ │ │ │ -27 class SLListIterator; │ │ │ │ │ -28 │ │ │ │ │ -29 template │ │ │ │ │ -30 class SLListConstIterator; │ │ │ │ │ -31 │ │ │ │ │ -32 template │ │ │ │ │ -33 class SLListModifyIterator; │ │ │ │ │ -34 │ │ │ │ │ -42 template > │ │ │ │ │ -_4_3 class _S_L_L_i_s_t │ │ │ │ │ -44 { │ │ │ │ │ -45 struct Element; │ │ │ │ │ -46 friend class _S_L_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -47 friend class _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -48 │ │ │ │ │ -49 public: │ │ │ │ │ -50 │ │ │ │ │ -_5_4 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -55 │ │ │ │ │ -_5_9 typedef T _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -60 │ │ │ │ │ -_6_4 using _A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc; │ │ │ │ │ -65 │ │ │ │ │ -_6_9 typedef _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _i_t_e_r_a_t_o_r; │ │ │ │ │ -70 │ │ │ │ │ -_7_4 typedef _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#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> │ │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_d_e_n_s_e_v_e_c_t_o_r_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_t_r_a_i_t_s_._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_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#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> │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25 │ │ │ │ │ +35 template< class K, int SIZE > class FieldVector; │ │ │ │ │ +36 template< class K, int SIZE > │ │ │ │ │ +_3_7 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s< _F_i_e_l_d_V_e_c_t_o_r > │ │ │ │ │ +38 { │ │ │ │ │ +_3_9 typedef _F_i_e_l_d_V_e_c_t_o_r_<_K_,_S_I_Z_E_> _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ │ +_4_0 typedef std::array _c_o_n_t_a_i_n_e_r___t_y_p_e; │ │ │ │ │ +_4_1 typedef K _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_4_2 typedef typename container_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +43 }; │ │ │ │ │ +44 │ │ │ │ │ +45 template< class K, int SIZE > │ │ │ │ │ +_4_6 struct _F_i_e_l_d_T_r_a_i_t_s< _F_i_e_l_d_V_e_c_t_o_r > │ │ │ │ │ +47 { │ │ │ │ │ +_4_8 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_9 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; │ │ │ │ │ +50 }; │ │ │ │ │ +51 │ │ │ │ │ +60 template │ │ │ │ │ +_6_1 struct _I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t │ │ │ │ │ +62 { │ │ │ │ │ +_6_7 constexpr static bool _v_a_l_u_e = true; │ │ │ │ │ +68 }; │ │ │ │ │ +69 │ │ │ │ │ +70 template │ │ │ │ │ +_7_1 struct _I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t<_F_i_e_l_d_V_e_c_t_o_r,SIZE> │ │ │ │ │ +72 { │ │ │ │ │ +_7_3 constexpr static bool _v_a_l_u_e = true; │ │ │ │ │ +74 }; │ │ │ │ │ 75 │ │ │ │ │ -_7_9 _S_L_L_i_s_t(); │ │ │ │ │ -80 │ │ │ │ │ -84 template │ │ │ │ │ -_8_5 _S_L_L_i_s_t(const _S_L_L_i_s_t_<_T_1_,_A_1_>& other); │ │ │ │ │ -86 │ │ │ │ │ -_9_0 _S_L_L_i_s_t(const _S_L_L_i_s_t_<_T_,_A_>& other); │ │ │ │ │ -91 │ │ │ │ │ -_9_7 _~_S_L_L_i_s_t(); │ │ │ │ │ -98 │ │ │ │ │ -_1_0_3 typedef _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_> _M_o_d_i_f_y_I_t_e_r_a_t_o_r; │ │ │ │ │ -104 │ │ │ │ │ -_1_0_8 _S_L_L_i_s_t_<_T_,_A_>& _o_p_e_r_a_t_o_r_=(const _S_L_L_i_s_t_<_T_,_A_>& other); │ │ │ │ │ -109 │ │ │ │ │ -110 │ │ │ │ │ -_1_1_5 inline void _p_u_s_h___b_a_c_k(const _M_e_m_b_e_r_T_y_p_e& item); │ │ │ │ │ -116 │ │ │ │ │ -_1_2_1 inline void _p_u_s_h___f_r_o_n_t(const _M_e_m_b_e_r_T_y_p_e& item); │ │ │ │ │ -122 │ │ │ │ │ -_1_2_6 inline void _p_o_p___f_r_o_n_t(); │ │ │ │ │ -127 │ │ │ │ │ -_1_2_9 inline void _c_l_e_a_r(); │ │ │ │ │ -130 │ │ │ │ │ -_1_3_8 inline _i_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ +76 template │ │ │ │ │ +_7_7 struct _I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t<_F_i_e_l_d_V_e_c_t_o_r,SIZE> │ │ │ │ │ +78 { │ │ │ │ │ +_7_9 constexpr static bool _v_a_l_u_e = false; │ │ │ │ │ +80 }; │ │ │ │ │ +81 │ │ │ │ │ +82 │ │ │ │ │ +88 template< class K, int SIZE > │ │ │ │ │ +_8_9 class _F_i_e_l_d_V_e_c_t_o_r : │ │ │ │ │ +90 public _D_e_n_s_e_V_e_c_t_o_r< FieldVector > │ │ │ │ │ +91 { │ │ │ │ │ +92 std::array _data; │ │ │ │ │ +93 typedef _D_e_n_s_e_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_K_,_S_I_Z_E_> > _B_a_s_e; │ │ │ │ │ +94 public: │ │ │ │ │ +_9_6 constexpr static int _d_i_m_e_n_s_i_o_n = SIZE; │ │ │ │ │ +97 │ │ │ │ │ +_9_8 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +_9_9 typedef typename _B_a_s_e_:_:_v_a_l_u_e___t_y_p_e _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +100 │ │ │ │ │ +_1_0_2 typedef _v_a_l_u_e___t_y_p_e& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +103 │ │ │ │ │ +_1_0_5 typedef const _v_a_l_u_e___t_y_p_e& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +106 │ │ │ │ │ +_1_0_8 constexpr _F_i_e_l_d_V_e_c_t_o_r () noexcept │ │ │ │ │ +109 : _data{} │ │ │ │ │ +110 {} │ │ │ │ │ +111 │ │ │ │ │ +_1_1_3 explicit constexpr _F_i_e_l_d_V_e_c_t_o_r (const K& k) │ │ │ │ │ +114 noexcept(std::is_nothrow_copy_assignable_v) │ │ │ │ │ +115 { │ │ │ │ │ +116 for (auto& d : _data) │ │ │ │ │ +117 d = k; │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +_1_2_1 constexpr _F_i_e_l_d_V_e_c_t_o_r (const std::initializer_list& l) │ │ │ │ │ +122 : _data{} │ │ │ │ │ +123 { │ │ │ │ │ +124 assert(l.size() == _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +125 for (int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +126 _data[i] = std::data(l)[i]; │ │ │ │ │ +127 } │ │ │ │ │ +128 │ │ │ │ │ +130 template::value, int> = 0, │ │ │ │ │ +132 decltype(std::declval() = std::declval()[0], bool{}) = true> │ │ │ │ │ +_1_3_3 _F_i_e_l_d_V_e_c_t_o_r (const _D_e_n_s_e_V_e_c_t_o_r_<_T_>& x) │ │ │ │ │ +134 { │ │ │ │ │ +135 assert(x._s_i_z_e() == _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +136 for (int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +137 _data[i] = x[i]; │ │ │ │ │ +138 } │ │ │ │ │ 139 │ │ │ │ │ -_1_4_7 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -148 │ │ │ │ │ -_1_5_6 inline _M_o_d_i_f_y_I_t_e_r_a_t_o_r _b_e_g_i_n_M_o_d_i_f_y(); │ │ │ │ │ +141 template, int> = 0> │ │ │ │ │ +_1_4_3 explicit constexpr _F_i_e_l_d_V_e_c_t_o_r (const _F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _S_I_Z_E_>& x) │ │ │ │ │ +144 noexcept(std::is_nothrow_assignable_v) │ │ │ │ │ +145 { │ │ │ │ │ +146 for (int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +147 _data[i] = x[i]; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +151 template = 0> │ │ │ │ │ +_1_5_3 explicit _F_i_e_l_d_V_e_c_t_o_r (const _F_i_e_l_d_V_e_c_t_o_r_<_K_1_,_ _S_I_Z_E_1_>&) = delete; │ │ │ │ │ +154 │ │ │ │ │ +_1_5_6 _F_i_e_l_d_V_e_c_t_o_r (const _F_i_e_l_d_V_e_c_t_o_r&) = default; │ │ │ │ │ 157 │ │ │ │ │ -_1_6_5 inline _M_o_d_i_f_y_I_t_e_r_a_t_o_r _e_n_d_M_o_d_i_f_y(); │ │ │ │ │ -166 │ │ │ │ │ -_1_7_3 inline _i_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ -174 │ │ │ │ │ -_1_8_1 inline _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -182 │ │ │ │ │ -_1_8_8 inline bool _e_m_p_t_y() const; │ │ │ │ │ +158 │ │ │ │ │ +160 template::value, int> = 0, │ │ │ │ │ +162 decltype(std::declval() = std::declval()[0], bool{}) = true> │ │ │ │ │ +_1_6_3 _F_i_e_l_d_V_e_c_t_o_r& operator= (const _D_e_n_s_e_V_e_c_t_o_r_<_T_>& x) │ │ │ │ │ +164 { │ │ │ │ │ +165 assert(x._s_i_z_e() == _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +166 for (int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +167 _data[i] = x[i]; │ │ │ │ │ +168 return *this; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +172 template, int> = 0> │ │ │ │ │ +_1_7_4 _F_i_e_l_d_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _F_i_e_l_d_V_e_c_t_o_r_<_T_,_ _S_I_Z_E_>& x) │ │ │ │ │ +175 noexcept(std::is_nothrow_assignable_v) │ │ │ │ │ +176 { │ │ │ │ │ +177 for (int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +178 _data[i] = x[i]; │ │ │ │ │ +179 return *this; │ │ │ │ │ +180 } │ │ │ │ │ +181 │ │ │ │ │ +183 template = 0> │ │ │ │ │ +_1_8_5 _F_i_e_l_d_V_e_c_t_o_r& operator= (const _F_i_e_l_d_V_e_c_t_o_r_<_K_1_,_ _S_I_Z_E_1_>&) = delete; │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 constexpr _F_i_e_l_d_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _F_i_e_l_d_V_e_c_t_o_r&) = default; │ │ │ │ │ 189 │ │ │ │ │ -_1_9_4 inline int _s_i_z_e() const; │ │ │ │ │ -195 │ │ │ │ │ -_1_9_6 bool _o_p_e_r_a_t_o_r_=_=(const _S_L_L_i_s_t& sl) const; │ │ │ │ │ -197 │ │ │ │ │ -198 │ │ │ │ │ -_1_9_9 bool _o_p_e_r_a_t_o_r_!_=(const _S_L_L_i_s_t& sl) const; │ │ │ │ │ -200 │ │ │ │ │ -201 private: │ │ │ │ │ -203 struct Element │ │ │ │ │ +190 using Base::operator=; │ │ │ │ │ +191 │ │ │ │ │ +_1_9_3 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e () noexcept { return _d_i_m_e_n_s_i_o_n; } │ │ │ │ │ +194 │ │ │ │ │ +_1_9_6 _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) │ │ │ │ │ +197 { │ │ │ │ │ +198 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +199 return _data[i]; │ │ │ │ │ +200 } │ │ │ │ │ +201 │ │ │ │ │ +_2_0_3 _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 │ │ │ │ │ 204 { │ │ │ │ │ -_2_0_8 _E_l_e_m_e_n_t* _n_e_x_t__; │ │ │ │ │ -_2_1_2 _M_e_m_b_e_r_T_y_p_e _i_t_e_m__; │ │ │ │ │ -213 │ │ │ │ │ -_2_1_4 _E_l_e_m_e_n_t(const _M_e_m_b_e_r_T_y_p_e& item, _E_l_e_m_e_n_t* _n_e_x_t__=0); │ │ │ │ │ -215 │ │ │ │ │ -_2_1_6 _E_l_e_m_e_n_t(); │ │ │ │ │ -217 │ │ │ │ │ -_2_1_8 _~_E_l_e_m_e_n_t(); │ │ │ │ │ -219 }; │ │ │ │ │ +205 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i < _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +206 return _data[i]; │ │ │ │ │ +207 } │ │ │ │ │ +208 │ │ │ │ │ +_2_1_0 constexpr K* _d_a_t_a () noexcept │ │ │ │ │ +211 { │ │ │ │ │ +212 return _data.data(); │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +_2_1_6 constexpr const K* _d_a_t_a () const noexcept │ │ │ │ │ +217 { │ │ │ │ │ +218 return _data.data(); │ │ │ │ │ +219 } │ │ │ │ │ 220 │ │ │ │ │ -225 void deleteNext(Element* current); │ │ │ │ │ -226 │ │ │ │ │ -231 void copyElements(const _S_L_L_i_s_t_<_T_,_A_>& other); │ │ │ │ │ -232 │ │ │ │ │ -240 template │ │ │ │ │ -241 void deleteNext(Element* current); │ │ │ │ │ -247 void insertAfter(Element* current, const T& item); │ │ │ │ │ -248 │ │ │ │ │ -250 Element beforeHead_; │ │ │ │ │ -251 │ │ │ │ │ -257 Element* tail_; │ │ │ │ │ -258 │ │ │ │ │ -260 _A_l_l_o_c_a_t_o_r allocator_; │ │ │ │ │ -261 │ │ │ │ │ -263 int size_; │ │ │ │ │ -264 }; │ │ │ │ │ -265 │ │ │ │ │ -269 template │ │ │ │ │ -_2_7_0 class _S_L_L_i_s_t_I_t_e_r_a_t_o_r : public _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, T&, std::size_t> │ │ │ │ │ -271 { │ │ │ │ │ -272 friend class _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -273 friend class _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r; │ │ │ │ │ -274 friend class _S_L_L_i_s_t; │ │ │ │ │ -275 │ │ │ │ │ -276 public: │ │ │ │ │ -_2_7_7 inline _S_L_L_i_s_t_I_t_e_r_a_t_o_r(typename _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t* item, │ │ │ │ │ -278 _S_L_L_i_s_t_<_T_,_A_>* sllist) │ │ │ │ │ -279 : current_(item), list_(sllist) │ │ │ │ │ -280 {} │ │ │ │ │ -281 │ │ │ │ │ -_2_8_2 inline _S_L_L_i_s_t_I_t_e_r_a_t_o_r() │ │ │ │ │ -283 : current_(0), list_(0) │ │ │ │ │ -284 {} │ │ │ │ │ -285 │ │ │ │ │ -_2_8_6 inline _S_L_L_i_s_t_I_t_e_r_a_t_o_r(const _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>& other) │ │ │ │ │ -287 : current_(other.iterator_.current_), list_(other.iterator_.list_) │ │ │ │ │ -288 {} │ │ │ │ │ -289 │ │ │ │ │ -_2_9_4 inline T& _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -295 { │ │ │ │ │ -296 return current_->item_; │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -_3_0_4 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -305 { │ │ │ │ │ -306 return current_==other.current_; │ │ │ │ │ -307 } │ │ │ │ │ +222 template::value, int> = 0> │ │ │ │ │ +_2_2_4 friend constexpr auto _o_p_e_r_a_t_o_r_*_ (const _F_i_e_l_d_V_e_c_t_o_r& vector, Scalar scalar) │ │ │ │ │ +225 { │ │ │ │ │ +226 using T = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ +227 _F_i_e_l_d_V_e_c_t_o_r_<_T_,_S_I_Z_E_> result; │ │ │ │ │ +228 │ │ │ │ │ +229 for (_s_i_z_e___t_y_p_e i = 0; i < vector._s_i_z_e(); ++i) │ │ │ │ │ +230 result[i] = vector[i] * scalar; │ │ │ │ │ +231 return result; │ │ │ │ │ +232 } │ │ │ │ │ +233 │ │ │ │ │ +235 template::value, int> = 0> │ │ │ │ │ +_2_3_7 friend constexpr auto _o_p_e_r_a_t_o_r_*_ (Scalar scalar, const _F_i_e_l_d_V_e_c_t_o_r& vector) │ │ │ │ │ +238 { │ │ │ │ │ +239 using T = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ +240 _F_i_e_l_d_V_e_c_t_o_r_<_T_,_S_I_Z_E_> result; │ │ │ │ │ +241 │ │ │ │ │ +242 for (_s_i_z_e___t_y_p_e i = 0; i < vector._s_i_z_e(); ++i) │ │ │ │ │ +243 result[i] = scalar * vector[i]; │ │ │ │ │ +244 return result; │ │ │ │ │ +245 } │ │ │ │ │ +246 │ │ │ │ │ +248 template::value, int> = 0> │ │ │ │ │ +_2_5_0 friend constexpr auto _o_p_e_r_a_t_o_r_/_ (const _F_i_e_l_d_V_e_c_t_o_r& vector, Scalar scalar) │ │ │ │ │ +251 { │ │ │ │ │ +252 using T = typename _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_,_S_c_a_l_a_r_>_:_:_P_r_o_m_o_t_e_d_T_y_p_e; │ │ │ │ │ +253 _F_i_e_l_d_V_e_c_t_o_r_<_T_,_S_I_Z_E_> result; │ │ │ │ │ +254 │ │ │ │ │ +255 for (_s_i_z_e___t_y_p_e i = 0; i < vector._s_i_z_e(); ++i) │ │ │ │ │ +256 result[i] = vector[i] / scalar; │ │ │ │ │ +257 │ │ │ │ │ +258 return result; │ │ │ │ │ +259 } │ │ │ │ │ +260 │ │ │ │ │ +261 }; │ │ │ │ │ +262 │ │ │ │ │ +274 template │ │ │ │ │ +_2_7_5 std::istream &_o_p_e_r_a_t_o_r_>_>_ (std::istream& in, _F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _S_I_Z_E_>& v) │ │ │ │ │ +276 { │ │ │ │ │ +277 _F_i_e_l_d_V_e_c_t_o_r_<_K_,_ _S_I_Z_E_> w; │ │ │ │ │ +278 for (int i = 0; i < SIZE; ++i) │ │ │ │ │ +279 in >> w[i]; │ │ │ │ │ +280 if (in) │ │ │ │ │ +281 v = w; │ │ │ │ │ +282 return in; │ │ │ │ │ +283 } │ │ │ │ │ +284 │ │ │ │ │ +285#ifndef DOXYGEN │ │ │ │ │ +286 template< class K > │ │ │ │ │ +287 struct _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s< _F_i_e_l_d_V_e_c_t_o_r > │ │ │ │ │ +288 { │ │ │ │ │ +289 typedef _F_i_e_l_d_V_e_c_t_o_r_<_K_,_1_> derived_type; │ │ │ │ │ +290 typedef K container_type; │ │ │ │ │ +291 typedef K value_type; │ │ │ │ │ +292 typedef size_t size_type; │ │ │ │ │ +293 }; │ │ │ │ │ +294 │ │ │ │ │ +297 template │ │ │ │ │ +298 class FieldVector : │ │ │ │ │ +299 public DenseVector< FieldVector > │ │ │ │ │ +300 { │ │ │ │ │ +301 K _data; │ │ │ │ │ +302 typedef DenseVector< FieldVector > Base; │ │ │ │ │ +303 public: │ │ │ │ │ +305 constexpr static int _d_i_m_e_n_s_i_o_n = 1; │ │ │ │ │ +306 │ │ │ │ │ +307 typedef typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ 308 │ │ │ │ │ -_3_1_4 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -315 { │ │ │ │ │ -316 return current_==other.current_; │ │ │ │ │ -317 } │ │ │ │ │ -318 │ │ │ │ │ -_3_2_4 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -325 { │ │ │ │ │ -326 return current_==other.iterator_.current_; │ │ │ │ │ -327 } │ │ │ │ │ +310 typedef K& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +311 │ │ │ │ │ +313 typedef const K& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +314 │ │ │ │ │ +315 //===== construction │ │ │ │ │ +316 │ │ │ │ │ +318 constexpr _F_i_e_l_d_V_e_c_t_o_r () noexcept │ │ │ │ │ +319 : _data() │ │ │ │ │ +320 {} │ │ │ │ │ +321 │ │ │ │ │ +323 template, int> = 0> │ │ │ │ │ +325 constexpr _F_i_e_l_d_V_e_c_t_o_r (const T& k) noexcept │ │ │ │ │ +326 : _data(k) │ │ │ │ │ +327 {} │ │ │ │ │ 328 │ │ │ │ │ -_3_3_2 inline void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -333 { │ │ │ │ │ -334 current_ = current_->next_; │ │ │ │ │ -335 } │ │ │ │ │ -336 │ │ │ │ │ -_3_4_2 inline void _i_n_s_e_r_t_A_f_t_e_r(const T& v) const │ │ │ │ │ -343 { │ │ │ │ │ -344 assert(list_ ); │ │ │ │ │ -345 list_->insertAfter(current_, v); │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -_3_5_3 inline void _d_e_l_e_t_e_N_e_x_t() const │ │ │ │ │ -354 { │ │ │ │ │ -355 assert(list_); │ │ │ │ │ -356 list_->deleteNext(current_); │ │ │ │ │ -357 } │ │ │ │ │ +330 constexpr _F_i_e_l_d_V_e_c_t_o_r (const std::initializer_list& l) │ │ │ │ │ +331 { │ │ │ │ │ +332 assert(l.size() == 1); │ │ │ │ │ +333 _data = *l.begin(); │ │ │ │ │ +334 } │ │ │ │ │ +335 │ │ │ │ │ +337 template, int> = 0> │ │ │ │ │ +339 constexpr _F_i_e_l_d_V_e_c_t_o_r (const FieldVector& x) noexcept │ │ │ │ │ +340 : _data(x[0]) │ │ │ │ │ +341 {} │ │ │ │ │ +342 │ │ │ │ │ +344 template::value, int> = 0, │ │ │ │ │ +346 decltype(std::declval() = std::declval()[0], bool{}) = true> │ │ │ │ │ +347 _F_i_e_l_d_V_e_c_t_o_r (const DenseVector& x) │ │ │ │ │ +348 { │ │ │ │ │ +349 assert(x.size() == 1); │ │ │ │ │ +350 _data = x[0]; │ │ │ │ │ +351 } │ │ │ │ │ +352 │ │ │ │ │ +354 constexpr _F_i_e_l_d_V_e_c_t_o_r (const _F_i_e_l_d_V_e_c_t_o_r&) = default; │ │ │ │ │ +355 │ │ │ │ │ +357 constexpr _F_i_e_l_d_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _F_i_e_l_d_V_e_c_t_o_r&) = default; │ │ │ │ │ 358 │ │ │ │ │ -359 private: │ │ │ │ │ -361 typename _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t* current_; │ │ │ │ │ -_3_6_3 _S_L_L_i_s_t_<_T_,_A_>* list_; │ │ │ │ │ -364 }; │ │ │ │ │ -365 │ │ │ │ │ -369 template │ │ │ │ │ -_3_7_0 class _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r : public _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, const T, const T&, std::size_t> │ │ │ │ │ -371 { │ │ │ │ │ -372 friend class _S_L_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -373 friend class _S_L_L_i_s_t; │ │ │ │ │ -374 │ │ │ │ │ -375 public: │ │ │ │ │ -_3_7_6 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r() │ │ │ │ │ -377 : current_(0) │ │ │ │ │ -378 {} │ │ │ │ │ -379 │ │ │ │ │ -_3_8_0 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r(typename _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t* item) │ │ │ │ │ -381 : current_(item) │ │ │ │ │ -382 {} │ │ │ │ │ -383 │ │ │ │ │ -_3_8_4 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r(const _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) │ │ │ │ │ -385 : current_(other.current_) │ │ │ │ │ -386 {} │ │ │ │ │ +360 template() = std::declval(), bool{}) = true> │ │ │ │ │ +362 constexpr _F_i_e_l_d_V_e_c_t_o_r& operator= (const FieldVector& other) noexcept │ │ │ │ │ +363 { │ │ │ │ │ +364 _data = other[0]; │ │ │ │ │ +365 return *this; │ │ │ │ │ +366 } │ │ │ │ │ +367 │ │ │ │ │ +369 template::value, int> = 0, │ │ │ │ │ +371 decltype(std::declval() = std::declval()[0], bool{}) = true> │ │ │ │ │ +372 _F_i_e_l_d_V_e_c_t_o_r& operator= (const DenseVector& other) │ │ │ │ │ +373 { │ │ │ │ │ +374 assert(other.size() == 1); │ │ │ │ │ +375 _data = other[0]; │ │ │ │ │ +376 return *this; │ │ │ │ │ +377 } │ │ │ │ │ +378 │ │ │ │ │ +380 template() = std::declval(), bool{}) = true> │ │ │ │ │ +382 constexpr _F_i_e_l_d_V_e_c_t_o_r& operator= (const T& k) noexcept │ │ │ │ │ +383 { │ │ │ │ │ +384 _data = k; │ │ │ │ │ +385 return *this; │ │ │ │ │ +386 } │ │ │ │ │ 387 │ │ │ │ │ -_3_8_8 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r(const _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>& other) │ │ │ │ │ -389 : current_(other.iterator_.current_) │ │ │ │ │ -390 {} │ │ │ │ │ -391 │ │ │ │ │ -_3_9_6 inline const T& _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ +388 //===== forward methods to container │ │ │ │ │ +389 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e () noexcept { return 1; } │ │ │ │ │ +390 │ │ │ │ │ +391 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] _s_i_z_e___t_y_p_e i) │ │ │ │ │ +392 { │ │ │ │ │ +393 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i == 0); │ │ │ │ │ +394 return _data; │ │ │ │ │ +395 } │ │ │ │ │ +396 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] _s_i_z_e___t_y_p_e i) const │ │ │ │ │ 397 { │ │ │ │ │ -398 return current_->item_; │ │ │ │ │ -399 } │ │ │ │ │ -400 │ │ │ │ │ -_4_0_6 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -407 { │ │ │ │ │ -408 return current_==other.current_; │ │ │ │ │ -409 } │ │ │ │ │ -410 │ │ │ │ │ -_4_1_4 inline void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -415 { │ │ │ │ │ -416 current_ = current_->next_; │ │ │ │ │ -417 } │ │ │ │ │ +398 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(i == 0); │ │ │ │ │ +399 return _data; │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +403 constexpr K* _d_a_t_a () noexcept │ │ │ │ │ +404 { │ │ │ │ │ +405 return &_data; │ │ │ │ │ +406 } │ │ │ │ │ +407 │ │ │ │ │ +409 constexpr const K* _d_a_t_a () const noexcept │ │ │ │ │ +410 { │ │ │ │ │ +411 return &_data; │ │ │ │ │ +412 } │ │ │ │ │ +413 │ │ │ │ │ +414 //===== conversion operator │ │ │ │ │ +415 │ │ │ │ │ +417 constexpr operator _r_e_f_e_r_e_n_c_e () noexcept { return _data; } │ │ │ │ │ 418 │ │ │ │ │ -419 private: │ │ │ │ │ -_4_2_1 typename _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t* current_; │ │ │ │ │ -422 }; │ │ │ │ │ -423 │ │ │ │ │ -427 template │ │ │ │ │ -_4_2_8 class _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r : public _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, T&, std::size_t> │ │ │ │ │ +420 constexpr operator _c_o_n_s_t___r_e_f_e_r_e_n_c_e () const noexcept { return _data; } │ │ │ │ │ +421 }; │ │ │ │ │ +422 │ │ │ │ │ +423 /* ----- FV / FV ----- */ │ │ │ │ │ +424 /* mostly not necessary as these operations are already covered via the │ │ │ │ │ +cast operator */ │ │ │ │ │ +425 │ │ │ │ │ +427 template │ │ │ │ │ +428 constexpr bool _o_p_e_r_a_t_o_r_>_ (const FieldVector& a, const │ │ │ │ │ +FieldVector& b) noexcept │ │ │ │ │ 429 { │ │ │ │ │ -430 friend class _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -431 friend class _S_L_L_i_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -432 public: │ │ │ │ │ -_4_3_3 inline _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r(_S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> beforeIterator, │ │ │ │ │ -434 _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _iterator) │ │ │ │ │ -435 : beforeIterator_(beforeIterator), iterator_(_iterator) │ │ │ │ │ -436 {} │ │ │ │ │ -437 │ │ │ │ │ -_4_3_8 inline _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r() │ │ │ │ │ -439 : beforeIterator_(), iterator_() │ │ │ │ │ -440 {} │ │ │ │ │ -441 │ │ │ │ │ -_4_4_6 inline T& _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -447 { │ │ │ │ │ -448 return *iterator_; │ │ │ │ │ -449 } │ │ │ │ │ -450 │ │ │ │ │ -_4_5_6 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -457 { │ │ │ │ │ -458 return iterator_== other; │ │ │ │ │ -459 } │ │ │ │ │ -460 │ │ │ │ │ -461 │ │ │ │ │ -_4_6_7 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -468 { │ │ │ │ │ -469 return iterator_== other; │ │ │ │ │ -470 } │ │ │ │ │ -471 │ │ │ │ │ -472 │ │ │ │ │ -_4_7_8 inline bool _e_q_u_a_l_s(const _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>& other) const │ │ │ │ │ -479 { │ │ │ │ │ -480 return iterator_== other.iterator_; │ │ │ │ │ -481 } │ │ │ │ │ -482 │ │ │ │ │ -_4_8_6 inline void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +430 return a[0]>b[0]; │ │ │ │ │ +431 } │ │ │ │ │ +432 │ │ │ │ │ +434 template │ │ │ │ │ +435 constexpr bool _o_p_e_r_a_t_o_r_>_=_ (const FieldVector& a, const │ │ │ │ │ +FieldVector& b) noexcept │ │ │ │ │ +436 { │ │ │ │ │ +437 return a[0]>=b[0]; │ │ │ │ │ +438 } │ │ │ │ │ +439 │ │ │ │ │ +441 template │ │ │ │ │ +442 constexpr bool _o_p_e_r_a_t_o_r_<_ (const FieldVector& a, const │ │ │ │ │ +FieldVector& b) noexcept │ │ │ │ │ +443 { │ │ │ │ │ +444 return a[0] │ │ │ │ │ +449 constexpr bool _o_p_e_r_a_t_o_r_<_=_ (const FieldVector& a, const │ │ │ │ │ +FieldVector& b) noexcept │ │ │ │ │ +450 { │ │ │ │ │ +451 return a[0]<=b[0]; │ │ │ │ │ +452 } │ │ │ │ │ +453 │ │ │ │ │ +454 /* ----- FV / scalar ----- */ │ │ │ │ │ +455 │ │ │ │ │ +457 template │ │ │ │ │ +458 constexpr FieldVector _o_p_e_r_a_t_o_r_+_ (const FieldVector& a, const K b) │ │ │ │ │ +noexcept │ │ │ │ │ +459 { │ │ │ │ │ +460 return a[0]+b; │ │ │ │ │ +461 } │ │ │ │ │ +462 │ │ │ │ │ +464 template │ │ │ │ │ +465 constexpr FieldVector _o_p_e_r_a_t_o_r_-_ (const FieldVector& a, const K b) │ │ │ │ │ +noexcept │ │ │ │ │ +466 { │ │ │ │ │ +467 return a[0]-b; │ │ │ │ │ +468 } │ │ │ │ │ +469 │ │ │ │ │ +471 template │ │ │ │ │ +472 constexpr FieldVector _o_p_e_r_a_t_o_r_*_ (const FieldVector& a, const K b) │ │ │ │ │ +noexcept │ │ │ │ │ +473 { │ │ │ │ │ +474 return a[0]*b; │ │ │ │ │ +475 } │ │ │ │ │ +476 │ │ │ │ │ +478 template │ │ │ │ │ +479 constexpr FieldVector _o_p_e_r_a_t_o_r_/_ (const FieldVector& a, const K b) │ │ │ │ │ +noexcept │ │ │ │ │ +480 { │ │ │ │ │ +481 return a[0]/b; │ │ │ │ │ +482 } │ │ │ │ │ +483 │ │ │ │ │ +485 template │ │ │ │ │ +486 constexpr bool _o_p_e_r_a_t_o_r_>_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ 487 { │ │ │ │ │ -488 ++iterator_; │ │ │ │ │ -489 ++beforeIterator_; │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -_5_0_5 inline void _i_n_s_e_r_t(const T& v) │ │ │ │ │ -506 { │ │ │ │ │ -507 beforeIterator_.insertAfter(v); │ │ │ │ │ -508 ++beforeIterator_; │ │ │ │ │ -509 } │ │ │ │ │ -510 │ │ │ │ │ -_5_1_8 inline void _r_e_m_o_v_e() │ │ │ │ │ -519 { │ │ │ │ │ -520 ++iterator_; │ │ │ │ │ -521 beforeIterator_.deleteNext(); │ │ │ │ │ -522 } │ │ │ │ │ -523 │ │ │ │ │ -524 private: │ │ │ │ │ -526 _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> beforeIterator_; │ │ │ │ │ -528 _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> iterator_; │ │ │ │ │ -529 }; │ │ │ │ │ -530 │ │ │ │ │ -531 template │ │ │ │ │ -_5_3_2 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _S_L_L_i_s_t_<_T_,_A_>& sllist) │ │ │ │ │ -533 { │ │ │ │ │ -534 typedef typename _S_L_L_i_s_t_<_T_,_A_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -535 Iterator end = sllist._e_n_d(); │ │ │ │ │ -536 Iterator current= sllist._b_e_g_i_n(); │ │ │ │ │ -537 │ │ │ │ │ -538 os << "{ "; │ │ │ │ │ -539 │ │ │ │ │ -540 if(current!=end) { │ │ │ │ │ -541 os<<*current<<" ("<(&(*current))<<")"; │ │ │ │ │ -542 ++current; │ │ │ │ │ -543 │ │ │ │ │ -544 for(; current != end; ++current) │ │ │ │ │ -545 os<<", "<<*current<<" ("<(&(*current))<<")"; │ │ │ │ │ -546 } │ │ │ │ │ -547 os<<"} "; │ │ │ │ │ -548 return os; │ │ │ │ │ -549 } │ │ │ │ │ -550 │ │ │ │ │ -551 template │ │ │ │ │ -_5_5_2 _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t_:_:_E_l_e_m_e_n_t(const _M_e_m_b_e_r_T_y_p_e& item, Element* next) │ │ │ │ │ -553 : next_(next), item_(item) │ │ │ │ │ -554 {} │ │ │ │ │ +488 return a[0]>b; │ │ │ │ │ +489 } │ │ │ │ │ +490 │ │ │ │ │ +492 template │ │ │ │ │ +493 constexpr bool _o_p_e_r_a_t_o_r_>_=_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ +494 { │ │ │ │ │ +495 return a[0]>=b; │ │ │ │ │ +496 } │ │ │ │ │ +497 │ │ │ │ │ +499 template │ │ │ │ │ +500 constexpr bool _o_p_e_r_a_t_o_r_<_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ +501 { │ │ │ │ │ +502 return a[0] │ │ │ │ │ +507 constexpr bool _o_p_e_r_a_t_o_r_<_=_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ +508 { │ │ │ │ │ +509 return a[0]<=b; │ │ │ │ │ +510 } │ │ │ │ │ +511 │ │ │ │ │ +513 template │ │ │ │ │ +514 constexpr bool _o_p_e_r_a_t_o_r_=_=_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ +515 { │ │ │ │ │ +516 return a[0]==b; │ │ │ │ │ +517 } │ │ │ │ │ +518 │ │ │ │ │ +520 template │ │ │ │ │ +521 constexpr bool _o_p_e_r_a_t_o_r_!_=_ (const FieldVector& a, const K b) noexcept │ │ │ │ │ +522 { │ │ │ │ │ +523 return a[0]!=b; │ │ │ │ │ +524 } │ │ │ │ │ +525 │ │ │ │ │ +526 /* ----- scalar / FV ------ */ │ │ │ │ │ +527 │ │ │ │ │ +529 template │ │ │ │ │ +530 constexpr FieldVector _o_p_e_r_a_t_o_r_+_ (const K a, const FieldVector& b) │ │ │ │ │ +noexcept │ │ │ │ │ +531 { │ │ │ │ │ +532 return a+b[0]; │ │ │ │ │ +533 } │ │ │ │ │ +534 │ │ │ │ │ +536 template │ │ │ │ │ +537 constexpr FieldVector _o_p_e_r_a_t_o_r_-_ (const K a, const FieldVector& b) │ │ │ │ │ +noexcept │ │ │ │ │ +538 { │ │ │ │ │ +539 return a-b[0]; │ │ │ │ │ +540 } │ │ │ │ │ +541 │ │ │ │ │ +543 template │ │ │ │ │ +544 constexpr FieldVector _o_p_e_r_a_t_o_r_*_ (const K a, const FieldVector& b) │ │ │ │ │ +noexcept │ │ │ │ │ +545 { │ │ │ │ │ +546 return a*b[0]; │ │ │ │ │ +547 } │ │ │ │ │ +548 │ │ │ │ │ +550 template │ │ │ │ │ +551 constexpr FieldVector _o_p_e_r_a_t_o_r_/_ (const K a, const FieldVector& b) │ │ │ │ │ +noexcept │ │ │ │ │ +552 { │ │ │ │ │ +553 return a/b[0]; │ │ │ │ │ +554 } │ │ │ │ │ 555 │ │ │ │ │ -556 template │ │ │ │ │ -_5_5_7 _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t_:_:_E_l_e_m_e_n_t() │ │ │ │ │ -558 : next_(0), item_() │ │ │ │ │ -559 {} │ │ │ │ │ -560 │ │ │ │ │ -561 template │ │ │ │ │ -_5_6_2 _S_L_L_i_s_t_<_T_,_A_>_:_:_E_l_e_m_e_n_t_:_:_~_E_l_e_m_e_n_t() │ │ │ │ │ -563 { │ │ │ │ │ -564 next_=0; │ │ │ │ │ -565 } │ │ │ │ │ -566 │ │ │ │ │ -567 template │ │ │ │ │ -_5_6_8 _S_L_L_i_s_t_<_T_,_A_>_:_:_S_L_L_i_s_t() │ │ │ │ │ -569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ -570 { │ │ │ │ │ -571 beforeHead_.next_=0; │ │ │ │ │ -572 assert(&beforeHead_==tail_); │ │ │ │ │ -573 assert(tail_->next_==0); │ │ │ │ │ -574 } │ │ │ │ │ -575 │ │ │ │ │ -576 template │ │ │ │ │ -_5_7_7 _S_L_L_i_s_t_<_T_,_A_>_:_:_S_L_L_i_s_t(const _S_L_L_i_s_t_<_T_,_A_>& other) │ │ │ │ │ -578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ -579 { │ │ │ │ │ -580 copyElements(other); │ │ │ │ │ -581 } │ │ │ │ │ -582 │ │ │ │ │ -583 template │ │ │ │ │ -584 template │ │ │ │ │ -_5_8_5 _S_L_L_i_s_t_<_T_,_A_>_:_:_S_L_L_i_s_t(const _S_L_L_i_s_t_<_T_1_,_A_1_>& other) │ │ │ │ │ -586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ +557 template │ │ │ │ │ +558 constexpr bool _o_p_e_r_a_t_o_r_>_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ +559 { │ │ │ │ │ +560 return a>b[0]; │ │ │ │ │ +561 } │ │ │ │ │ +562 │ │ │ │ │ +564 template │ │ │ │ │ +565 constexpr bool _o_p_e_r_a_t_o_r_>_=_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ +566 { │ │ │ │ │ +567 return a>=b[0]; │ │ │ │ │ +568 } │ │ │ │ │ +569 │ │ │ │ │ +571 template │ │ │ │ │ +572 constexpr bool _o_p_e_r_a_t_o_r_<_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ +573 { │ │ │ │ │ +574 return a │ │ │ │ │ +579 constexpr bool _o_p_e_r_a_t_o_r_<_=_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ +580 { │ │ │ │ │ +581 return a<=b[0]; │ │ │ │ │ +582 } │ │ │ │ │ +583 │ │ │ │ │ +585 template │ │ │ │ │ +586 constexpr bool _o_p_e_r_a_t_o_r_=_=_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ 587 { │ │ │ │ │ -588 copyElements(other); │ │ │ │ │ +588 return a==b[0]; │ │ │ │ │ 589 } │ │ │ │ │ 590 │ │ │ │ │ -591 template │ │ │ │ │ -592 void _S_L_L_i_s_t_<_T_,_A_>_:_:_c_o_p_y_E_l_e_m_e_n_t_s(const _S_L_L_i_s_t_<_T_,_A_>& other) │ │ │ │ │ -593 { │ │ │ │ │ -594 assert(tail_==&beforeHead_); │ │ │ │ │ -595 assert(size_==0); │ │ │ │ │ -596 typedef typename _S_L_L_i_s_t_<_T_,_A_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -597 Iterator iend = other._e_n_d(); │ │ │ │ │ -598 for(Iterator element=other._b_e_g_i_n(); element != iend; ++element) │ │ │ │ │ -599 _p_u_s_h___b_a_c_k(*element); │ │ │ │ │ -600 │ │ │ │ │ -601 assert(other._s_i_z_e()==_s_i_z_e()); │ │ │ │ │ -602 } │ │ │ │ │ -603 │ │ │ │ │ -604 template │ │ │ │ │ -_6_0_5 _S_L_L_i_s_t_<_T_,_A_>_:_:_~_S_L_L_i_s_t() │ │ │ │ │ -606 { │ │ │ │ │ -607 clear(); │ │ │ │ │ -608 } │ │ │ │ │ -609 │ │ │ │ │ -610 template │ │ │ │ │ -_6_1_1 bool _S_L_L_i_s_t_<_T_,_A_>_:_:_o_p_e_r_a_t_o_r_=_=(const _S_L_L_i_s_t& other) const │ │ │ │ │ -612 { │ │ │ │ │ -613 if(_s_i_z_e()!=other._s_i_z_e()) │ │ │ │ │ -614 return false; │ │ │ │ │ -615 for(_c_o_n_s_t___i_t_e_r_a_t_o_r iter=begin(), oiter=other._b_e_g_i_n(); │ │ │ │ │ -616 iter != end(); ++iter, ++oiter) │ │ │ │ │ -617 if(*iter!=*oiter) │ │ │ │ │ -618 return false; │ │ │ │ │ -619 return true; │ │ │ │ │ +592 template │ │ │ │ │ +593 constexpr bool _o_p_e_r_a_t_o_r_!_=_ (const K a, const FieldVector& b) noexcept │ │ │ │ │ +594 { │ │ │ │ │ +595 return a!=b[0]; │ │ │ │ │ +596 } │ │ │ │ │ +597#endif │ │ │ │ │ +598 │ │ │ │ │ +599 /* Overloads for common classification functions */ │ │ │ │ │ +_6_0_0 namespace MathOverloads { │ │ │ │ │ +601 │ │ │ │ │ +603 template │ │ │ │ │ +_6_0_4 auto _i_s_F_i_n_i_t_e (const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_S_I_Z_E_>& b, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) │ │ │ │ │ +605 { │ │ │ │ │ +606 bool out = true; │ │ │ │ │ +607 for (int i = 0; i < SIZE; ++i) { │ │ │ │ │ +608 out &= Dune::isFinite(b[i]); │ │ │ │ │ +609 } │ │ │ │ │ +610 return out; │ │ │ │ │ +611 } │ │ │ │ │ +612 │ │ │ │ │ +614 template │ │ │ │ │ +_6_1_5 bool _i_s_I_n_f (const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_S_I_Z_E_>& b, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) │ │ │ │ │ +616 { │ │ │ │ │ +617 bool out = false; │ │ │ │ │ +618 for (int i = 0; i < SIZE; ++i) { │ │ │ │ │ +619 out |= Dune::isInf(b[i]); │ │ │ │ │ 620 } │ │ │ │ │ -621 │ │ │ │ │ -622 template │ │ │ │ │ -_6_2_3 bool _S_L_L_i_s_t_<_T_,_A_>_:_:_o_p_e_r_a_t_o_r_!_=(const _S_L_L_i_s_t& other) const │ │ │ │ │ -624 { │ │ │ │ │ -625 if(_s_i_z_e()==other._s_i_z_e()) { │ │ │ │ │ -626 for(_c_o_n_s_t___i_t_e_r_a_t_o_r iter=begin(), oiter=other._b_e_g_i_n(); │ │ │ │ │ -627 iter != end(); ++iter, ++oiter) │ │ │ │ │ -628 if(*iter!=*oiter) │ │ │ │ │ -629 return true; │ │ │ │ │ -630 return false; │ │ │ │ │ -631 }else │ │ │ │ │ -632 return true; │ │ │ │ │ -633 } │ │ │ │ │ -634 template │ │ │ │ │ -_6_3_5 _S_L_L_i_s_t_<_T_,_A_>& _S_L_L_i_s_t_<_T_,_A_>_:_:_o_p_e_r_a_t_o_r_=(const _S_L_L_i_s_t_<_T_,_A_>& other) │ │ │ │ │ -636 { │ │ │ │ │ -637 clear(); │ │ │ │ │ -638 copyElements(other); │ │ │ │ │ -639 return *this; │ │ │ │ │ -640 } │ │ │ │ │ -641 │ │ │ │ │ -642 template │ │ │ │ │ -_6_4_3 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_p_u_s_h___b_a_c_k(const _M_e_m_b_e_r_T_y_p_e& item) │ │ │ │ │ -644 { │ │ │ │ │ -645 assert(size_>0 || tail_==&beforeHead_); │ │ │ │ │ -646 tail_->next_ = allocator_.allocate(1); │ │ │ │ │ -647 assert(size_>0 || tail_==&beforeHead_); │ │ │ │ │ -648 tail_ = tail_->next_; │ │ │ │ │ -649 ::new (static_cast(&(tail_->item_)))T(item); │ │ │ │ │ -650 tail_->next_=0; │ │ │ │ │ -651 assert(tail_->next_==0); │ │ │ │ │ -652 ++size_; │ │ │ │ │ -653 } │ │ │ │ │ -654 │ │ │ │ │ -655 template │ │ │ │ │ -656 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_i_n_s_e_r_t_A_f_t_e_r(Element* current, const T& item) │ │ │ │ │ -657 { │ │ │ │ │ -658 assert(current); │ │ │ │ │ -659 │ │ │ │ │ -660#ifndef NDEBUG │ │ │ │ │ -661 bool changeTail = (current == tail_); │ │ │ │ │ -662#endif │ │ │ │ │ -663 │ │ │ │ │ -664 // Save old next element │ │ │ │ │ -665 Element* tmp = current->next_; │ │ │ │ │ -666 │ │ │ │ │ -667 assert(!changeTail || !tmp); │ │ │ │ │ -668 │ │ │ │ │ -669 // Allocate space │ │ │ │ │ -670 current->next_ = allocator_.allocate(1); │ │ │ │ │ -671 │ │ │ │ │ -672 // Use copy constructor to initialize memory │ │ │ │ │ -673 std::allocator_traits::construct(allocator_, current->next_, │ │ │ │ │ -Element(item,tmp)); │ │ │ │ │ -674 │ │ │ │ │ -675 //::new(static_cast(&(current->next_->item_))) T(item); │ │ │ │ │ -676 │ │ │ │ │ -677 if(!current->next_->next_) { │ │ │ │ │ -678 // Update tail │ │ │ │ │ -679 assert(changeTail); │ │ │ │ │ -680 tail_ = current->next_; │ │ │ │ │ -681 } │ │ │ │ │ -682 ++size_; │ │ │ │ │ -683 assert(!tail_->next_); │ │ │ │ │ -684 } │ │ │ │ │ -685 │ │ │ │ │ -686 template │ │ │ │ │ -_6_8_7 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_p_u_s_h___f_r_o_n_t(const _M_e_m_b_e_r_T_y_p_e& item) │ │ │ │ │ -688 { │ │ │ │ │ -689 if(tail_ == &beforeHead_) { │ │ │ │ │ -690 // list was empty │ │ │ │ │ -691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0); │ │ │ │ │ -692 ::new(static_cast(&beforeHead_.next_->item_))T(item); │ │ │ │ │ -693 beforeHead_.next_->next_=0; │ │ │ │ │ -694 }else{ │ │ │ │ │ -695 Element* added = allocator_.allocate(1, 0); │ │ │ │ │ -696 ::new(static_cast(&added->item_))T(item); │ │ │ │ │ -697 added->next_=beforeHead_.next_; │ │ │ │ │ -698 beforeHead_.next_=added; │ │ │ │ │ -699 } │ │ │ │ │ -700 assert(tail_->next_==0); │ │ │ │ │ -701 ++size_; │ │ │ │ │ -702 } │ │ │ │ │ -703 │ │ │ │ │ -704 │ │ │ │ │ -705 template │ │ │ │ │ -706 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_d_e_l_e_t_e_N_e_x_t(Element* current) │ │ │ │ │ -707 { │ │ │ │ │ -708 this->template deleteNext(current); │ │ │ │ │ -709 } │ │ │ │ │ -710 │ │ │ │ │ -711 template │ │ │ │ │ -712 template │ │ │ │ │ -713 inline void SLList::deleteNext(Element* current) │ │ │ │ │ -714 { │ │ │ │ │ -715 assert(current->next_); │ │ │ │ │ -716 Element* next = current->next_; │ │ │ │ │ -717 │ │ │ │ │ -718 if(watchForTail) │ │ │ │ │ -719 if(next == tail_) { │ │ │ │ │ -720 // deleting last element changes tail! │ │ │ │ │ -721 tail_ = current; │ │ │ │ │ -722 } │ │ │ │ │ -723 │ │ │ │ │ -724 current->next_ = next->next_; │ │ │ │ │ -725 std::allocator_traits::destroy(allocator_, next); │ │ │ │ │ -726 allocator_.deallocate(next, 1); │ │ │ │ │ -727 --size_; │ │ │ │ │ -728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0); │ │ │ │ │ -729 } │ │ │ │ │ -730 │ │ │ │ │ -731 template │ │ │ │ │ -_7_3_2 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_p_o_p___f_r_o_n_t() │ │ │ │ │ -733 { │ │ │ │ │ -734 deleteNext(&beforeHead_); │ │ │ │ │ -735 } │ │ │ │ │ -736 │ │ │ │ │ -737 template │ │ │ │ │ -_7_3_8 inline void _S_L_L_i_s_t_<_T_,_A_>_:_:_c_l_e_a_r() │ │ │ │ │ -739 { │ │ │ │ │ -740 while(beforeHead_.next_ ) { │ │ │ │ │ -741 this->template deleteNext(&beforeHead_); │ │ │ │ │ -742 } │ │ │ │ │ -743 │ │ │ │ │ -744 assert(size_==0); │ │ │ │ │ -745 // update the tail! │ │ │ │ │ -746 tail_ = &beforeHead_; │ │ │ │ │ -747 } │ │ │ │ │ -748 │ │ │ │ │ -749 template │ │ │ │ │ -_7_5_0 inline bool _S_L_L_i_s_t_<_T_,_A_>_:_:_e_m_p_t_y() const │ │ │ │ │ -751 { │ │ │ │ │ -752 return (&beforeHead_ == tail_); │ │ │ │ │ -753 } │ │ │ │ │ -754 │ │ │ │ │ -755 template │ │ │ │ │ -_7_5_6 inline int _S_L_L_i_s_t_<_T_,_A_>_:_:_s_i_z_e() const │ │ │ │ │ -757 { │ │ │ │ │ -758 return size_; │ │ │ │ │ -759 } │ │ │ │ │ -760 │ │ │ │ │ -761 template │ │ │ │ │ -_7_6_2 inline _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_b_e_g_i_n() │ │ │ │ │ -763 { │ │ │ │ │ -764 return _i_t_e_r_a_t_o_r(beforeHead_.next_, this); │ │ │ │ │ -765 } │ │ │ │ │ -766 │ │ │ │ │ -767 template │ │ │ │ │ -_7_6_8 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_b_e_g_i_n() const │ │ │ │ │ -769 { │ │ │ │ │ -770 return _c_o_n_s_t___i_t_e_r_a_t_o_r(beforeHead_.next_); │ │ │ │ │ -771 } │ │ │ │ │ -772 │ │ │ │ │ -773 template │ │ │ │ │ -_7_7_4 inline _S_L_L_i_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_e_n_d() │ │ │ │ │ -775 { │ │ │ │ │ -776 return _i_t_e_r_a_t_o_r(); │ │ │ │ │ -777 } │ │ │ │ │ -778 │ │ │ │ │ -779 template │ │ │ │ │ -_7_8_0 inline _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_e_n_d_M_o_d_i_f_y() │ │ │ │ │ -781 { │ │ │ │ │ -782 return _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>(_i_t_e_r_a_t_o_r(tail_, this),_i_t_e_r_a_t_o_r()); │ │ │ │ │ -783 } │ │ │ │ │ -784 │ │ │ │ │ -785 │ │ │ │ │ -786 template │ │ │ │ │ -_7_8_7 inline _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_b_e_g_i_n_M_o_d_i_f_y() │ │ │ │ │ -788 { │ │ │ │ │ -789 return _S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_<_T_,_A_>(_i_t_e_r_a_t_o_r(&beforeHead_, this), │ │ │ │ │ -790 _i_t_e_r_a_t_o_r(beforeHead_.next_, this)); │ │ │ │ │ -791 } │ │ │ │ │ -792 │ │ │ │ │ -793 template │ │ │ │ │ -_7_9_4 inline _S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_<_T_,_A_> _S_L_L_i_s_t_<_T_,_A_>_:_:_e_n_d() const │ │ │ │ │ -795 { │ │ │ │ │ -796 return _c_o_n_s_t___i_t_e_r_a_t_o_r(); │ │ │ │ │ -797 } │ │ │ │ │ -798 │ │ │ │ │ -800} │ │ │ │ │ -801#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_:_:_S_L_L_i_s_t_:_:_p_u_s_h___f_r_o_n_t │ │ │ │ │ -void push_front(const MemberType &item) │ │ │ │ │ -Add a new entry to the beginning of the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:687 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:406 │ │ │ │ │ -_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_:_:_e_n_d_M_o_d_i_f_y │ │ │ │ │ -ModifyIterator endModify() │ │ │ │ │ -Get an iterator capable of deleting and inserting elements. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:780 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListModifyIterator() │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:438 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_E_l_e_m_e_n_t_:_:_E_l_e_m_e_n_t │ │ │ │ │ -Element() │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:557 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -T & dereference() const │ │ │ │ │ -Dereferencing function for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:294 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const SLList &sl) const │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:623 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_E_l_e_m_e_n_t_:_:_i_t_e_m__ │ │ │ │ │ -MemberType item_ │ │ │ │ │ -The element we hold. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListConstIterator(typename SLList< T, A >::Element *item) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:380 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ -typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator │ │ │ │ │ -The allocator to use. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t_A_f_t_e_r │ │ │ │ │ -void insertAfter(const T &v) const │ │ │ │ │ -Insert an element in the underlying list after the current position. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:342 │ │ │ │ │ -_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_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListConstIterator(const SLListModifyIterator< T, A > &other) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:388 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListIterator() │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_E_l_e_m_e_n_t_:_:_~_E_l_e_m_e_n_t │ │ │ │ │ -~Element() │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:562 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const SLList &sl) const │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:611 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_d_e_l_e_t_e_N_e_x_t │ │ │ │ │ -void deleteNext() const │ │ │ │ │ -Delete the entry after the current position. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_S_L_L_i_s_t │ │ │ │ │ -SLList(const SLList< T, A > &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListModifyIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -T & dereference() const │ │ │ │ │ -Dereferencing function for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:446 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_s_i_z_e │ │ │ │ │ -int size() const │ │ │ │ │ -Get the number of elements the list contains. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:756 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get an iterator pointing to the first element in the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:768 │ │ │ │ │ -_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_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Remove all elements from the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:738 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_S_L_L_i_s_t │ │ │ │ │ -SLList(const SLList< T1, A1 > &other) │ │ │ │ │ -Copy constructor with type conversion. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:585 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ -T MemberType │ │ │ │ │ -The type we store. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListModifyIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:478 │ │ │ │ │ -_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_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -SLList< T, A > & operator=(const SLList< T, A > &other) │ │ │ │ │ -Assignment operator. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:635 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListConstIterator(const SLListIterator< T, A > &other) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -SLListConstIterator< T, A > const_iterator │ │ │ │ │ -The constant iterator of the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_e_m_p_t_y │ │ │ │ │ -bool empty() const │ │ │ │ │ -Check whether the list is empty. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:750 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListConstIterator() │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:376 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:456 │ │ │ │ │ -_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_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get an iterator pointing to the end of the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:794 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_S_L_L_i_s_t │ │ │ │ │ -SLList() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t │ │ │ │ │ -void insert(const T &v) │ │ │ │ │ -Insert an element at the current position. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:277 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T, │ │ │ │ │ -A > _iterator) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:433 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_p_o_p___f_r_o_n_t │ │ │ │ │ -void pop_front() │ │ │ │ │ -Remove the first item in the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:732 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -SLListIterator(const SLListModifyIterator< T, A > &other) │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The size type. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_r_e_m_o_v_e │ │ │ │ │ -void remove() │ │ │ │ │ -Delete the entry at the current position. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:518 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -const T & dereference() const │ │ │ │ │ -Dereferencing function for the facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:396 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_E_l_e_m_e_n_t_:_:_n_e_x_t__ │ │ │ │ │ -Element * next_ │ │ │ │ │ -The next element in the list. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:486 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:414 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_:_:_~_S_L_L_i_s_t │ │ │ │ │ -~SLList() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:605 │ │ │ │ │ -_D_u_n_e_:_:_S_L_L_i_s_t_M_o_d_i_f_y_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:467 │ │ │ │ │ -_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_:_:_S_L_L_i_s_t_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const SLListIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -DDeeffiinniittiioonn sllist.hh:314 │ │ │ │ │ -_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 │ │ │ │ │ +621 return out; │ │ │ │ │ +622 } │ │ │ │ │ +623 │ │ │ │ │ +625 template::value, int> = 0> │ │ │ │ │ +_6_2_7 bool _i_s_N_a_N (const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_S_I_Z_E_>& b, _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) │ │ │ │ │ +628 { │ │ │ │ │ +629 bool out = false; │ │ │ │ │ +630 for (int i = 0; i < SIZE; ++i) { │ │ │ │ │ +631 out |= Dune::isNaN(b[i]); │ │ │ │ │ +632 } │ │ │ │ │ +633 return out; │ │ │ │ │ +634 } │ │ │ │ │ +635 │ │ │ │ │ +637 template::value, int> = 0> │ │ │ │ │ +_6_3_9 bool _i_s_U_n_o_r_d_e_r_e_d (const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_1_>& b, const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_1_>& c, │ │ │ │ │ +640 _P_r_i_o_r_i_t_y_T_a_g_<_2_>, _A_D_L_T_a_g) │ │ │ │ │ +641 { │ │ │ │ │ +642 return Dune::isUnordered(b[0],c[0]); │ │ │ │ │ +643 } │ │ │ │ │ +644 │ │ │ │ │ +645 } // end namespace MathOverloads │ │ │ │ │ +646 │ │ │ │ │ +649} // end namespace Dune │ │ │ │ │ +650 │ │ │ │ │ +651#endif // DUNE_COMMON_FVECTOR_HH │ │ │ │ │ +_d_e_n_s_e_v_e_c_t_o_r_._h_h │ │ │ │ │ +Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ +_m_a_t_h_._h_h │ │ │ │ │ +Some useful basic math stuff. │ │ │ │ │ +_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) │ │ │ │ │ +_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. │ │ │ │ │ +_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ +_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 │ │ │ │ │ +_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_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ │ +bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:556 │ │ │ │ │ +_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_:_:_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:638 │ │ │ │ │ +_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:684 │ │ │ │ │ +_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:661 │ │ │ │ │ +_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:238 │ │ │ │ │ +_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:706 │ │ │ │ │ +_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:260 │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ -constexpr std::integer_sequence< T, II..., T(IN)> push_back(std:: │ │ │ │ │ -integer_sequence< T, II... >, std::integral_constant< T, IN >={}) │ │ │ │ │ -Append an index IN to the back of the sequence. │ │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_s_i_z_e │ │ │ │ │ -constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std:: │ │ │ │ │ -integer_sequence< T, II... >) │ │ │ │ │ -Return the size of the sequence. │ │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:75 │ │ │ │ │ -_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:142 │ │ │ │ │ -_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_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 │ │ │ │ │ +_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) │ │ │ │ │ +Returns whether any entry is NaN. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:627 │ │ │ │ │ +_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) │ │ │ │ │ +Returns whether any entry is infinite. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:615 │ │ │ │ │ +_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) │ │ │ │ │ +Returns whether all entries are finite. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:604 │ │ │ │ │ +_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) │ │ │ │ │ +Returns true if either b or c is NaN. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:639 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +vector space out of a tensor product of fields. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +constexpr FieldVector(const K &k) noexcept(std::is_nothrow_copy_assignable_v< K │ │ │ │ │ +>) │ │ │ │ │ +Constructor making vector with identical coordinates. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const value_type & const_reference │ │ │ │ │ +The type used for const references to the vector entry. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +constexpr FieldVector(const std::initializer_list< K > &l) │ │ │ │ │ +Construct from a std::initializer_list. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ +static constexpr size_type size() noexcept │ │ │ │ │ +Obtain the number of elements stored in the vector. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Base::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +FieldVector & operator=(const DenseVector< T > &x) │ │ │ │ │ +Assignment from another dense vector. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +The size of this vector. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +constexpr FieldVector() noexcept │ │ │ │ │ +Default constructor, making value-initialized vector with all components set to │ │ │ │ │ +zero. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ │ +friend constexpr auto operator/(const FieldVector &vector, Scalar scalar) │ │ │ │ │ +Vector space division by scalar. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:250 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +friend constexpr auto operator*(const FieldVector &vector, Scalar scalar) │ │ │ │ │ +Vector space multiplication with scalar. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +value_type & reference │ │ │ │ │ +The type used for references to the vector entry. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +Base::value_type value_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +constexpr FieldVector(const FieldVector< T, SIZE > &x) noexcept(std:: │ │ │ │ │ +is_nothrow_assignable_v< K &, const T & >) │ │ │ │ │ +Converting constructor from FieldVector with different element type. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_d_a_t_a │ │ │ │ │ +constexpr const K * data() const noexcept │ │ │ │ │ +Return pointer to underlying array. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector(const FieldVector &)=default │ │ │ │ │ +Copy constructor with default behavior. │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +reference operator[](size_type i) │ │ │ │ │ +Return a reference to the ith element. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_:_:_d_a_t_a │ │ │ │ │ +constexpr K * data() noexcept │ │ │ │ │ +Return pointer to underlying array. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:210 │ │ │ │ │ +_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_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_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_:_:_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_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_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_:_:_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_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +K value_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_c_o_n_t_a_i_n_e_r___t_y_p_e │ │ │ │ │ +std::array< K, SIZE > container_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +container_type::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ │ +FieldVector< K, SIZE > derived_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< K >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _S_I_Z_E_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< K >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t │ │ │ │ │ +TMP to check the size of a DenseVectors statically, if possible. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_I_s_F_i_e_l_d_V_e_c_t_o_r_S_i_z_e_C_o_r_r_e_c_t_:_:_v_a_l_u_e │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +True if C is not of type FieldVector or its dimension is not equal SIZE. │ │ │ │ │ +DDeeffiinniittiioonn fvector.hh:67 │ │ │ │ │ +_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_:_:_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_:_:_P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_:_:_P_r_o_m_o_t_e_d_T_y_p_e │ │ │ │ │ +decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType │ │ │ │ │ +DDeeffiinniittiioonn promotiontraits.hh:28 │ │ │ │ │ +_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/a00056.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: stdstreams.hh File Reference │ │ │ │ +dune-common: precision.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,85 +70,40 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Typedefs | │ │ │ │ -Variables
│ │ │ │ -
stdstreams.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
precision.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Standard Dune debug streams. │ │ │ │ +

Various precision settings for calculations with FieldMatrix and FieldVector. │ │ │ │ More...

│ │ │ │ -
#include <dune-common-config.hh>
│ │ │ │ -#include "debugstream.hh"
│ │ │ │ +
#include <stdlib.h>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::FMatrixPrecision< ctype >
 Precisions for calculations with FieldMatrix and FieldVector. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Macros

#define DUNE_MINIMAL_DEBUG_LEVEL   4
 The default minimum debug level.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

typedef DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DVVerbType
 Type of very verbose debug stream.
 
typedef DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DVerbType
 Type of more verbose debug stream.
 
typedef DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DInfoType
 Type of debug stream with info level.
 
typedef DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DWarnType
 Type of debug stream with warn level.
 
typedef DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DGraveType
 Type of debug stream for fatal errors.
 
typedef DebugStream< 1 > Dune::DErrType
 The type of the stream used for error messages.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Variables

static const DebugLevel Dune::MINIMAL_DEBUG_LEVEL = DUNE_MINIMAL_DEBUG_LEVEL
 
static const DebugLevel Dune::VERY_VERBOSE_DEBUG_LEVEL = 1
 The level of the very verbose debug stream.
 
static const DebugLevel Dune::VERBOSE_DEBUG_LEVEL = 2
 The level of the verbose debug stream.
 
static const DebugLevel Dune::INFO_DEBUG_LEVEL = 3
 The level of the informative debug stream.
 
static const DebugLevel Dune::WARN_DEBUG_LEVEL = 4
 The level of the debug stream for warnings.
 
static const DebugLevel Dune::GRAVE_DEBUG_LEVEL = 5
 The level of the debug stream for fatal errors.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Standard Dune debug streams.

│ │ │ │ -

The standard debug streams are compiled into libdune to exist globally. This file declares the stream types and the global debug level.

│ │ │ │ +

Various precision settings for calculations with FieldMatrix and FieldVector.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,71 +1,24 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _T_y_p_e_d_e_f_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -stdstreams.hh File Reference │ │ │ │ │ -Standard _D_u_n_e debug streams. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include "_d_e_b_u_g_s_t_r_e_a_m_._h_h" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +precision.hh File Reference │ │ │ │ │ +Various precision settings for calculations with FieldMatrix and FieldVector. │ │ │ │ │ +_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_:_:_F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_ _c_t_y_p_e_ _> │ │ │ │ │ +  Precisions for calculations with _F_i_e_l_d_M_a_t_r_i_x and _F_i_e_l_d_V_e_c_t_o_r. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   _D_u_n_e namespace. │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L   4 │ │ │ │ │ -  The default minimum debug level. │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< │ │ │ │ │ - _V_E_R_Y___V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L, │ │ │ │ │ - _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L >  _D_u_n_e_:_:_D_V_V_e_r_b_T_y_p_e │ │ │ │ │ -  Type of very verbose debug stream. │ │ │ │ │ -  │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< │ │ │ │ │ -_V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L, _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ - >  _D_u_n_e_:_:_D_V_e_r_b_T_y_p_e │ │ │ │ │ -  Type of more verbose debug stream. │ │ │ │ │ -  │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< _I_N_F_O___D_E_B_U_G___L_E_V_E_L, │ │ │ │ │ - _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L >  _D_u_n_e_:_:_D_I_n_f_o_T_y_p_e │ │ │ │ │ -  Type of debug stream with info level. │ │ │ │ │ -  │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< _W_A_R_N___D_E_B_U_G___L_E_V_E_L, │ │ │ │ │ - _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L >  _D_u_n_e_:_:_D_W_a_r_n_T_y_p_e │ │ │ │ │ -  Type of debug stream with warn level. │ │ │ │ │ -  │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< _G_R_A_V_E___D_E_B_U_G___L_E_V_E_L, │ │ │ │ │ - _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L >  _D_u_n_e_:_:_D_G_r_a_v_e_T_y_p_e │ │ │ │ │ -  Type of debug stream for fatal errors. │ │ │ │ │ -  │ │ │ │ │ - typedef _D_e_b_u_g_S_t_r_e_a_m< 1 >  _D_u_n_e_:_:_D_E_r_r_T_y_p_e │ │ │ │ │ -  The type of the stream used for error │ │ │ │ │ - messages. │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L = _D_U_N_E___M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -  │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_V_E_R_Y___V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L = 1 │ │ │ │ │ -  The level of the very verbose debug stream. │ │ │ │ │ -  │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L = 2 │ │ │ │ │ -  The level of the verbose debug stream. │ │ │ │ │ -  │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_I_N_F_O___D_E_B_U_G___L_E_V_E_L = 3 │ │ │ │ │ -  The level of the informative debug stream. │ │ │ │ │ -  │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_W_A_R_N___D_E_B_U_G___L_E_V_E_L = 4 │ │ │ │ │ -  The level of the debug stream for warnings. │ │ │ │ │ -  │ │ │ │ │ -static const _D_e_b_u_g_L_e_v_e_l  _D_u_n_e_:_:_G_R_A_V_E___D_E_B_U_G___L_E_V_E_L = 5 │ │ │ │ │ -  The level of the debug stream for fatal errors. │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Standard _D_u_n_e debug streams. │ │ │ │ │ -The standard debug streams are compiled into libdune to exist globally. This │ │ │ │ │ -file declares the stream types and the global debug level. │ │ │ │ │ +Various precision settings for calculations with FieldMatrix and FieldVector. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: stdstreams.hh Source File │ │ │ │ +dune-common: precision.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,95 +74,62 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
stdstreams.hh
│ │ │ │ +
precision.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5
│ │ │ │ -
15#ifndef DUNE_COMMON_STDSTREAMS_HH
│ │ │ │ -
16#define DUNE_COMMON_STDSTREAMS_HH
│ │ │ │ -
17
│ │ │ │ -
18#include <dune-common-config.hh> // DUNE_MINIMAL_DEBUG_LEVEL
│ │ │ │ -
19#include "debugstream.hh"
│ │ │ │ -
20
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22
│ │ │ │ -
67#ifndef DUNE_MINIMAL_DEBUG_LEVEL
│ │ │ │ -
68#define DUNE_MINIMAL_DEBUG_LEVEL 4
│ │ │ │ -
69#endif
│ │ │ │ - │ │ │ │ -
71
│ │ │ │ - │ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
83
│ │ │ │ - │ │ │ │ -
97
│ │ │ │ - │ │ │ │ -
103
│ │ │ │ - │ │ │ │ -
109
│ │ │ │ - │ │ │ │ -
118
│ │ │ │ -
123 static const DebugLevel INFO_DEBUG_LEVEL = 3;
│ │ │ │ -
124
│ │ │ │ - │ │ │ │ -
130
│ │ │ │ - │ │ │ │ -
142
│ │ │ │ -
147 static const DebugLevel WARN_DEBUG_LEVEL = 4;
│ │ │ │ -
148
│ │ │ │ - │ │ │ │ -
154
│ │ │ │ - │ │ │ │ -
163
│ │ │ │ - │ │ │ │ -
169
│ │ │ │ - │ │ │ │ -
172
│ │ │ │ - │ │ │ │ -
181
│ │ │ │ - │ │ │ │ -
184
│ │ │ │ - │ │ │ │ -
197
│ │ │ │ -
199}
│ │ │ │ -
200
│ │ │ │ -
201#endif
│ │ │ │ -
Defines several output streams for messages of different importance.
│ │ │ │ -
unsigned int DebugLevel
Type for debug levels.
Definition debugstream.hh:118
│ │ │ │ -
DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVVerbType
Type of very verbose debug stream.
Definition stdstreams.hh:82
│ │ │ │ -
DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DWarnType
Type of debug stream with warn level.
Definition stdstreams.hh:153
│ │ │ │ -
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition stdstreams.hh:96
│ │ │ │ -
static const DebugLevel MINIMAL_DEBUG_LEVEL
Definition stdstreams.hh:70
│ │ │ │ -
#define DUNE_MINIMAL_DEBUG_LEVEL
The default minimum debug level.
Definition stdstreams.hh:68
│ │ │ │ -
static const DebugLevel VERY_VERBOSE_DEBUG_LEVEL
The level of the very verbose debug stream.
Definition stdstreams.hh:76
│ │ │ │ -
DWarnType dwarn(std::cerr)
Stream for warnings indicating problems.
Definition stdstreams.hh:162
│ │ │ │ -
static const DebugLevel GRAVE_DEBUG_LEVEL
The level of the debug stream for fatal errors.
Definition stdstreams.hh:168
│ │ │ │ -
DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVerbType
Type of more verbose debug stream.
Definition stdstreams.hh:108
│ │ │ │ -
DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DGraveType
Type of debug stream for fatal errors.
Definition stdstreams.hh:171
│ │ │ │ -
DGraveType dgrave(std::cerr)
Stream for warnings indicating fatal errors.
Definition stdstreams.hh:180
│ │ │ │ -
DebugStream< 1 > DErrType
The type of the stream used for error messages.
Definition stdstreams.hh:183
│ │ │ │ -
static const DebugLevel INFO_DEBUG_LEVEL
The level of the informative debug stream.
Definition stdstreams.hh:123
│ │ │ │ -
DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DInfoType
Type of debug stream with info level.
Definition stdstreams.hh:129
│ │ │ │ -
DInfoType dinfo(std::cout)
Stream for informative output.
Definition stdstreams.hh:141
│ │ │ │ -
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition stdstreams.hh:117
│ │ │ │ -
static const DebugLevel VERBOSE_DEBUG_LEVEL
The level of the verbose debug stream.
Definition stdstreams.hh:102
│ │ │ │ -
DErrType derr(std::cerr)
Stream for error messages.
Definition stdstreams.hh:196
│ │ │ │ -
static const DebugLevel WARN_DEBUG_LEVEL
The level of the debug stream for warnings.
Definition stdstreams.hh:147
│ │ │ │ +
5#ifndef DUNE_PRECISION_HH
│ │ │ │ +
6#define DUNE_PRECISION_HH
│ │ │ │ +
7
│ │ │ │ +
12#include <stdlib.h>
│ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15
│ │ │ │ +
24 template <class ctype = double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
26 public:
│ │ │ │ +
│ │ │ │ +
28 static ctype absolute_limit ()
│ │ │ │ +
29 {
│ │ │ │ +
30 return _absolute;
│ │ │ │ +
31 }
│ │ │ │ +
│ │ │ │ +
32
│ │ │ │ +
│ │ │ │ +
34 static void set_absolute_limit (ctype absthres)
│ │ │ │ +
35 {
│ │ │ │ +
36 _absolute = absthres;
│ │ │ │ +
37 }
│ │ │ │ +
│ │ │ │ +
38
│ │ │ │ +
39 private:
│ │ │ │ +
40 // just to demonstrate some state information
│ │ │ │ +
41 static ctype _absolute;
│ │ │ │ +
42 };
│ │ │ │ +
│ │ │ │ +
43
│ │ │ │ +
44 template <class ctype>
│ │ │ │ +
45 ctype FMatrixPrecision<ctype>::_absolute = 1E-80;
│ │ │ │ +
46
│ │ │ │ +
49} // end namespace
│ │ │ │ +
50
│ │ │ │ +
51#endif
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Generic class to implement debug output streams.
Definition debugstream.hh:192
│ │ │ │ +
Precisions for calculations with FieldMatrix and FieldVector.
Definition precision.hh:25
│ │ │ │ +
static ctype absolute_limit()
return threshold to declare matrix singular
Definition precision.hh:28
│ │ │ │ +
static void set_absolute_limit(ctype absthres)
set singular threshold
Definition precision.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,154 +1,60 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -stdstreams.hh │ │ │ │ │ +precision.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5 │ │ │ │ │ -15#ifndef DUNE_COMMON_STDSTREAMS_HH │ │ │ │ │ -16#define DUNE_COMMON_STDSTREAMS_HH │ │ │ │ │ -17 │ │ │ │ │ -18#include // DUNE_MINIMAL_DEBUG_LEVEL │ │ │ │ │ -19#include "_d_e_b_u_g_s_t_r_e_a_m_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22 │ │ │ │ │ -67#ifndef DUNE_MINIMAL_DEBUG_LEVEL │ │ │ │ │ -_6_8#define DUNE_MINIMAL_DEBUG_LEVEL 4 │ │ │ │ │ -69#endif │ │ │ │ │ -_7_0 static const _D_e_b_u_g_L_e_v_e_l _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L = _D_U_N_E___M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L; │ │ │ │ │ -71 │ │ │ │ │ -_7_6 static const _D_e_b_u_g_L_e_v_e_l _V_E_R_Y___V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L = 1; │ │ │ │ │ -77 │ │ │ │ │ -_8_2 typedef _D_e_b_u_g_S_t_r_e_a_m_<_V_E_R_Y___V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L_,_ _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L_> │ │ │ │ │ -_D_V_V_e_r_b_T_y_p_e; │ │ │ │ │ -83 │ │ │ │ │ -_9_6 extern _D_V_V_e_r_b_T_y_p_e _d_v_v_e_r_b; │ │ │ │ │ -97 │ │ │ │ │ -_1_0_2 static const _D_e_b_u_g_L_e_v_e_l _V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L = 2; │ │ │ │ │ -103 │ │ │ │ │ -_1_0_8 typedef _D_e_b_u_g_S_t_r_e_a_m_<_V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L_,_ _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L_> _D_V_e_r_b_T_y_p_e; │ │ │ │ │ -109 │ │ │ │ │ -_1_1_7 extern _D_V_e_r_b_T_y_p_e _d_v_e_r_b; │ │ │ │ │ -118 │ │ │ │ │ -_1_2_3 static const _D_e_b_u_g_L_e_v_e_l _I_N_F_O___D_E_B_U_G___L_E_V_E_L = 3; │ │ │ │ │ -124 │ │ │ │ │ -_1_2_9 typedef _D_e_b_u_g_S_t_r_e_a_m_<_I_N_F_O___D_E_B_U_G___L_E_V_E_L_,_ _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L_> _D_I_n_f_o_T_y_p_e; │ │ │ │ │ -130 │ │ │ │ │ -_1_4_1 extern _D_I_n_f_o_T_y_p_e _d_i_n_f_o; │ │ │ │ │ -142 │ │ │ │ │ -_1_4_7 static const _D_e_b_u_g_L_e_v_e_l _W_A_R_N___D_E_B_U_G___L_E_V_E_L = 4; │ │ │ │ │ -148 │ │ │ │ │ -_1_5_3 typedef _D_e_b_u_g_S_t_r_e_a_m_<_W_A_R_N___D_E_B_U_G___L_E_V_E_L_,_ _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L_> _D_W_a_r_n_T_y_p_e; │ │ │ │ │ -154 │ │ │ │ │ -_1_6_2 extern _D_W_a_r_n_T_y_p_e _d_w_a_r_n; │ │ │ │ │ -163 │ │ │ │ │ -_1_6_8 static const _D_e_b_u_g_L_e_v_e_l _G_R_A_V_E___D_E_B_U_G___L_E_V_E_L = 5; │ │ │ │ │ -169 │ │ │ │ │ -_1_7_1 typedef _D_e_b_u_g_S_t_r_e_a_m_<_G_R_A_V_E___D_E_B_U_G___L_E_V_E_L_,_ _M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L_> _D_G_r_a_v_e_T_y_p_e; │ │ │ │ │ -172 │ │ │ │ │ -_1_8_0 extern _D_G_r_a_v_e_T_y_p_e _d_g_r_a_v_e; │ │ │ │ │ -181 │ │ │ │ │ -_1_8_3 typedef _D_e_b_u_g_S_t_r_e_a_m_<_1_> _D_E_r_r_T_y_p_e; │ │ │ │ │ -184 │ │ │ │ │ -_1_9_6 extern _D_E_r_r_T_y_p_e _d_e_r_r; │ │ │ │ │ -197 │ │ │ │ │ -199} │ │ │ │ │ -200 │ │ │ │ │ -201#endif │ │ │ │ │ -_d_e_b_u_g_s_t_r_e_a_m_._h_h │ │ │ │ │ -Defines several output streams for messages of different importance. │ │ │ │ │ -_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_V_V_e_r_b_T_y_p_e │ │ │ │ │ -DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVVerbType │ │ │ │ │ -Type of very verbose debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_D_W_a_r_n_T_y_p_e │ │ │ │ │ -DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DWarnType │ │ │ │ │ -Type of debug stream with warn level. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_d_v_v_e_r_b │ │ │ │ │ -DVVerbType dvverb(std::cout) │ │ │ │ │ -stream for very verbose output. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel MINIMAL_DEBUG_LEVEL │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:70 │ │ │ │ │ -_D_U_N_E___M_I_N_I_M_A_L___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -#define DUNE_MINIMAL_DEBUG_LEVEL │ │ │ │ │ -The default minimum debug level. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_V_E_R_Y___V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel VERY_VERBOSE_DEBUG_LEVEL │ │ │ │ │ -The level of the very verbose debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_d_w_a_r_n │ │ │ │ │ -DWarnType dwarn(std::cerr) │ │ │ │ │ -Stream for warnings indicating problems. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_G_R_A_V_E___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel GRAVE_DEBUG_LEVEL │ │ │ │ │ -The level of the debug stream for fatal errors. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_D_V_e_r_b_T_y_p_e │ │ │ │ │ -DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVerbType │ │ │ │ │ -Type of more verbose debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_D_G_r_a_v_e_T_y_p_e │ │ │ │ │ -DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DGraveType │ │ │ │ │ -Type of debug stream for fatal errors. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_d_g_r_a_v_e │ │ │ │ │ -DGraveType dgrave(std::cerr) │ │ │ │ │ -Stream for warnings indicating fatal errors. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_D_E_r_r_T_y_p_e │ │ │ │ │ -DebugStream< 1 > DErrType │ │ │ │ │ -The type of the stream used for error messages. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_I_N_F_O___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel INFO_DEBUG_LEVEL │ │ │ │ │ -The level of the informative debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_D_I_n_f_o_T_y_p_e │ │ │ │ │ -DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DInfoType │ │ │ │ │ -Type of debug stream with info level. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_d_i_n_f_o │ │ │ │ │ -DInfoType dinfo(std::cout) │ │ │ │ │ -Stream for informative output. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_d_v_e_r_b │ │ │ │ │ -DVerbType dverb(std::cout) │ │ │ │ │ -Singleton of verbose debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_V_E_R_B_O_S_E___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel VERBOSE_DEBUG_LEVEL │ │ │ │ │ -The level of the verbose debug stream. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_d_e_r_r │ │ │ │ │ -DErrType derr(std::cerr) │ │ │ │ │ -Stream for error messages. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_W_A_R_N___D_E_B_U_G___L_E_V_E_L │ │ │ │ │ -static const DebugLevel WARN_DEBUG_LEVEL │ │ │ │ │ -The level of the debug stream for warnings. │ │ │ │ │ -DDeeffiinniittiioonn stdstreams.hh:147 │ │ │ │ │ +5#ifndef DUNE_PRECISION_HH │ │ │ │ │ +6#define DUNE_PRECISION_HH │ │ │ │ │ +7 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e { │ │ │ │ │ +15 │ │ │ │ │ +24 template │ │ │ │ │ +_2_5 class _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n { │ │ │ │ │ +26 public: │ │ │ │ │ +_2_8 static ctype _a_b_s_o_l_u_t_e___l_i_m_i_t () │ │ │ │ │ +29 { │ │ │ │ │ +30 return _absolute; │ │ │ │ │ +31 } │ │ │ │ │ +32 │ │ │ │ │ +_3_4 static void _s_e_t___a_b_s_o_l_u_t_e___l_i_m_i_t (ctype absthres) │ │ │ │ │ +35 { │ │ │ │ │ +36 _absolute = absthres; │ │ │ │ │ +37 } │ │ │ │ │ +38 │ │ │ │ │ +39 private: │ │ │ │ │ +40 // just to demonstrate some state information │ │ │ │ │ +41 static ctype _absolute; │ │ │ │ │ +42 }; │ │ │ │ │ +43 │ │ │ │ │ +44 template │ │ │ │ │ +45 ctype FMatrixPrecision::_absolute = 1E-80; │ │ │ │ │ +46 │ │ │ │ │ +49} // end namespace │ │ │ │ │ +50 │ │ │ │ │ +51#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_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_:_:_F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n │ │ │ │ │ +Precisions for calculations with FieldMatrix and FieldVector. │ │ │ │ │ +DDeeffiinniittiioonn precision.hh:25 │ │ │ │ │ +_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 │ │ │ │ │ +_D_u_n_e_:_:_F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_:_:_s_e_t___a_b_s_o_l_u_t_e___l_i_m_i_t │ │ │ │ │ +static void set_absolute_limit(ctype absthres) │ │ │ │ │ +set singular threshold │ │ │ │ │ +DDeeffiinniittiioonn precision.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: deprecated.hh File Reference │ │ │ │ +dune-common: concepts.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,36 +69,19 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
│ │ │ │ -Macros
│ │ │ │ -
deprecated.hh File Reference
│ │ │ │ +
concepts.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Definition of the DUNE_NO_DEPRECATED_* macros. │ │ │ │ -More...

│ │ │ │ - │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Macros

#define DUNE_NO_DEPRECATED_BEGIN   ...
 Ignore deprecation warnings (start)
 
#define DUNE_NO_DEPRECATED_END   ...
 Ignore deprecation warnings (end)
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Definition of the DUNE_NO_DEPRECATED_* macros.

│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,21 +1,10 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -deprecated.hh File Reference │ │ │ │ │ -Definition of the DUNE_NO_DEPRECATED_* macros. _M_o_r_e_._._. │ │ │ │ │ +concepts.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_. │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___N_O___D_E_P_R_E_C_A_T_E_D___B_E_G_I_N   ... │ │ │ │ │ -  Ignore deprecation warnings (start) │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___N_O___D_E_P_R_E_C_A_T_E_D___E_N_D   ... │ │ │ │ │ -  Ignore deprecation warnings (end) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Definition of the DUNE_NO_DEPRECATED_* macros. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: deprecated.hh Source File │ │ │ │ +dune-common: concepts.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,52 +74,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
deprecated.hh
│ │ │ │ +
concepts.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_DEPRECATED_HH
│ │ │ │ -
6#define DUNE_DEPRECATED_HH
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ +
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
5#ifndef DUNE_COMMON_CONCEPTS_HH
│ │ │ │ +
6#define DUNE_COMMON_CONCEPTS_HH
│ │ │ │
7
│ │ │ │ -
14#ifdef DOXYGEN
│ │ │ │ -
32#define DUNE_NO_DEPRECATED_BEGIN ...
│ │ │ │ -
38#define DUNE_NO_DEPRECATED_END ...
│ │ │ │ -
39#else
│ │ │ │ -
40# if defined __clang__
│ │ │ │ -
41# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ -
42 _Pragma("clang diagnostic push") \
│ │ │ │ -
43 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
│ │ │ │ -
44# define DUNE_NO_DEPRECATED_END _Pragma("clang diagnostic pop")
│ │ │ │ -
45# elif defined __INTEL_COMPILER
│ │ │ │ -
46# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ -
47 _Pragma("warning push") \
│ │ │ │ -
48 _Pragma("warning(disable:1478)") \
│ │ │ │ -
49 _Pragma("warning(disable:1786)")
│ │ │ │ -
50# define DUNE_NO_DEPRECATED_END _Pragma("warning pop")
│ │ │ │ -
51# elif defined __GNUC__
│ │ │ │ -
52# define DUNE_NO_DEPRECATED_BEGIN \
│ │ │ │ -
53 _Pragma("GCC diagnostic push") \
│ │ │ │ -
54 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
│ │ │ │ -
55# define DUNE_NO_DEPRECATED_END _Pragma("GCC diagnostic pop")
│ │ │ │ -
56# else
│ │ │ │ -
57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */
│ │ │ │ -
58# define DUNE_NO_DEPRECATED_END /* Noop. */
│ │ │ │ -
59# endif
│ │ │ │ -
60#endif
│ │ │ │ -
61
│ │ │ │ -
63
│ │ │ │ -
64#endif
│ │ │ │ +
8// check whether c++20 concept can be used
│ │ │ │ +
9#if __has_include(<version>) && __has_include(<concepts>)
│ │ │ │ +
10 #include <version>
│ │ │ │ +
11 #if __cpp_concepts >= 201907L && __cpp_lib_concepts >= 202002L
│ │ │ │ +
12 #ifndef DUNE_ENABLE_CONCEPTS
│ │ │ │ +
13 #define DUNE_ENABLE_CONCEPTS 1
│ │ │ │ +
14 #endif
│ │ │ │ +
15 #endif
│ │ │ │ +
16#endif
│ │ │ │ +
17
│ │ │ │ +
18#if DUNE_ENABLE_CONCEPTS
│ │ │ │ +
19
│ │ │ │ + │ │ │ │ + │ │ │ │ +
22
│ │ │ │ +
23#endif // DUNE_ENABLE_CONCEPTS
│ │ │ │ +
24
│ │ │ │ +
25#endif // DUNE_COMMON_CONCEPTS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,46 +1,38 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -deprecated.hh │ │ │ │ │ +concepts.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ +1// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ -4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_DEPRECATED_HH │ │ │ │ │ -6#define DUNE_DEPRECATED_HH │ │ │ │ │ +2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +5#ifndef DUNE_COMMON_CONCEPTS_HH │ │ │ │ │ +6#define DUNE_COMMON_CONCEPTS_HH │ │ │ │ │ 7 │ │ │ │ │ -14#ifdef DOXYGEN │ │ │ │ │ -_3_2#define DUNE_NO_DEPRECATED_BEGIN ... │ │ │ │ │ -_3_8#define DUNE_NO_DEPRECATED_END ... │ │ │ │ │ -39#else │ │ │ │ │ -40# if defined __clang__ │ │ │ │ │ -41# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ -42 _Pragma("clang diagnostic push") \ │ │ │ │ │ -43 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") │ │ │ │ │ -44# define DUNE_NO_DEPRECATED_END _Pragma("clang diagnostic pop") │ │ │ │ │ -45# elif defined __INTEL_COMPILER │ │ │ │ │ -46# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ -47 _Pragma("warning push") \ │ │ │ │ │ -48 _Pragma("warning(disable:1478)") \ │ │ │ │ │ -49 _Pragma("warning(disable:1786)") │ │ │ │ │ -50# define DUNE_NO_DEPRECATED_END _Pragma("warning pop") │ │ │ │ │ -51# elif defined __GNUC__ │ │ │ │ │ -52# define DUNE_NO_DEPRECATED_BEGIN \ │ │ │ │ │ -53 _Pragma("GCC diagnostic push") \ │ │ │ │ │ -54 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") │ │ │ │ │ -55# define DUNE_NO_DEPRECATED_END _Pragma("GCC diagnostic pop") │ │ │ │ │ -56# else │ │ │ │ │ -57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */ │ │ │ │ │ -58# define DUNE_NO_DEPRECATED_END /* Noop. */ │ │ │ │ │ -59# endif │ │ │ │ │ -60#endif │ │ │ │ │ -61 │ │ │ │ │ -63 │ │ │ │ │ -64#endif │ │ │ │ │ +8// check whether c++20 concept can be used │ │ │ │ │ +9#if __has_include() && __has_include() │ │ │ │ │ +10 #include │ │ │ │ │ +11 #if __cpp_concepts >= 201907L && __cpp_lib_concepts >= 202002L │ │ │ │ │ +12 #ifndef DUNE_ENABLE_CONCEPTS │ │ │ │ │ +13 #define DUNE_ENABLE_CONCEPTS 1 │ │ │ │ │ +14 #endif │ │ │ │ │ +15 #endif │ │ │ │ │ +16#endif │ │ │ │ │ +17 │ │ │ │ │ +18#if DUNE_ENABLE_CONCEPTS │ │ │ │ │ +19 │ │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_c_e_p_t_s_/_c_o_n_t_a_i_n_e_r_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_o_n_c_e_p_t_s_/_h_a_s_h_a_b_l_e_._h_h> │ │ │ │ │ +22 │ │ │ │ │ +23#endif // DUNE_ENABLE_CONCEPTS │ │ │ │ │ +24 │ │ │ │ │ +25#endif // DUNE_COMMON_CONCEPTS_HH │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_._h_h │ │ │ │ │ +_h_a_s_h_a_b_l_e_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: iteratorfacades.hh File Reference │ │ │ │ +dune-common: quadmath.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,140 +69,19 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
iteratorfacades.hh File Reference
│ │ │ │ +
quadmath.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

│ │ │ │ -
#include <iterator>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -
│ │ │ │

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...
 
class  Dune::ProxyArrowResult< ProxyType >
 Helper to mimic a pointer for proxy objects. More...
 
struct  Dune::IteratorFacadeAccess
 This class encapsulates access of IteratorFacade. More...
 
class  Dune::IteratorFacade< It, C, V, R, P, D >
 CRTP-Mixing class for stl conformant iterators of given iterator category. 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.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 >
constexpr auto Dune::operator== (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Equality comparison for IteratorFacade.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 , std::enable_if_t< Dune::models< Impl::Concepts::IterEqualsOp, T1, T2 >(), int > = 0>
constexpr bool Dune::operator!= (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Inequality comparison for IteratorFacade.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D >
constexpr auto Dune::operator- (const IteratorFacade< T1, C, V1, R1, P1, D > &it1, const IteratorFacade< T2, C, V2, R2, P2, D > &it2)
 Difference for two IteratorFacade objects.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 , std::enable_if_t< Dune::models< Impl::Concepts::IterDistanceOp< D1 >, T1, T2 >(), int > = 0>
constexpr bool Dune::operator< (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Comparison for IteratorFacade.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 , std::enable_if_t< Dune::models< Impl::Concepts::IterDistanceOp< D1 >, T1, T2 >(), int > = 0>
constexpr bool Dune::operator<= (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Comparison for IteratorFacade.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 , std::enable_if_t< Dune::models< Impl::Concepts::IterDistanceOp< D1 >, T1, T2 >(), int > = 0>
constexpr bool Dune::operator> (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Comparison for IteratorFacade.
 
template<class T1 , class T2 , class C , class V1 , class V2 , class R1 , class R2 , class P1 , class P2 , class D1 , class D2 , std::enable_if_t< Dune::models< Impl::Concepts::IterDistanceOp< D1 >, T1, T2 >(), int > = 0>
constexpr bool Dune::operator>= (const IteratorFacade< T1, C, V1, R1, P1, D1 > &it1, const IteratorFacade< T2, C, V2, R2, P2, D2 > &it2)
 Comparison for IteratorFacade.
 
│ │ │ │ -

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,219 +1,10 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -iteratorfacades.hh File Reference │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. _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_/_c_o_n_c_e_p_t_._h_h> │ │ │ │ │ +quadmath.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_:_:_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_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t_<_ _P_r_o_x_y_T_y_p_e_ _> │ │ │ │ │ -  Helper to mimic a pointer for proxy objects. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_A_c_c_e_s_s │ │ │ │ │ -  This class encapsulates access of _I_t_e_r_a_t_o_r_F_a_c_a_d_e. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_ _I_t_,_ _C_,_ _V_,_ _R_,_ _P_,_ _D_ _> │ │ │ │ │ -  CRTP-Mixing class for stl conformant iterators of given iterator │ │ │ │ │ - category. _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. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_=_= (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Equality comparison for _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -template(), int > = 0> │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_!_= (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Inequality comparison for │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_- (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D > │ │ │ │ │ - &it2) │ │ │ │ │ -  Difference for two _I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ - objects. │ │ │ │ │ -  │ │ │ │ │ -template, T1, T2 >(), int > = 0> │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_< (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Comparison for _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -template, T1, T2 >(), int > = 0> │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_= (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Comparison for _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -template, T1, T2 >(), int > = 0> │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_> (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Comparison for _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -template, T1, T2 >(), int > = 0> │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_>_= (const _I_t_e_r_a_t_o_r_F_a_c_a_d_e< │ │ │ │ │ - T1, C, V1, R1, P1, D1 > &it1, const │ │ │ │ │ - _I_t_e_r_a_t_o_r_F_a_c_a_d_e< T2, C, V2, R2, P2, D2 > │ │ │ │ │ - &it2) │ │ │ │ │ -  Comparison for _I_t_e_r_a_t_o_r_F_a_c_a_d_e. │ │ │ │ │ -  │ │ │ │ │ -********** 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/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorfacades.hh Source File │ │ │ │ +dune-common: quadmath.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,983 +74,490 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
iteratorfacades.hh
│ │ │ │ +
quadmath.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_ITERATORFACADES_HH
│ │ │ │ -
6#define DUNE_ITERATORFACADES_HH
│ │ │ │ +
5#ifndef DUNE_QUADMATH_HH
│ │ │ │ +
6#define DUNE_QUADMATH_HH
│ │ │ │
7
│ │ │ │ -
8#include <iterator>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ +
8#if HAVE_QUADMATH
│ │ │ │ +
9#include <quadmath.h>
│ │ │ │
10
│ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14namespace Dune
│ │ │ │ -
15{
│ │ │ │ -
140 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143
│ │ │ │ -
144 public:
│ │ │ │ -
145 /* type aliases required by C++ for iterators */
│ │ │ │ -
146 using iterator_category = std::forward_iterator_tag;
│ │ │ │ -
147 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
149 using pointer = V*;
│ │ │ │ -
150 using reference = R;
│ │ │ │ -
151
│ │ │ │ -
176 typedef T DerivedType;
│ │ │ │ -
177
│ │ │ │ -
181 typedef V Value;
│ │ │ │ -
182
│ │ │ │ -
186 typedef V* Pointer;
│ │ │ │ -
187
│ │ │ │ -
191 typedef D DifferenceType;
│ │ │ │ -
192
│ │ │ │ -
196 typedef R Reference;
│ │ │ │ -
197
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
200 {
│ │ │ │ -
201 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ +
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;
│ │ │ │ +
44
│ │ │ │ +
45 public:
│ │ │ │ +
46 constexpr Float128() = default;
│ │ │ │ +
47 constexpr Float128(const float128_t& value) noexcept
│ │ │ │ +
48 : value_(value)
│ │ │ │ +
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_; }
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
205 {
│ │ │ │ -
206 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
211 {
│ │ │ │ -
212 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
213 return *static_cast<DerivedType *>(this);
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ -
219 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
220 this->operator++();
│ │ │ │ -
221 return tmp;
│ │ │ │ -
222 }
│ │ │ │ -
│ │ │ │ -
223 };
│ │ │ │ -
│ │ │ │ -
224
│ │ │ │ -
235 template<class T1, class V1, class R1, class D,
│ │ │ │ -
236 class T2, class V2, class R2>
│ │ │ │ -
237 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
240 {
│ │ │ │ -
241 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
242 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
243 else
│ │ │ │ -
244 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
245 }
│ │ │ │ -
│ │ │ │ -
246
│ │ │ │ -
257 template<class T1, class V1, class R1, class D,
│ │ │ │ -
258 class T2, class V2, class R2>
│ │ │ │ -
259 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
262 {
│ │ │ │ -
263 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
264 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
265 else
│ │ │ │ -
266 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
267 }
│ │ │ │ -
│ │ │ │ -
268
│ │ │ │ -
273 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
275 {
│ │ │ │ +
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 public:
│ │ │ │ -
278 /* type aliases required by C++ for iterators */
│ │ │ │ -
279 using iterator_category = std::bidirectional_iterator_tag;
│ │ │ │ -
280 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
282 using pointer = V*;
│ │ │ │ -
283 using reference = R;
│ │ │ │ -
284
│ │ │ │ -
310 typedef T DerivedType;
│ │ │ │ -
311
│ │ │ │ -
315 typedef V Value;
│ │ │ │ -
316
│ │ │ │ -
320 typedef V* Pointer;
│ │ │ │ -
321
│ │ │ │ -
325 typedef D DifferenceType;
│ │ │ │ -
326
│ │ │ │ -
330 typedef R Reference;
│ │ │ │ -
331
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
334 {
│ │ │ │ -
335 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
339 {
│ │ │ │ -
340 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ +
338 inline Float128 scalbln(const Float128& u, long int e)
│ │ │ │ +
339 {
│ │ │ │ +
340 return Float128{scalblnq(float128_t(u), e)};
│ │ │ │
341 }
│ │ │ │ -
│ │ │ │
342
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
345 {
│ │ │ │ -
346 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
347 return *static_cast<DerivedType *>(this);
│ │ │ │ -
348 }
│ │ │ │ -
│ │ │ │ -
349
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
352 {
│ │ │ │ -
353 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
354 this->operator++();
│ │ │ │ -
355 return tmp;
│ │ │ │ -
356 }
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
358
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
361 {
│ │ │ │ -
362 static_cast<DerivedType *>(this)->decrement();
│ │ │ │ -
363 return *static_cast<DerivedType *>(this);
│ │ │ │ -
364 }
│ │ │ │ -
│ │ │ │ -
365
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
368 {
│ │ │ │ -
369 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
370 this->operator--();
│ │ │ │ -
371 return tmp;
│ │ │ │ -
372 }
│ │ │ │ -
│ │ │ │ -
373 };
│ │ │ │ -
│ │ │ │ -
374
│ │ │ │ -
382 template<class T1, class V1, class R1, class D,
│ │ │ │ -
383 class T2, class V2, class R2>
│ │ │ │ -
384 inline typename std::enable_if<std::is_convertible<T2,T1>::value,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
387 {
│ │ │ │ -
388 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
389 }
│ │ │ │ -
│ │ │ │ -
390
│ │ │ │ -
399 template<class T1, class V1, class R1, class D,
│ │ │ │ -
400 class T2, class V2, class R2>
│ │ │ │ -
401 inline
│ │ │ │ -
402 typename std::enable_if<std::is_convertible<T1,T2>::value && !std::is_convertible<T2,T1>::value,
│ │ │ │ -
403 bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
406 {
│ │ │ │ -
407 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
408 }
│ │ │ │ -
│ │ │ │ -
409
│ │ │ │ -
420 template<class T1, class V1, class R1, class D,
│ │ │ │ -
421 class T2, class V2, class R2>
│ │ │ │ -
422 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
425 {
│ │ │ │ -
426 return !(lhs == rhs);
│ │ │ │ -
427 }
│ │ │ │ -
│ │ │ │ -
428
│ │ │ │ -
433 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
435 {
│ │ │ │ -
436
│ │ │ │ -
437 public:
│ │ │ │ -
438 /* type aliases required by C++ for iterators */
│ │ │ │ -
439 using iterator_category = std::random_access_iterator_tag;
│ │ │ │ -
440 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
442 using pointer = V*;
│ │ │ │ -
443 using reference = R;
│ │ │ │ -
444
│ │ │ │ -
478 typedef T DerivedType;
│ │ │ │ -
479
│ │ │ │ -
483 typedef V Value;
│ │ │ │ -
484
│ │ │ │ -
488 typedef V* Pointer;
│ │ │ │ -
489
│ │ │ │ -
493 typedef D DifferenceType;
│ │ │ │ -
494
│ │ │ │ -
498 typedef R Reference;
│ │ │ │ -
499
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
502 {
│ │ │ │ -
503 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ -
504 }
│ │ │ │ -
│ │ │ │ -
505
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
507 {
│ │ │ │ -
508 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ -
509 }
│ │ │ │ -
│ │ │ │ -
510
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
517 {
│ │ │ │ -
518 return static_cast<const DerivedType *>(this)->elementAt(n);
│ │ │ │ -
519 }
│ │ │ │ -
│ │ │ │ -
520
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
523 {
│ │ │ │ -
524 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
525 return *static_cast<DerivedType *>(this);
│ │ │ │ -
526 }
│ │ │ │ -
│ │ │ │ -
527
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
530 {
│ │ │ │ -
531 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
532 this->operator++();
│ │ │ │ -
533 return tmp;
│ │ │ │ -
534 }
│ │ │ │ -
│ │ │ │ -
535
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
537 {
│ │ │ │ -
538 static_cast<DerivedType *>(this)->advance(n);
│ │ │ │ -
539 return *static_cast<DerivedType *>(this);
│ │ │ │ -
540 }
│ │ │ │ -
│ │ │ │ -
541
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
543 {
│ │ │ │ -
544 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
545 tmp.advance(n);
│ │ │ │ -
546 return tmp;
│ │ │ │ -
547 }
│ │ │ │ -
│ │ │ │ -
548
│ │ │ │ -
549
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
552 {
│ │ │ │ -
553 static_cast<DerivedType *>(this)->decrement();
│ │ │ │ -
554 return *static_cast<DerivedType *>(this);
│ │ │ │ -
555 }
│ │ │ │ -
│ │ │ │ -
556
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
559 {
│ │ │ │ -
560 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
561 this->operator--();
│ │ │ │ -
562 return tmp;
│ │ │ │ -
563 }
│ │ │ │ -
│ │ │ │ -
564
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
566 {
│ │ │ │ -
567 static_cast<DerivedType *>(this)->advance(-n);
│ │ │ │ -
568 return *static_cast<DerivedType *>(this);
│ │ │ │ -
569 }
│ │ │ │ -
│ │ │ │ -
570
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
572 {
│ │ │ │ -
573 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
574 tmp.advance(-n);
│ │ │ │ -
575 return tmp;
│ │ │ │ -
576 }
│ │ │ │ -
│ │ │ │ -
577
│ │ │ │ -
578
│ │ │ │ -
579 };
│ │ │ │ -
│ │ │ │ -
580
│ │ │ │ -
591 template<class T1, class V1, class R1, class D,
│ │ │ │ -
592 class T2, class V2, class R2>
│ │ │ │ -
593 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
596 {
│ │ │ │ -
597 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
598 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
599 else
│ │ │ │ -
600 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
601 }
│ │ │ │ -
│ │ │ │ -
602
│ │ │ │ -
613 template<class T1, class V1, class R1, class D,
│ │ │ │ -
614 class T2, class V2, class R2>
│ │ │ │ -
615 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
618 {
│ │ │ │ -
619 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
620 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
621 else
│ │ │ │ -
622 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
623 }
│ │ │ │ -
│ │ │ │ -
624
│ │ │ │ -
635 template<class T1, class V1, class R1, class D,
│ │ │ │ -
636 class T2, class V2, class R2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
640 {
│ │ │ │ -
641 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
642 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>0;
│ │ │ │ -
643 else
│ │ │ │ -
644 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<0;
│ │ │ │ -
645 }
│ │ │ │ -
│ │ │ │ -
646
│ │ │ │ -
647
│ │ │ │ -
658 template<class T1, class V1, class R1, class D,
│ │ │ │ -
659 class T2, class V2, class R2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
663 {
│ │ │ │ -
664 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
665 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>=0;
│ │ │ │ -
666 else
│ │ │ │ -
667 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<=0;
│ │ │ │ -
668 }
│ │ │ │ -
│ │ │ │ -
669
│ │ │ │ -
670
│ │ │ │ -
681 template<class T1, class V1, class R1, class D,
│ │ │ │ -
682 class T2, class V2, class R2>
│ │ │ │ -
683 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
686 {
│ │ │ │ -
687 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
688 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<0;
│ │ │ │ -
689 else
│ │ │ │ -
690 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>0;
│ │ │ │ -
691 }
│ │ │ │ -
│ │ │ │ -
692
│ │ │ │ -
703 template<class T1, class V1, class R1, class D,
│ │ │ │ -
704 class T2, class V2, class R2>
│ │ │ │ -
705 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
708 {
│ │ │ │ -
709 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
710 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<=0;
│ │ │ │ -
711 else
│ │ │ │ -
712 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>=0;
│ │ │ │ -
713 }
│ │ │ │ -
│ │ │ │ -
714
│ │ │ │ -
725 template<class T1, class V1, class R1, class D,
│ │ │ │ -
726 class T2, class V2, class R2>
│ │ │ │ -
727 inline typename EnableIfInterOperable<T1,T2,D>::type
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
730 {
│ │ │ │ -
731 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
732 return -static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs));
│ │ │ │ -
733 else
│ │ │ │ -
734 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs));
│ │ │ │ -
735 }
│ │ │ │ -
│ │ │ │ -
736
│ │ │ │ -
737
│ │ │ │ -
748 template<class ProxyType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
750 {
│ │ │ │ -
751 public:
│ │ │ │ -
│ │ │ │ -
752 constexpr ProxyArrowResult(ProxyType&& p)
│ │ │ │ -
753 noexcept(std::is_nothrow_constructible_v<ProxyType, ProxyType&&>)
│ │ │ │ -
754 : p_(std::move(p))
│ │ │ │ -
755 {}
│ │ │ │ -
│ │ │ │ -
756
│ │ │ │ -
│ │ │ │ -
757 constexpr ProxyArrowResult(const ProxyType& p)
│ │ │ │ -
758 noexcept(std::is_nothrow_constructible_v<ProxyType, const ProxyType&>)
│ │ │ │ -
759 : p_(p)
│ │ │ │ -
760 {}
│ │ │ │ -
│ │ │ │ -
761
│ │ │ │ -
│ │ │ │ -
762 constexpr const ProxyType* operator->() const noexcept
│ │ │ │ -
763 {
│ │ │ │ -
764 return &p_;
│ │ │ │ -
765 }
│ │ │ │ -
│ │ │ │ -
766
│ │ │ │ -
│ │ │ │ -
767 constexpr ProxyType* operator->() noexcept
│ │ │ │ -
768 {
│ │ │ │ -
769 return &p_;
│ │ │ │ -
770 }
│ │ │ │ -
│ │ │ │ -
771
│ │ │ │ -
772 private:
│ │ │ │ -
773 ProxyType p_;
│ │ │ │ -
774 };
│ │ │ │ -
│ │ │ │ -
775
│ │ │ │ -
776
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
786 {
│ │ │ │ -
787
│ │ │ │ -
789 template<class It>
│ │ │ │ -
790 static constexpr auto baseIterator(It&& it) noexcept
│ │ │ │ -
791 -> decltype(it.baseIterator())
│ │ │ │ -
792 {
│ │ │ │ -
793 return it.baseIterator();
│ │ │ │ -
794 }
│ │ │ │ -
795
│ │ │ │ -
797 template<class It>
│ │ │ │ -
798 static constexpr auto derived(It&& it) noexcept
│ │ │ │ -
799 -> decltype(it.derived())
│ │ │ │ -
800 {
│ │ │ │ -
801 return it.derived();
│ │ │ │ -
802 }
│ │ │ │ -
803
│ │ │ │ -
804 };
│ │ │ │ -
│ │ │ │ -
805
│ │ │ │ -
806
│ │ │ │ -
807
│ │ │ │ -
808 namespace Impl::Concepts {
│ │ │ │ -
809
│ │ │ │ -
810 using namespace Dune::Concept;
│ │ │ │ -
811
│ │ │ │ -
812 template<class R>
│ │ │ │ -
813 struct BaseIterDereferenceOp
│ │ │ │ -
814 {
│ │ │ │ -
815 template<class It>
│ │ │ │ -
816 auto require(const It& it) -> decltype(
│ │ │ │ -
817 *(IteratorFacadeAccess::baseIterator(it)),
│ │ │ │ -
818 requireConvertible<decltype(*(IteratorFacadeAccess::baseIterator(it))), R>()
│ │ │ │ -
819 );
│ │ │ │ -
820 };
│ │ │ │ -
821
│ │ │ │ -
822 struct IterEqualsOp
│ │ │ │ -
823 {
│ │ │ │ -
824 template<class It1, class It2>
│ │ │ │ -
825 auto require(const It1& it1, const It2& it2) -> decltype(
│ │ │ │ -
826 requireConvertible<bool>(it1 == it2)
│ │ │ │ -
827 );
│ │ │ │ -
828 };
│ │ │ │ -
829
│ │ │ │ -
830 struct BaseIterEqualsOp
│ │ │ │ -
831 {
│ │ │ │ -
832 template<class It1, class It2>
│ │ │ │ -
833 auto require(const It1& it1, const It2& it2) -> decltype(
│ │ │ │ -
834 Dune::Concept::requireConvertible<bool>(IteratorFacadeAccess::baseIterator(it1) == IteratorFacadeAccess::baseIterator(it2))
│ │ │ │ -
835 );
│ │ │ │ -
836 };
│ │ │ │ -
837
│ │ │ │ -
838 struct BaseIterIncrementOp
│ │ │ │ -
839 {
│ │ │ │ -
840 template<class It>
│ │ │ │ -
841 auto require(It it) -> decltype(
│ │ │ │ -
842 ++(IteratorFacadeAccess::baseIterator(it))
│ │ │ │ -
843 );
│ │ │ │ -
844 };
│ │ │ │ -
845
│ │ │ │ -
846 struct BaseIterDecrementOp
│ │ │ │ -
847 {
│ │ │ │ -
848 template<class It>
│ │ │ │ -
849 auto require(It it) -> decltype(
│ │ │ │ -
850 --(IteratorFacadeAccess::baseIterator(it))
│ │ │ │ -
851 );
│ │ │ │ -
852 };
│ │ │ │ -
853
│ │ │ │ -
854 template<class D>
│ │ │ │ -
855 struct IterAdvanceOp
│ │ │ │ -
856 {
│ │ │ │ -
857 template<class It>
│ │ │ │ -
858 auto require(It it) -> decltype(
│ │ │ │ -
859 it += std::declval<D>()
│ │ │ │ -
860 );
│ │ │ │ -
861 };
│ │ │ │ -
862
│ │ │ │ -
863 template<class D>
│ │ │ │ -
864 struct BaseIterAdvanceOp
│ │ │ │ -
865 {
│ │ │ │ -
866 template<class It>
│ │ │ │ -
867 auto require(It it) -> decltype(
│ │ │ │ -
868 IteratorFacadeAccess::baseIterator(it) += std::declval<D>()
│ │ │ │ -
869 );
│ │ │ │ -
870 };
│ │ │ │ -
871
│ │ │ │ -
872 template<class D>
│ │ │ │ -
873 struct IterDistanceOp
│ │ │ │ -
874 {
│ │ │ │ -
875 template<class It1, class It2>
│ │ │ │ -
876 auto require(const It1& it1, const It2& it2) -> decltype(
│ │ │ │ -
877 Dune::Concept::requireConvertible<D>(it1 - it2)
│ │ │ │ -
878 );
│ │ │ │ -
879 };
│ │ │ │ -
880
│ │ │ │ -
881 template<class D>
│ │ │ │ -
882 struct BaseIterDistanceOp
│ │ │ │ -
883 {
│ │ │ │ -
884 template<class It1, class It2>
│ │ │ │ -
885 auto require(const It1& it1, const It2& it2) -> decltype(
│ │ │ │ -
886 Dune::Concept::requireConvertible<D>(IteratorFacadeAccess::baseIterator(it1) - IteratorFacadeAccess::baseIterator(it2))
│ │ │ │ -
887 );
│ │ │ │ -
888 };
│ │ │ │ -
889
│ │ │ │ -
890 } // namespace Impl::Concept
│ │ │ │ -
891
│ │ │ │ -
892
│ │ │ │ -
893
│ │ │ │ -
1051 template<class It, class C, class V, class R = V&, class P = V*, class D = std::ptrdiff_t>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1053 {
│ │ │ │ -
1054 static constexpr bool isBidirectional = std::is_convertible_v<C, std::bidirectional_iterator_tag>;
│ │ │ │ -
1055 static constexpr bool isRandomAccess = std::is_convertible_v<C, std::random_access_iterator_tag>;
│ │ │ │ -
1056
│ │ │ │ -
1057 // We make IteratorFacadeAccess a friend to allow forwarding of the derived()
│ │ │ │ -
1058 // methods to the free operators instead of havin to do raw casts there.
│ │ │ │ -
1059 // This allows to encapsulate all casts within IteratorFacade itself.
│ │ │ │ -
1060 friend IteratorFacadeAccess;
│ │ │ │ -
1061
│ │ │ │ -
1062 protected:
│ │ │ │ -
1063
│ │ │ │ - │ │ │ │ -
1066
│ │ │ │ -
│ │ │ │ -
1068 constexpr const DerivedIterator& derived() const
│ │ │ │ -
1069 {
│ │ │ │ -
1070 return static_cast<const DerivedIterator&>(*this);
│ │ │ │ -
1071 }
│ │ │ │ -
│ │ │ │ -
1072
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1075 {
│ │ │ │ -
1076 return static_cast<DerivedIterator&>(*this);
│ │ │ │ -
1077 }
│ │ │ │ -
│ │ │ │ -
1078
│ │ │ │ -
1079 public:
│ │ │ │ -
1080
│ │ │ │ -
1081 // Standard types of of C++ iterators
│ │ │ │ - │ │ │ │ -
1083 using value_type = typename std::remove_const<V>::type;
│ │ │ │ -
1084 using reference = R;
│ │ │ │ -
1085 using pointer = P;
│ │ │ │ - │ │ │ │ -
1087
│ │ │ │ -
1088 // Corresponding Dune typedefs
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
1093
│ │ │ │ -
1094 // Only defined to do static assertions.
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1096 {
│ │ │ │ -
1097 static_assert(std::is_signed_v<difference_type>,
│ │ │ │ -
1098 "Type used as difference_type must be signed");
│ │ │ │ -
1099 const DerivedIterator& constDerived = derived();
│ │ │ │ -
1100 static_assert(std::is_convertible_v<decltype(*constDerived), reference>,
│ │ │ │ -
1101 "Derived class does not implement `*it` or `*(it.baseIterator())` for const `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1102 static_assert(std::is_convertible_v<decltype(++derived()), DerivedIterator&>,
│ │ │ │ -
1103 "Derived class does not implement `++it`, `++(it.baseIterator())`, or `it+=1` for mutable `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1104 static_assert(std::is_convertible_v<decltype(constDerived==constDerived), bool>,
│ │ │ │ -
1105 "Derived class does not implement `it1==it2` or `it1.baseIterator()==it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1106 if constexpr (isBidirectional)
│ │ │ │ -
1107 static_assert(std::is_convertible_v<decltype(--derived()), DerivedIterator&>,
│ │ │ │ -
1108 "Derived class does not implement `--it`, `--(it.baseIterator())`, or `it-=1` for mutable `it` required by IteratorFacade<..., std::bidirectional_iterator_tag, ...>.");
│ │ │ │ -
1109 if constexpr (isRandomAccess)
│ │ │ │ -
1110 {
│ │ │ │ -
1111 static_assert(std::is_convertible_v<decltype(derived()+=std::declval<difference_type>()), DerivedIterator&>,
│ │ │ │ -
1112 "Derived class does not implement `it+=` or `it.baseIterator()+=` for mutable `it` required by IteratorFacade<..., std::random_access_iterator_tag, ...>.");
│ │ │ │ -
1113 static_assert(std::is_convertible_v<decltype(constDerived-constDerived), difference_type>,
│ │ │ │ -
1114 "Derived class does not implement `it1-it2` or `it1.baseIterator()-it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., std::random_access_iterator_tag, ...>.");
│ │ │ │ -
1115 }
│ │ │ │ -
1116 }
│ │ │ │ -
│ │ │ │ -
1117
│ │ │ │ -
│ │ │ │ -
1119 constexpr decltype(auto) operator*() const
│ │ │ │ -
1120 {
│ │ │ │ -
1121 if constexpr (Dune::models<Impl::Concepts::BaseIterDereferenceOp<reference>, DerivedIterator>())
│ │ │ │ -
1122 return *(IteratorFacadeAccess::baseIterator(derived()));
│ │ │ │ -
1123 else
│ │ │ │ -
1124 static_assert(AlwaysFalse<It>::value,
│ │ │ │ -
1125 "Derived class does not implement `*it` or `*(it.baseIterator())` for const `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1126 }
│ │ │ │ -
│ │ │ │ -
1127
│ │ │ │ -
│ │ │ │ -
1129 constexpr pointer operator->() const
│ │ │ │ -
1130 {
│ │ │ │ -
1131 if constexpr (std::is_pointer_v<pointer>)
│ │ │ │ -
1132 return std::addressof(*derived());
│ │ │ │ -
1133 else
│ │ │ │ -
1134 return pointer(*derived());
│ │ │ │ -
1135 }
│ │ │ │ -
│ │ │ │ -
1136
│ │ │ │ -
│ │ │ │ -
1138 constexpr decltype(auto) operator++()
│ │ │ │ -
1139 {
│ │ │ │ -
1140 if constexpr (Dune::models<Impl::Concepts::BaseIterIncrementOp, DerivedIterator>())
│ │ │ │ -
1141 {
│ │ │ │ -
1142 ++(IteratorFacadeAccess::baseIterator(derived()));
│ │ │ │ -
1143 return derived();
│ │ │ │ -
1144 }
│ │ │ │ -
1145 else if constexpr (Dune::models<Impl::Concepts::IterAdvanceOp<difference_type>, DerivedIterator>())
│ │ │ │ -
1146 {
│ │ │ │ -
1147 derived() += 1;
│ │ │ │ -
1148 return derived();
│ │ │ │ -
1149 }
│ │ │ │ -
1150 else
│ │ │ │ -
1151 static_assert(AlwaysFalse<It>::value,
│ │ │ │ -
1152 "Derived class does not implement `++it`, `++(it.baseIterator())`, or `it+=1` for mutable `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1153 }
│ │ │ │ -
│ │ │ │ -
1154
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1157 {
│ │ │ │ -
1158 DerivedIterator tmp(derived());
│ │ │ │ -
1159 this->operator++();
│ │ │ │ -
1160 return tmp;
│ │ │ │ -
1161 }
│ │ │ │ -
│ │ │ │ -
1162
│ │ │ │ -
1168 template<bool dummy=true, std::enable_if_t<isBidirectional and dummy, int> =0>
│ │ │ │ -
│ │ │ │ -
1169 constexpr decltype(auto) operator--()
│ │ │ │ -
1170 {
│ │ │ │ -
1171 if constexpr (Dune::models<Impl::Concepts::BaseIterDecrementOp, DerivedIterator>())
│ │ │ │ -
1172 {
│ │ │ │ -
1173 --(IteratorFacadeAccess::baseIterator(derived()));
│ │ │ │ -
1174 return derived();
│ │ │ │ -
1175 }
│ │ │ │ -
1176 else if constexpr (Dune::models<Impl::Concepts::IterAdvanceOp<difference_type>, DerivedIterator>())
│ │ │ │ -
1177 {
│ │ │ │ -
1178 derived() -= 1;
│ │ │ │ -
1179 return derived();
│ │ │ │ -
1180 }
│ │ │ │ -
1181 else
│ │ │ │ -
1182 static_assert(AlwaysFalse<It>::value,
│ │ │ │ -
1183 "Derived class does not implement `--it`, `--(it.baseIterator())`, or `it-=1` for mutable `it` required by IteratorFacade<..., std::bidirectional_iterator_tag, ...>.");
│ │ │ │ -
1184 }
│ │ │ │ -
│ │ │ │ -
1185
│ │ │ │ -
1191 template<bool dummy=true, std::enable_if_t<isBidirectional and dummy, int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1193 {
│ │ │ │ -
1194 DerivedIterator tmp(derived());
│ │ │ │ -
1195 this->operator--();
│ │ │ │ -
1196 return tmp;
│ │ │ │ -
1197 }
│ │ │ │ -
│ │ │ │ -
1198
│ │ │ │ -
1206 template<bool dummy=true, std::enable_if_t<isRandomAccess and dummy, int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1208 {
│ │ │ │ -
1209 return *(derived()+n);
│ │ │ │ -
1210 }
│ │ │ │ -
│ │ │ │ -
1211
│ │ │ │ -
1217 template<bool dummy=true, std::enable_if_t<isRandomAccess and dummy, int> =0>
│ │ │ │ -
│ │ │ │ -
1218 constexpr decltype(auto) operator+=(difference_type n)
│ │ │ │ -
1219 {
│ │ │ │ -
1220 if constexpr (Dune::models<Impl::Concepts::BaseIterAdvanceOp<difference_type>, DerivedIterator>())
│ │ │ │ -
1221 {
│ │ │ │ -
1222 IteratorFacadeAccess::baseIterator(derived()) += n;
│ │ │ │ -
1223 return derived();
│ │ │ │ -
1224 }
│ │ │ │ -
1225 else
│ │ │ │ -
1226 static_assert(AlwaysFalse<It>::value,
│ │ │ │ -
1227 "Derived class does not implement `it+=` or `it.baseIterator()+=` for mutable `it` required by IteratorFacade<..., std::random_access_iterator_tag, ...>.");
│ │ │ │ -
1228 }
│ │ │ │ -
│ │ │ │ -
1229
│ │ │ │ -
1235 template<bool dummy=true, std::enable_if_t<isRandomAccess and dummy, int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1237 {
│ │ │ │ -
1238 DerivedIterator tmp(derived());
│ │ │ │ -
1239 tmp += n;
│ │ │ │ -
1240 return tmp;
│ │ │ │ -
1241 }
│ │ │ │ -
│ │ │ │ -
1242
│ │ │ │ -
1248 template<bool dummy=true, std::enable_if_t<isRandomAccess and dummy, int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1250 {
│ │ │ │ -
1251 derived() += (-n);
│ │ │ │ -
1252 return derived();
│ │ │ │ -
1253 }
│ │ │ │ -
│ │ │ │ -
1254
│ │ │ │ -
1260 template<bool dummy=true, std::enable_if_t<isRandomAccess and dummy, int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1262 {
│ │ │ │ -
1263 DerivedIterator tmp(derived());
│ │ │ │ -
1264 tmp -= n;
│ │ │ │ -
1265 return tmp;
│ │ │ │ -
1266 }
│ │ │ │ -
│ │ │ │ -
1267
│ │ │ │ -
1268 };
│ │ │ │ -
│ │ │ │ -
1269
│ │ │ │ -
1270
│ │ │ │ -
1271
│ │ │ │ -
1282 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1284 {
│ │ │ │ -
1285 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1286 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1287 if constexpr (Dune::models<Impl::Concepts::BaseIterEqualsOp, T1, T2>())
│ │ │ │ -
1288 return IteratorFacadeAccess::baseIterator(derivedIt1) == IteratorFacadeAccess::baseIterator(derivedIt2);
│ │ │ │ -
1289 else
│ │ │ │ -
1290 static_assert(AlwaysFalse<T1>::value,
│ │ │ │ -
1291 "Derived class does not implement `it1==it2` or `it1.baseIterator()==it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., std::forward_iterator_tag, ...>.");
│ │ │ │ -
1292 }
│ │ │ │ -
│ │ │ │ -
1293
│ │ │ │ -
1301 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2,
│ │ │ │ -
1302 std::enable_if_t< Dune::models<Impl::Concepts::IterEqualsOp,T1, T2>() , int> =0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1304 {
│ │ │ │ -
1305 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1306 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1307 return not(derivedIt1 == derivedIt2);
│ │ │ │ -
1308 }
│ │ │ │ -
│ │ │ │ -
1309
│ │ │ │ -
1320 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1322 {
│ │ │ │ -
1323 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1324 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1325 if constexpr (Dune::models<Impl::Concepts::BaseIterDistanceOp<D>,T1, T2>())
│ │ │ │ -
1326 return D(IteratorFacadeAccess::baseIterator(derivedIt1) - IteratorFacadeAccess::baseIterator(derivedIt2));
│ │ │ │ -
1327 else
│ │ │ │ -
1328 static_assert(AlwaysFalse<T1>::value,
│ │ │ │ -
1329 "Derived class does not implement `it1-it2` or `it1.baseIterator()-it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., std::random_access_iterator_tag, ...>.");
│ │ │ │ -
1330 }
│ │ │ │ -
│ │ │ │ -
1331
│ │ │ │ -
1339 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2,
│ │ │ │ -
1340 std::enable_if_t< Dune::models<Impl::Concepts::IterDistanceOp<D1>,T1, T2>() , int> =0>
│ │ │ │ -
│ │ │ │ -
1341 constexpr bool operator<(const IteratorFacade<T1,C,V1,R1,P1,D1>& it1, const IteratorFacade<T2,C,V2,R2,P2,D2>& it2)
│ │ │ │ -
1342 {
│ │ │ │ -
1343 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1344 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1345 return (derivedIt1 - derivedIt2) < D1(0);
│ │ │ │ -
1346 }
│ │ │ │ -
│ │ │ │ -
1347
│ │ │ │ -
1355 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2,
│ │ │ │ -
1356 std::enable_if_t< Dune::models<Impl::Concepts::IterDistanceOp<D1>,T1, T2>() , int> =0>
│ │ │ │ -
│ │ │ │ -
1357 constexpr bool operator<=(const IteratorFacade<T1,C,V1,R1,P1,D1>& it1, const IteratorFacade<T2,C,V2,R2,P2,D2>& it2)
│ │ │ │ -
1358 {
│ │ │ │ -
1359 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1360 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1361 return (derivedIt1 - derivedIt2) <= D1(0);
│ │ │ │ -
1362 }
│ │ │ │ -
│ │ │ │ -
1363
│ │ │ │ -
1371 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2,
│ │ │ │ -
1372 std::enable_if_t< Dune::models<Impl::Concepts::IterDistanceOp<D1>,T1, T2>() , int> =0>
│ │ │ │ -
│ │ │ │ -
1373 constexpr bool operator>(const IteratorFacade<T1,C,V1,R1,P1,D1>& it1, const IteratorFacade<T2,C,V2,R2,P2,D2>& it2)
│ │ │ │ -
1374 {
│ │ │ │ -
1375 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1376 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1377 return (derivedIt1 - derivedIt2) > D1(0);
│ │ │ │ -
1378 }
│ │ │ │ -
│ │ │ │ -
1379
│ │ │ │ -
1387 template<class T1, class T2, class C, class V1, class V2, class R1, class R2, class P1, class P2, class D1, class D2,
│ │ │ │ -
1388 std::enable_if_t< Dune::models<Impl::Concepts::IterDistanceOp<D1>,T1, T2>() , int> =0>
│ │ │ │ -
│ │ │ │ -
1389 constexpr bool operator>=(const IteratorFacade<T1,C,V1,R1,P1,D1>& it1, const IteratorFacade<T2,C,V2,R2,P2,D2>& it2)
│ │ │ │ -
1390 {
│ │ │ │ -
1391 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1);
│ │ │ │ -
1392 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2);
│ │ │ │ -
1393 return (derivedIt1 - derivedIt2) >= D1(0);
│ │ │ │ -
1394 }
│ │ │ │ -
│ │ │ │ -
1395
│ │ │ │ -
1396
│ │ │ │ -
1397
│ │ │ │ -
1399}
│ │ │ │ -
1400#endif
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Infrastructure for concepts.
│ │ │ │ +
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
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_BINARY_OP(OP)
Definition debugalign.hh:261
│ │ │ │ +
#define DUNE_UNARY_FUNC(name)
│ │ │ │ +
#define DUNE_ASSIGN_OP(OP)
Definition debugalign.hh:220
│ │ │ │ +
Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
Read a std::tuple.
Definition streamoperators.hh:43
│ │ │ │ +
constexpr auto max
Function object that returns the greater of the given values.
Definition hybridutilities.hh:484
│ │ │ │ +
constexpr auto min
Function object that returns the smaller of the given values.
Definition hybridutilities.hh:506
│ │ │ │ +
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
│ │ │ │ -
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:638
│ │ │ │ -
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:684
│ │ │ │ -
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:661
│ │ │ │ -
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:238
│ │ │ │ -
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:706
│ │ │ │ -
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:260
│ │ │ │ +
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.
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
Namespace for concepts.
Definition concept.hh:34
│ │ │ │ -
constexpr bool requireConvertible()
Definition concept.hh:247
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:142
│ │ │ │ -
std::forward_iterator_tag iterator_category
Definition iteratorfacades.hh:146
│ │ │ │ -
V * pointer
Definition iteratorfacades.hh:149
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:210
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:191
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:196
│ │ │ │ -
Pointer operator->() const
Definition iteratorfacades.hh:204
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:176
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:181
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:147
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:217
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:186
│ │ │ │ -
D difference_type
Definition iteratorfacades.hh:148
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:199
│ │ │ │ -
R reference
Definition iteratorfacades.hh:150
│ │ │ │ -
Facade class for stl conformant bidirectional iterators.
Definition iteratorfacades.hh:275
│ │ │ │ -
V * pointer
Definition iteratorfacades.hh:282
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:280
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:333
│ │ │ │ -
D difference_type
Definition iteratorfacades.hh:281
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:310
│ │ │ │ -
DerivedType & operator--()
Preincrement operator.
Definition iteratorfacades.hh:360
│ │ │ │ -
Pointer operator->() const
Definition iteratorfacades.hh:338
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:344
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:320
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:330
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:351
│ │ │ │ -
std::bidirectional_iterator_tag iterator_category
Definition iteratorfacades.hh:279
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:325
│ │ │ │ -
DerivedType operator--(int)
Postincrement operator.
Definition iteratorfacades.hh:367
│ │ │ │ -
R reference
Definition iteratorfacades.hh:283
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:315
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:435
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:440
│ │ │ │ -
D difference_type
Definition iteratorfacades.hh:441
│ │ │ │ -
DerivedType operator--(int)
Postdecrement operator.
Definition iteratorfacades.hh:558
│ │ │ │ -
V * pointer
Definition iteratorfacades.hh:442
│ │ │ │ -
std::random_access_iterator_tag iterator_category
Definition iteratorfacades.hh:439
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:501
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:522
│ │ │ │ -
R reference
Definition iteratorfacades.hh:443
│ │ │ │ -
Pointer operator->() const
Definition iteratorfacades.hh:506
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:493
│ │ │ │ -
DerivedType & operator--()
Predecrement operator.
Definition iteratorfacades.hh:551
│ │ │ │ -
DerivedType & operator-=(DifferenceType n)
Definition iteratorfacades.hh:565
│ │ │ │ -
DerivedType operator+(DifferenceType n) const
Definition iteratorfacades.hh:542
│ │ │ │ -
Reference operator[](DifferenceType n) const
Get the element n positions from the current one.
Definition iteratorfacades.hh:516
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:478
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:488
│ │ │ │ -
DerivedType operator-(DifferenceType n) const
Definition iteratorfacades.hh:571
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:529
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:483
│ │ │ │ -
DerivedType & operator+=(DifferenceType n)
Definition iteratorfacades.hh:536
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:498
│ │ │ │ -
Helper to mimic a pointer for proxy objects.
Definition iteratorfacades.hh:750
│ │ │ │ -
constexpr ProxyArrowResult(const ProxyType &p) noexcept(std::is_nothrow_constructible_v< ProxyType, const ProxyType & >)
Definition iteratorfacades.hh:757
│ │ │ │ -
constexpr ProxyType * operator->() noexcept
Definition iteratorfacades.hh:767
│ │ │ │ -
constexpr const ProxyType * operator->() const noexcept
Definition iteratorfacades.hh:762
│ │ │ │ -
constexpr ProxyArrowResult(ProxyType &&p) noexcept(std::is_nothrow_constructible_v< ProxyType, ProxyType && >)
Definition iteratorfacades.hh:752
│ │ │ │ -
This class encapsulates access of IteratorFacade.
Definition iteratorfacades.hh:786
│ │ │ │ -
CRTP-Mixing class for stl conformant iterators of given iterator category.
Definition iteratorfacades.hh:1053
│ │ │ │ -
constexpr DerivedIterator operator--(int)
Postdecrement operator.
Definition iteratorfacades.hh:1192
│ │ │ │ -
D difference_type
Definition iteratorfacades.hh:1086
│ │ │ │ -
C iterator_category
Definition iteratorfacades.hh:1082
│ │ │ │ -
IteratorFacade()
Definition iteratorfacades.hh:1095
│ │ │ │ -
constexpr pointer operator->() const
Arrow access to members of referenced value.
Definition iteratorfacades.hh:1129
│ │ │ │ -
pointer Pointer
Definition iteratorfacades.hh:1091
│ │ │ │ -
reference Reference
Definition iteratorfacades.hh:1090
│ │ │ │ -
constexpr DerivedIterator operator+(difference_type n) const
Create iterator incremented by given value.
Definition iteratorfacades.hh:1236
│ │ │ │ -
constexpr DerivedIterator operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:1156
│ │ │ │ -
constexpr DerivedIterator & derived()
Cast of *this to DerivedIterator type.
Definition iteratorfacades.hh:1074
│ │ │ │ -
It DerivedIterator
The derived iterator type.
Definition iteratorfacades.hh:1065
│ │ │ │ -
constexpr DerivedIterator & operator-=(difference_type n)
Decrement iterator by given value.
Definition iteratorfacades.hh:1249
│ │ │ │ -
constexpr decltype(auto) operator--()
Predecrement operator.
Definition iteratorfacades.hh:1169
│ │ │ │ -
R reference
Definition iteratorfacades.hh:1084
│ │ │ │ -
constexpr reference operator[](difference_type n) const
Dereference element with given offset form this iterator.
Definition iteratorfacades.hh:1207
│ │ │ │ -
constexpr const DerivedIterator & derived() const
Cast of *this to const DerivedIterator type.
Definition iteratorfacades.hh:1068
│ │ │ │ -
P pointer
Definition iteratorfacades.hh:1085
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:1083
│ │ │ │ -
value_type Value
Definition iteratorfacades.hh:1089
│ │ │ │ -
constexpr decltype(auto) operator++()
Preincrement operator.
Definition iteratorfacades.hh:1138
│ │ │ │ -
difference_type DifferenceType
Definition iteratorfacades.hh:1092
│ │ │ │ -
constexpr DerivedIterator operator-(difference_type n) const
Create iterator decremented by given value.
Definition iteratorfacades.hh:1261
│ │ │ │ -
Enable typedef if two types are interoperable.
Definition typetraits.hh:81
│ │ │ │ -
template which always yields a false value
Definition typetraits.hh:124
│ │ │ │ +
T max_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:494
│ │ │ │ +
T min_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:500
│ │ │ │ +
Default exception class for range errors.
Definition exceptions.hh:254
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1183 +1,527 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -iteratorfacades.hh │ │ │ │ │ +quadmath.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5#ifndef DUNE_ITERATORFACADES_HH │ │ │ │ │ -6#define DUNE_ITERATORFACADES_HH │ │ │ │ │ +5#ifndef DUNE_QUADMATH_HH │ │ │ │ │ +6#define DUNE_QUADMATH_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ +8#if HAVE_QUADMATH │ │ │ │ │ +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_/_c_o_n_c_e_p_t_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14namespace _D_u_n_e │ │ │ │ │ -15{ │ │ │ │ │ -140 template │ │ │ │ │ -_1_4_1 class _F_o_r_w_a_r_d_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -142 { │ │ │ │ │ -143 │ │ │ │ │ -144 public: │ │ │ │ │ -145 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_1_4_6 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::forward_iterator_tag; │ │ │ │ │ -_1_4_7 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_1_4_8 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_1_4_9 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_1_5_0 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -151 │ │ │ │ │ -_1_7_6 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -177 │ │ │ │ │ -_1_8_1 typedef V _V_a_l_u_e; │ │ │ │ │ -182 │ │ │ │ │ -_1_8_6 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -187 │ │ │ │ │ -_1_9_1 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -192 │ │ │ │ │ -_1_9_6 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -197 │ │ │ │ │ -_1_9_9 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ -200 { │ │ │ │ │ -201 return static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ -202 } │ │ │ │ │ +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; │ │ │ │ │ +44 │ │ │ │ │ +45 public: │ │ │ │ │ +46 constexpr Float128() = default; │ │ │ │ │ +47 constexpr Float128(const float128_t& value) noexcept │ │ │ │ │ +48 : value_(value) │ │ │ │ │ +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_; } │ │ │ │ │ +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 │ │ │ │ │ -_2_0_4 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -205 { │ │ │ │ │ -206 return &(static_cast(this)->dereference()); │ │ │ │ │ -207 } │ │ │ │ │ -208 │ │ │ │ │ -_2_1_0 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -211 { │ │ │ │ │ -212 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -213 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -_2_1_7 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -218 { │ │ │ │ │ -219 _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)); │ │ │ │ │ -220 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -221 return tmp; │ │ │ │ │ -222 } │ │ │ │ │ -223 }; │ │ │ │ │ -224 │ │ │ │ │ -235 template │ │ │ │ │ -237 inline typename EnableIfInterOperable::type │ │ │ │ │ -_2_3_8 _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, │ │ │ │ │ -239 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) │ │ │ │ │ -240 { │ │ │ │ │ -241 if(std::is_convertible::value) │ │ │ │ │ -242 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ -243 else │ │ │ │ │ -244 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -245 } │ │ │ │ │ -246 │ │ │ │ │ -257 template │ │ │ │ │ -259 inline typename EnableIfInterOperable::type │ │ │ │ │ -_2_6_0 _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, │ │ │ │ │ -261 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) │ │ │ │ │ -262 { │ │ │ │ │ -263 if(std::is_convertible::value) │ │ │ │ │ -264 return !static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ -265 else │ │ │ │ │ -266 return !static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -267 } │ │ │ │ │ -268 │ │ │ │ │ -273 template │ │ │ │ │ -_2_7_4 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 │ │ │ │ │ -275 { │ │ │ │ │ +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 public: │ │ │ │ │ -278 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_2_7_9 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::bidirectional_iterator_tag; │ │ │ │ │ -_2_8_0 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_2_8_1 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_2_8_2 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_2_8_3 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -284 │ │ │ │ │ -_3_1_0 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -311 │ │ │ │ │ -_3_1_5 typedef V _V_a_l_u_e; │ │ │ │ │ -316 │ │ │ │ │ -_3_2_0 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -321 │ │ │ │ │ -_3_2_5 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -326 │ │ │ │ │ -_3_3_0 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -331 │ │ │ │ │ -_3_3_3 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ +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 static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ +335 return Float128{remquoq(float128_t(t), float128_t(u), quo)}; │ │ │ │ │ 336 } │ │ │ │ │ 337 │ │ │ │ │ -_3_3_8 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ +338 inline Float128 scalbln(const Float128& u, long int e) │ │ │ │ │ 339 { │ │ │ │ │ -340 return &(static_cast(this)->dereference()); │ │ │ │ │ +340 return Float128{scalblnq(float128_t(u), e)}; │ │ │ │ │ 341 } │ │ │ │ │ 342 │ │ │ │ │ -_3_4_4 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -345 { │ │ │ │ │ -346 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -347 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -348 } │ │ │ │ │ -349 │ │ │ │ │ -_3_5_1 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -352 { │ │ │ │ │ -353 _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)); │ │ │ │ │ -354 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -355 return tmp; │ │ │ │ │ -356 } │ │ │ │ │ -357 │ │ │ │ │ -358 │ │ │ │ │ -_3_6_0 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -361 { │ │ │ │ │ -362 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->decrement(); │ │ │ │ │ -363 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -364 } │ │ │ │ │ -365 │ │ │ │ │ -_3_6_7 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_-_-(int) │ │ │ │ │ -368 { │ │ │ │ │ -369 _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)); │ │ │ │ │ -370 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ -371 return tmp; │ │ │ │ │ -372 } │ │ │ │ │ -373 }; │ │ │ │ │ -374 │ │ │ │ │ -382 template │ │ │ │ │ -384 inline typename std::enable_if::value,bool>:: │ │ │ │ │ -type │ │ │ │ │ -_3_8_5 _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, │ │ │ │ │ -386 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) │ │ │ │ │ -387 { │ │ │ │ │ -388 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ -389 } │ │ │ │ │ -390 │ │ │ │ │ -399 template │ │ │ │ │ -401 inline │ │ │ │ │ -402 typename std::enable_if::value && !std:: │ │ │ │ │ -is_convertible::value, │ │ │ │ │ -403 bool>::type │ │ │ │ │ -_4_0_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, │ │ │ │ │ -405 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) │ │ │ │ │ -406 { │ │ │ │ │ -407 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -408 } │ │ │ │ │ -409 │ │ │ │ │ -420 template │ │ │ │ │ -422 inline typename EnableIfInterOperable::type │ │ │ │ │ -_4_2_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, │ │ │ │ │ -424 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) │ │ │ │ │ -425 { │ │ │ │ │ -426 return !(lhs == rhs); │ │ │ │ │ -427 } │ │ │ │ │ -428 │ │ │ │ │ -433 template │ │ │ │ │ -_4_3_4 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 │ │ │ │ │ -435 { │ │ │ │ │ -436 │ │ │ │ │ -437 public: │ │ │ │ │ -438 /* type aliases required by C++ for iterators */ │ │ │ │ │ -_4_3_9 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::random_access_iterator_tag; │ │ │ │ │ -_4_4_0 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_4_4_1 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -_4_4_2 using _p_o_i_n_t_e_r = V*; │ │ │ │ │ -_4_4_3 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -444 │ │ │ │ │ -_4_7_8 typedef T _D_e_r_i_v_e_d_T_y_p_e; │ │ │ │ │ -479 │ │ │ │ │ -_4_8_3 typedef V _V_a_l_u_e; │ │ │ │ │ -484 │ │ │ │ │ -_4_8_8 typedef V* _P_o_i_n_t_e_r; │ │ │ │ │ -489 │ │ │ │ │ -_4_9_3 typedef D _D_i_f_f_e_r_e_n_c_e_T_y_p_e; │ │ │ │ │ -494 │ │ │ │ │ -_4_9_8 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -499 │ │ │ │ │ -_5_0_1 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_*() const │ │ │ │ │ -502 { │ │ │ │ │ -503 return static_cast<_D_e_r_i_v_e_d_T_y_p_e const*>(this)->dereference(); │ │ │ │ │ -504 } │ │ │ │ │ -505 │ │ │ │ │ -_5_0_6 _P_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -507 { │ │ │ │ │ -508 return &(static_cast(this)->dereference()); │ │ │ │ │ -509 } │ │ │ │ │ -510 │ │ │ │ │ -_5_1_6 _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 │ │ │ │ │ -517 { │ │ │ │ │ -518 return static_cast(this)->elementAt(n); │ │ │ │ │ -519 } │ │ │ │ │ -520 │ │ │ │ │ -_5_2_2 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -523 { │ │ │ │ │ -524 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->increment(); │ │ │ │ │ -525 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -526 } │ │ │ │ │ -527 │ │ │ │ │ -_5_2_9 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -530 { │ │ │ │ │ -531 _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)); │ │ │ │ │ -532 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -533 return tmp; │ │ │ │ │ -534 } │ │ │ │ │ -535 │ │ │ │ │ -_5_3_6 _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) │ │ │ │ │ -537 { │ │ │ │ │ -538 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->advance(n); │ │ │ │ │ -539 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -540 } │ │ │ │ │ -541 │ │ │ │ │ -_5_4_2 _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 │ │ │ │ │ -543 { │ │ │ │ │ -544 _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)); │ │ │ │ │ -545 tmp.advance(n); │ │ │ │ │ -546 return tmp; │ │ │ │ │ -547 } │ │ │ │ │ -548 │ │ │ │ │ -549 │ │ │ │ │ -_5_5_1 _D_e_r_i_v_e_d_T_y_p_e& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -552 { │ │ │ │ │ -553 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->decrement(); │ │ │ │ │ -554 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -555 } │ │ │ │ │ -556 │ │ │ │ │ -_5_5_8 _D_e_r_i_v_e_d_T_y_p_e _o_p_e_r_a_t_o_r_-_-(int) │ │ │ │ │ -559 { │ │ │ │ │ -560 _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)); │ │ │ │ │ -561 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ -562 return tmp; │ │ │ │ │ -563 } │ │ │ │ │ -564 │ │ │ │ │ -_5_6_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) │ │ │ │ │ -566 { │ │ │ │ │ -567 static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this)->advance(-n); │ │ │ │ │ -568 return *static_cast<_D_e_r_i_v_e_d_T_y_p_e *>(this); │ │ │ │ │ -569 } │ │ │ │ │ -570 │ │ │ │ │ -_5_7_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 │ │ │ │ │ -572 { │ │ │ │ │ -573 _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)); │ │ │ │ │ -574 tmp.advance(-n); │ │ │ │ │ -575 return tmp; │ │ │ │ │ -576 } │ │ │ │ │ -577 │ │ │ │ │ -578 │ │ │ │ │ -579 }; │ │ │ │ │ -580 │ │ │ │ │ -591 template │ │ │ │ │ -593 inline typename EnableIfInterOperable::type │ │ │ │ │ -_5_9_4 _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, │ │ │ │ │ -595 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) │ │ │ │ │ -596 { │ │ │ │ │ -597 if(std::is_convertible::value) │ │ │ │ │ -598 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ -599 else │ │ │ │ │ -600 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -601 } │ │ │ │ │ -602 │ │ │ │ │ -613 template │ │ │ │ │ -615 inline typename EnableIfInterOperable::type │ │ │ │ │ -_6_1_6 _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, │ │ │ │ │ -617 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) │ │ │ │ │ -618 { │ │ │ │ │ -619 if(std::is_convertible::value) │ │ │ │ │ -620 return !static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ -621 else │ │ │ │ │ -622 return !static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ -623 } │ │ │ │ │ -624 │ │ │ │ │ -635 template │ │ │ │ │ -_6_3_7 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 │ │ │ │ │ -638 _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, │ │ │ │ │ -639 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) │ │ │ │ │ -640 { │ │ │ │ │ -641 if(std::is_convertible::value) │ │ │ │ │ -642 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))>0; │ │ │ │ │ -643 else │ │ │ │ │ -644 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))<0; │ │ │ │ │ -645 } │ │ │ │ │ -646 │ │ │ │ │ -647 │ │ │ │ │ -658 template │ │ │ │ │ -_6_6_0 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 │ │ │ │ │ -661 _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, │ │ │ │ │ -662 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) │ │ │ │ │ -663 { │ │ │ │ │ -664 if(std::is_convertible::value) │ │ │ │ │ -665 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))>=0; │ │ │ │ │ -666 else │ │ │ │ │ -667 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))<=0; │ │ │ │ │ -668 } │ │ │ │ │ -669 │ │ │ │ │ -670 │ │ │ │ │ -681 template │ │ │ │ │ -683 inline typename EnableIfInterOperable::type │ │ │ │ │ -_6_8_4 _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, │ │ │ │ │ -685 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) │ │ │ │ │ -686 { │ │ │ │ │ -687 if(std::is_convertible::value) │ │ │ │ │ -688 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))<0; │ │ │ │ │ -689 else │ │ │ │ │ -690 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))>0; │ │ │ │ │ -691 } │ │ │ │ │ -692 │ │ │ │ │ -703 template │ │ │ │ │ -705 inline typename EnableIfInterOperable::type │ │ │ │ │ -_7_0_6 _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, │ │ │ │ │ -707 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) │ │ │ │ │ -708 { │ │ │ │ │ -709 if(std::is_convertible::value) │ │ │ │ │ -710 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))<=0; │ │ │ │ │ -711 else │ │ │ │ │ -712 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))>=0; │ │ │ │ │ -713 } │ │ │ │ │ -714 │ │ │ │ │ -725 template │ │ │ │ │ -727 inline typename EnableIfInterOperable::type │ │ │ │ │ -_7_2_8 _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, │ │ │ │ │ -729 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) │ │ │ │ │ -730 { │ │ │ │ │ -731 if(std::is_convertible::value) │ │ │ │ │ -732 return -static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs)); │ │ │ │ │ -733 else │ │ │ │ │ -734 return static_cast(rhs).distanceTo(static_cast(lhs)); │ │ │ │ │ -735 } │ │ │ │ │ -736 │ │ │ │ │ -737 │ │ │ │ │ -748 template │ │ │ │ │ -_7_4_9 class _P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t │ │ │ │ │ -750 { │ │ │ │ │ -751 public: │ │ │ │ │ -_7_5_2 constexpr _P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t(ProxyType&& p) │ │ │ │ │ -753 noexcept(std::is_nothrow_constructible_v) │ │ │ │ │ -754 : p_(_s_t_d::move(p)) │ │ │ │ │ -755 {} │ │ │ │ │ -756 │ │ │ │ │ -_7_5_7 constexpr _P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t(const ProxyType& p) │ │ │ │ │ -758 noexcept(std::is_nothrow_constructible_v) │ │ │ │ │ -759 : p_(p) │ │ │ │ │ -760 {} │ │ │ │ │ -761 │ │ │ │ │ -_7_6_2 constexpr const ProxyType* _o_p_e_r_a_t_o_r_-_>() const noexcept │ │ │ │ │ -763 { │ │ │ │ │ -764 return &p_; │ │ │ │ │ -765 } │ │ │ │ │ -766 │ │ │ │ │ -_7_6_7 constexpr ProxyType* _o_p_e_r_a_t_o_r_-_>() noexcept │ │ │ │ │ -768 { │ │ │ │ │ -769 return &p_; │ │ │ │ │ -770 } │ │ │ │ │ -771 │ │ │ │ │ -772 private: │ │ │ │ │ -773 ProxyType p_; │ │ │ │ │ -774 }; │ │ │ │ │ -775 │ │ │ │ │ -776 │ │ │ │ │ -_7_8_5 struct _I_t_e_r_a_t_o_r_F_a_c_a_d_e_A_c_c_e_s_s │ │ │ │ │ -786 { │ │ │ │ │ -787 │ │ │ │ │ -789 template │ │ │ │ │ -790 static constexpr auto baseIterator(It&& it) noexcept │ │ │ │ │ -791 -> decltype(it.baseIterator()) │ │ │ │ │ -792 { │ │ │ │ │ -793 return it.baseIterator(); │ │ │ │ │ -794 } │ │ │ │ │ -795 │ │ │ │ │ -797 template │ │ │ │ │ -798 static constexpr auto derived(It&& it) noexcept │ │ │ │ │ -799 -> decltype(it.derived()) │ │ │ │ │ -800 { │ │ │ │ │ -801 return it.derived(); │ │ │ │ │ -802 } │ │ │ │ │ -803 │ │ │ │ │ -804 }; │ │ │ │ │ -805 │ │ │ │ │ -806 │ │ │ │ │ -807 │ │ │ │ │ -808 namespace Impl::Concepts { │ │ │ │ │ -809 │ │ │ │ │ -810 using namespace _D_u_n_e_:_:_C_o_n_c_e_p_t; │ │ │ │ │ -811 │ │ │ │ │ -812 template │ │ │ │ │ -813 struct BaseIterDereferenceOp │ │ │ │ │ -814 { │ │ │ │ │ -815 template │ │ │ │ │ -816 auto require(const It& it) -> decltype( │ │ │ │ │ -817 *(IteratorFacadeAccess::baseIterator(it)), │ │ │ │ │ -818 _r_e_q_u_i_r_e_C_o_n_v_e_r_t_i_b_l_e │ │ │ │ │ -() │ │ │ │ │ -819 ); │ │ │ │ │ -820 }; │ │ │ │ │ -821 │ │ │ │ │ -822 struct IterEqualsOp │ │ │ │ │ -823 { │ │ │ │ │ -824 template │ │ │ │ │ -825 auto require(const It1& it1, const It2& it2) -> decltype( │ │ │ │ │ -826 requireConvertible(it1 == it2) │ │ │ │ │ -827 ); │ │ │ │ │ -828 }; │ │ │ │ │ -829 │ │ │ │ │ -830 struct BaseIterEqualsOp │ │ │ │ │ -831 { │ │ │ │ │ -832 template │ │ │ │ │ -833 auto require(const It1& it1, const It2& it2) -> decltype( │ │ │ │ │ -834 Dune::Concept::requireConvertible(IteratorFacadeAccess::baseIterator │ │ │ │ │ -(it1) == IteratorFacadeAccess::baseIterator(it2)) │ │ │ │ │ -835 ); │ │ │ │ │ -836 }; │ │ │ │ │ -837 │ │ │ │ │ -838 struct BaseIterIncrementOp │ │ │ │ │ -839 { │ │ │ │ │ -840 template │ │ │ │ │ -841 auto require(It it) -> decltype( │ │ │ │ │ -842 ++(IteratorFacadeAccess::baseIterator(it)) │ │ │ │ │ -843 ); │ │ │ │ │ -844 }; │ │ │ │ │ -845 │ │ │ │ │ -846 struct BaseIterDecrementOp │ │ │ │ │ -847 { │ │ │ │ │ -848 template │ │ │ │ │ -849 auto require(It it) -> decltype( │ │ │ │ │ -850 --(IteratorFacadeAccess::baseIterator(it)) │ │ │ │ │ -851 ); │ │ │ │ │ -852 }; │ │ │ │ │ -853 │ │ │ │ │ -854 template │ │ │ │ │ -855 struct IterAdvanceOp │ │ │ │ │ -856 { │ │ │ │ │ -857 template │ │ │ │ │ -858 auto require(It it) -> decltype( │ │ │ │ │ -859 it += std::declval() │ │ │ │ │ -860 ); │ │ │ │ │ -861 }; │ │ │ │ │ -862 │ │ │ │ │ -863 template │ │ │ │ │ -864 struct BaseIterAdvanceOp │ │ │ │ │ -865 { │ │ │ │ │ -866 template │ │ │ │ │ -867 auto require(It it) -> decltype( │ │ │ │ │ -868 IteratorFacadeAccess::baseIterator(it) += std::declval() │ │ │ │ │ -869 ); │ │ │ │ │ -870 }; │ │ │ │ │ -871 │ │ │ │ │ -872 template │ │ │ │ │ -873 struct IterDistanceOp │ │ │ │ │ -874 { │ │ │ │ │ -875 template │ │ │ │ │ -876 auto require(const It1& it1, const It2& it2) -> decltype( │ │ │ │ │ -877 Dune::Concept::requireConvertible(it1 - it2) │ │ │ │ │ -878 ); │ │ │ │ │ -879 }; │ │ │ │ │ -880 │ │ │ │ │ -881 template │ │ │ │ │ -882 struct BaseIterDistanceOp │ │ │ │ │ -883 { │ │ │ │ │ -884 template │ │ │ │ │ -885 auto require(const It1& it1, const It2& it2) -> decltype( │ │ │ │ │ -886 Dune::Concept::requireConvertible(IteratorFacadeAccess::baseIterator │ │ │ │ │ -(it1) - IteratorFacadeAccess::baseIterator(it2)) │ │ │ │ │ -887 ); │ │ │ │ │ -888 }; │ │ │ │ │ -889 │ │ │ │ │ -890 } // namespace Impl::Concept │ │ │ │ │ -891 │ │ │ │ │ -892 │ │ │ │ │ -893 │ │ │ │ │ -1051 template │ │ │ │ │ -_1_0_5_2 class _I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -1053 { │ │ │ │ │ -1054 static constexpr bool isBidirectional = std::is_convertible_v; │ │ │ │ │ -1055 static constexpr bool isRandomAccess = std::is_convertible_v; │ │ │ │ │ -1056 │ │ │ │ │ -1057 // We make IteratorFacadeAccess a friend to allow forwarding of the │ │ │ │ │ -derived() │ │ │ │ │ -1058 // methods to the free operators instead of havin to do raw casts there. │ │ │ │ │ -1059 // This allows to encapsulate all casts within IteratorFacade itself. │ │ │ │ │ -1060 friend _I_t_e_r_a_t_o_r_F_a_c_a_d_e_A_c_c_e_s_s; │ │ │ │ │ -1061 │ │ │ │ │ -1062 protected: │ │ │ │ │ -1063 │ │ │ │ │ -_1_0_6_5 using _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r = It; │ │ │ │ │ -1066 │ │ │ │ │ -_1_0_6_8 constexpr const _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r& _d_e_r_i_v_e_d() const │ │ │ │ │ -1069 { │ │ │ │ │ -1070 return static_cast(*this); │ │ │ │ │ -1071 } │ │ │ │ │ -1072 │ │ │ │ │ -_1_0_7_4 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r& _d_e_r_i_v_e_d() │ │ │ │ │ -1075 { │ │ │ │ │ -1076 return static_cast<_D_e_r_i_v_e_d_I_t_e_r_a_t_o_r&>(*this); │ │ │ │ │ -1077 } │ │ │ │ │ -1078 │ │ │ │ │ -1079 public: │ │ │ │ │ -1080 │ │ │ │ │ -1081 // Standard types of of C++ iterators │ │ │ │ │ -_1_0_8_2 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = C; │ │ │ │ │ -_1_0_8_3 using _v_a_l_u_e___t_y_p_e = typename std::remove_const::type; │ │ │ │ │ -_1_0_8_4 using _r_e_f_e_r_e_n_c_e = R; │ │ │ │ │ -_1_0_8_5 using _p_o_i_n_t_e_r = P; │ │ │ │ │ -_1_0_8_6 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = D; │ │ │ │ │ -1087 │ │ │ │ │ -1088 // Corresponding Dune typedefs │ │ │ │ │ -_1_0_8_9 using _V_a_l_u_e = _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_1_0_9_0 using _R_e_f_e_r_e_n_c_e = _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_1_0_9_1 using _P_o_i_n_t_e_r = _p_o_i_n_t_e_r; │ │ │ │ │ -_1_0_9_2 using _D_i_f_f_e_r_e_n_c_e_T_y_p_e = _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -1093 │ │ │ │ │ -1094 // Only defined to do static assertions. │ │ │ │ │ -_1_0_9_5 _I_t_e_r_a_t_o_r_F_a_c_a_d_e() │ │ │ │ │ -1096 { │ │ │ │ │ -1097 static_assert(std::is_signed_v, │ │ │ │ │ -1098 "Type used as difference_type must be signed"); │ │ │ │ │ -1099 const _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r& constDerived = _d_e_r_i_v_e_d(); │ │ │ │ │ -1100 static_assert(std::is_convertible_v, │ │ │ │ │ -1101 "Derived class does not implement `*it` or `*(it.baseIterator())` for │ │ │ │ │ -const `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>."); │ │ │ │ │ -1102 static_assert(std::is_convertible_v, │ │ │ │ │ -1103 "Derived class does not implement `++it`, `++(it.baseIterator())`, or │ │ │ │ │ -`it+=1` for mutable `it` required by IteratorFacade<..., std:: │ │ │ │ │ -forward_iterator_tag, ...>."); │ │ │ │ │ -1104 static_assert(std::is_convertible_v, │ │ │ │ │ -1105 "Derived class does not implement `it1==it2` or `it1.baseIterator │ │ │ │ │ -()==it2.baseIterator()` for const `it1` and `it2` required by │ │ │ │ │ -IteratorFacade<..., std::forward_iterator_tag, ...>."); │ │ │ │ │ -1106 if constexpr (isBidirectional) │ │ │ │ │ -1107 static_assert(std::is_convertible_v, │ │ │ │ │ -1108 "Derived class does not implement `--it`, `--(it.baseIterator())`, or `it- │ │ │ │ │ -=1` for mutable `it` required by IteratorFacade<..., std:: │ │ │ │ │ -bidirectional_iterator_tag, ...>."); │ │ │ │ │ -1109 if constexpr (isRandomAccess) │ │ │ │ │ -1110 { │ │ │ │ │ -1111 static_assert(std::is_convertible_v()), _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r&>, │ │ │ │ │ -1112 "Derived class does not implement `it+=` or `it.baseIterator()+=` for │ │ │ │ │ -mutable `it` required by IteratorFacade<..., std::random_access_iterator_tag, │ │ │ │ │ -...>."); │ │ │ │ │ -1113 static_assert(std::is_convertible_v, │ │ │ │ │ -1114 "Derived class does not implement `it1-it2` or `it1.baseIterator()- │ │ │ │ │ -it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., │ │ │ │ │ -std::random_access_iterator_tag, ...>."); │ │ │ │ │ -1115 } │ │ │ │ │ -1116 } │ │ │ │ │ -1117 │ │ │ │ │ -_1_1_1_9 constexpr decltype(auto) operator*() const │ │ │ │ │ -1120 { │ │ │ │ │ -1121 if constexpr (Dune::models, _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r>()) │ │ │ │ │ -1122 return *(IteratorFacadeAccess::baseIterator(_d_e_r_i_v_e_d())); │ │ │ │ │ -1123 else │ │ │ │ │ -1124 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_I_t_>_:_:_v_a_l_u_e, │ │ │ │ │ -1125 "Derived class does not implement `*it` or `*(it.baseIterator())` for │ │ │ │ │ -const `it` required by IteratorFacade<..., std::forward_iterator_tag, ...>."); │ │ │ │ │ -1126 } │ │ │ │ │ -1127 │ │ │ │ │ -_1_1_2_9 constexpr _p_o_i_n_t_e_r _o_p_e_r_a_t_o_r_-_>() const │ │ │ │ │ -1130 { │ │ │ │ │ -1131 if constexpr (std::is_pointer_v) │ │ │ │ │ -1132 return std::addressof(*_d_e_r_i_v_e_d()); │ │ │ │ │ -1133 else │ │ │ │ │ -1134 return _p_o_i_n_t_e_r(*_d_e_r_i_v_e_d()); │ │ │ │ │ -1135 } │ │ │ │ │ -1136 │ │ │ │ │ -_1_1_3_8 constexpr decltype(auto) operator++() │ │ │ │ │ -1139 { │ │ │ │ │ -1140 if constexpr (Dune::models()) │ │ │ │ │ -1141 { │ │ │ │ │ -1142 ++(IteratorFacadeAccess::baseIterator(_d_e_r_i_v_e_d())); │ │ │ │ │ -1143 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1144 } │ │ │ │ │ -1145 else if constexpr (Dune::models, _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r>()) │ │ │ │ │ -1146 { │ │ │ │ │ -1147 _d_e_r_i_v_e_d() += 1; │ │ │ │ │ -1148 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1149 } │ │ │ │ │ -1150 else │ │ │ │ │ -1151 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_I_t_>_:_:_v_a_l_u_e, │ │ │ │ │ -1152 "Derived class does not implement `++it`, `++(it.baseIterator())`, or │ │ │ │ │ -`it+=1` for mutable `it` required by IteratorFacade<..., std:: │ │ │ │ │ -forward_iterator_tag, ...>."); │ │ │ │ │ -1153 } │ │ │ │ │ -1154 │ │ │ │ │ -_1_1_5_6 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_+_+(int) │ │ │ │ │ -1157 { │ │ │ │ │ -1158 _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r tmp(_d_e_r_i_v_e_d()); │ │ │ │ │ -1159 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -1160 return tmp; │ │ │ │ │ -1161 } │ │ │ │ │ -1162 │ │ │ │ │ -1168 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_1_6_9 constexpr decltype(auto) operator--() │ │ │ │ │ -1170 { │ │ │ │ │ -1171 if constexpr (Dune::models()) │ │ │ │ │ -1172 { │ │ │ │ │ -1173 --(IteratorFacadeAccess::baseIterator(_d_e_r_i_v_e_d())); │ │ │ │ │ -1174 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1175 } │ │ │ │ │ -1176 else if constexpr (Dune::models, _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r>()) │ │ │ │ │ -1177 { │ │ │ │ │ -1178 _d_e_r_i_v_e_d() -= 1; │ │ │ │ │ -1179 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1180 } │ │ │ │ │ -1181 else │ │ │ │ │ -1182 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_I_t_>_:_:_v_a_l_u_e, │ │ │ │ │ -1183 "Derived class does not implement `--it`, `--(it.baseIterator())`, or `it- │ │ │ │ │ -=1` for mutable `it` required by IteratorFacade<..., std:: │ │ │ │ │ -bidirectional_iterator_tag, ...>."); │ │ │ │ │ -1184 } │ │ │ │ │ -1185 │ │ │ │ │ -1191 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_1_9_2 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_-_-(int) │ │ │ │ │ -1193 { │ │ │ │ │ -1194 _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r tmp(_d_e_r_i_v_e_d()); │ │ │ │ │ -1195 this->_o_p_e_r_a_t_o_r_-_-(); │ │ │ │ │ -1196 return tmp; │ │ │ │ │ -1197 } │ │ │ │ │ -1198 │ │ │ │ │ -1206 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_2_0_7 constexpr _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 │ │ │ │ │ -1208 { │ │ │ │ │ -1209 return *(_d_e_r_i_v_e_d()+n); │ │ │ │ │ -1210 } │ │ │ │ │ -1211 │ │ │ │ │ -1217 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_2_1_8 constexpr decltype(auto) operator+=(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n) │ │ │ │ │ -1219 { │ │ │ │ │ -1220 if constexpr (Dune::models, _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r>()) │ │ │ │ │ -1221 { │ │ │ │ │ -1222 IteratorFacadeAccess::baseIterator(_d_e_r_i_v_e_d()) += n; │ │ │ │ │ -1223 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1224 } │ │ │ │ │ -1225 else │ │ │ │ │ -1226 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_I_t_>_:_:_v_a_l_u_e, │ │ │ │ │ -1227 "Derived class does not implement `it+=` or `it.baseIterator()+=` for │ │ │ │ │ -mutable `it` required by IteratorFacade<..., std::random_access_iterator_tag, │ │ │ │ │ -...>."); │ │ │ │ │ -1228 } │ │ │ │ │ -1229 │ │ │ │ │ -1235 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_2_3_6 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_+(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n) const │ │ │ │ │ -1237 { │ │ │ │ │ -1238 _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r tmp(_d_e_r_i_v_e_d()); │ │ │ │ │ -1239 tmp += n; │ │ │ │ │ -1240 return tmp; │ │ │ │ │ -1241 } │ │ │ │ │ -1242 │ │ │ │ │ -1248 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_2_4_9 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_-_=(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n) │ │ │ │ │ -1250 { │ │ │ │ │ -1251 _d_e_r_i_v_e_d() += (-n); │ │ │ │ │ -1252 return _d_e_r_i_v_e_d(); │ │ │ │ │ -1253 } │ │ │ │ │ -1254 │ │ │ │ │ -1260 template │ │ │ │ │ -=0> │ │ │ │ │ -_1_2_6_1 constexpr _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_-(_d_i_f_f_e_r_e_n_c_e___t_y_p_e n) const │ │ │ │ │ -1262 { │ │ │ │ │ -1263 _D_e_r_i_v_e_d_I_t_e_r_a_t_o_r tmp(_d_e_r_i_v_e_d()); │ │ │ │ │ -1264 tmp -= n; │ │ │ │ │ -1265 return tmp; │ │ │ │ │ -1266 } │ │ │ │ │ -1267 │ │ │ │ │ -1268 }; │ │ │ │ │ -1269 │ │ │ │ │ -1270 │ │ │ │ │ -1271 │ │ │ │ │ -1282 template │ │ │ │ │ -_1_2_8_3 constexpr auto _o_p_e_r_a_t_o_r_=_=(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1284 { │ │ │ │ │ -1285 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1286 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1287 if constexpr (Dune::models()) │ │ │ │ │ -1288 return IteratorFacadeAccess::baseIterator(derivedIt1) == │ │ │ │ │ -IteratorFacadeAccess::baseIterator(derivedIt2); │ │ │ │ │ -1289 else │ │ │ │ │ -1290 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_T_1_>_:_:_v_a_l_u_e, │ │ │ │ │ -1291 "Derived class does not implement `it1==it2` or `it1.baseIterator │ │ │ │ │ -()==it2.baseIterator()` for const `it1` and `it2` required by │ │ │ │ │ -IteratorFacade<..., std::forward_iterator_tag, ...>."); │ │ │ │ │ -1292 } │ │ │ │ │ -1293 │ │ │ │ │ -1301 template() , │ │ │ │ │ -int> =0> │ │ │ │ │ -_1_3_0_3 constexpr bool _o_p_e_r_a_t_o_r_!_=(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1304 { │ │ │ │ │ -1305 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1306 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1307 return not(derivedIt1 == derivedIt2); │ │ │ │ │ -1308 } │ │ │ │ │ -1309 │ │ │ │ │ -1320 template │ │ │ │ │ -_1_3_2_1 constexpr auto _o_p_e_r_a_t_o_r_-(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_>& it1, const │ │ │ │ │ -_I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_>& it2) │ │ │ │ │ -1322 { │ │ │ │ │ -1323 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1324 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1325 if constexpr (Dune::models,T1, T2> │ │ │ │ │ -()) │ │ │ │ │ -1326 return D(IteratorFacadeAccess::baseIterator(derivedIt1) - │ │ │ │ │ -IteratorFacadeAccess::baseIterator(derivedIt2)); │ │ │ │ │ -1327 else │ │ │ │ │ -1328 static_assert(_A_l_w_a_y_s_F_a_l_s_e_<_T_1_>_:_:_v_a_l_u_e, │ │ │ │ │ -1329 "Derived class does not implement `it1-it2` or `it1.baseIterator()- │ │ │ │ │ -it2.baseIterator()` for const `it1` and `it2` required by IteratorFacade<..., │ │ │ │ │ -std::random_access_iterator_tag, ...>."); │ │ │ │ │ -1330 } │ │ │ │ │ -1331 │ │ │ │ │ -1339 template,T1, T2> │ │ │ │ │ -() , int> =0> │ │ │ │ │ -_1_3_4_1 constexpr bool operator<(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1342 { │ │ │ │ │ -1343 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1344 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1345 return (derivedIt1 - derivedIt2) < D1(0); │ │ │ │ │ -1346 } │ │ │ │ │ -1347 │ │ │ │ │ -1355 template,T1, T2> │ │ │ │ │ -() , int> =0> │ │ │ │ │ -_1_3_5_7 constexpr bool operator<=(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1358 { │ │ │ │ │ -1359 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1360 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1361 return (derivedIt1 - derivedIt2) <= D1(0); │ │ │ │ │ -1362 } │ │ │ │ │ -1363 │ │ │ │ │ -1371 template,T1, T2> │ │ │ │ │ -() , int> =0> │ │ │ │ │ -_1_3_7_3 constexpr bool operator>(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1374 { │ │ │ │ │ -1375 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1376 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1377 return (derivedIt1 - derivedIt2) > D1(0); │ │ │ │ │ -1378 } │ │ │ │ │ -1379 │ │ │ │ │ -1387 template,T1, T2> │ │ │ │ │ -() , int> =0> │ │ │ │ │ -_1_3_8_9 constexpr bool operator>=(const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_1_,_C_,_V_1_,_R_1_,_P_1_,_D_1_>& it1, │ │ │ │ │ -const _I_t_e_r_a_t_o_r_F_a_c_a_d_e_<_T_2_,_C_,_V_2_,_R_2_,_P_2_,_D_2_>& it2) │ │ │ │ │ -1390 { │ │ │ │ │ -1391 const T1& derivedIt1 = IteratorFacadeAccess::derived(it1); │ │ │ │ │ -1392 const T2& derivedIt2 = IteratorFacadeAccess::derived(it2); │ │ │ │ │ -1393 return (derivedIt1 - derivedIt2) >= D1(0); │ │ │ │ │ -1394 } │ │ │ │ │ -1395 │ │ │ │ │ -1396 │ │ │ │ │ -1397 │ │ │ │ │ -1399} │ │ │ │ │ -1400#endif │ │ │ │ │ +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 │ │ │ │ │ _t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ │ Traits for type conversions and type information. │ │ │ │ │ -_c_o_n_c_e_p_t_._h_h │ │ │ │ │ -Infrastructure for concepts. │ │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +_D_U_N_E___B_I_N_A_R_Y___O_P │ │ │ │ │ +#define DUNE_BINARY_OP(OP) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:261 │ │ │ │ │ +_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:220 │ │ │ │ │ +_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_:_:_H_y_b_r_i_d_:_:_m_a_x │ │ │ │ │ +constexpr auto max │ │ │ │ │ +Function object that returns the greater of the given values. │ │ │ │ │ +DDeeffiinniittiioonn hybridutilities.hh:484 │ │ │ │ │ +_D_u_n_e_:_:_H_y_b_r_i_d_:_:_m_i_n │ │ │ │ │ +constexpr auto min │ │ │ │ │ +Function object that returns the smaller of the given values. │ │ │ │ │ +DDeeffiinniittiioonn hybridutilities.hh:506 │ │ │ │ │ +_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_< │ │ │ │ │ -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:638 │ │ │ │ │ -_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:684 │ │ │ │ │ -_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:661 │ │ │ │ │ -_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:238 │ │ │ │ │ -_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:706 │ │ │ │ │ -_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:260 │ │ │ │ │ +_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. │ │ │ │ │ _D_u_n_e │ │ │ │ │ Dune namespace. │ │ │ │ │ DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ │ -_D_u_n_e_:_:_C_o_n_c_e_p_t │ │ │ │ │ -Namespace for concepts. │ │ │ │ │ -DDeeffiinniittiioonn concept.hh:34 │ │ │ │ │ -_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:247 │ │ │ │ │ -_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:142 │ │ │ │ │ -_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: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_:_:_p_o_i_n_t_e_r │ │ │ │ │ -V * pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:149 │ │ │ │ │ -_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:210 │ │ │ │ │ -_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:191 │ │ │ │ │ -_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:196 │ │ │ │ │ -_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:204 │ │ │ │ │ -_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:176 │ │ │ │ │ -_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:181 │ │ │ │ │ -_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: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_+_+ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:217 │ │ │ │ │ -_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:186 │ │ │ │ │ -_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: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_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:199 │ │ │ │ │ -_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:150 │ │ │ │ │ -_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:275 │ │ │ │ │ -_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: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___t_y_p_e │ │ │ │ │ -typename std::remove_const< V >::type value_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_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:333 │ │ │ │ │ -_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: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_:_:_D_e_r_i_v_e_d_T_y_p_e │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:310 │ │ │ │ │ -_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:360 │ │ │ │ │ -_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:338 │ │ │ │ │ -_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:344 │ │ │ │ │ -_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:320 │ │ │ │ │ -_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:330 │ │ │ │ │ -_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:351 │ │ │ │ │ -_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: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_:_:_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:325 │ │ │ │ │ -_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:367 │ │ │ │ │ -_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:283 │ │ │ │ │ -_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:315 │ │ │ │ │ -_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:435 │ │ │ │ │ -_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: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_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -D difference_type │ │ │ │ │ -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_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -DerivedType operator--(int) │ │ │ │ │ -Postdecrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:558 │ │ │ │ │ -_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: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_:_:_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: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_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:501 │ │ │ │ │ -_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:522 │ │ │ │ │ -_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:443 │ │ │ │ │ -_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:506 │ │ │ │ │ -_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:493 │ │ │ │ │ -_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:551 │ │ │ │ │ -_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:565 │ │ │ │ │ -_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:542 │ │ │ │ │ -_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:516 │ │ │ │ │ -_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:478 │ │ │ │ │ -_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:488 │ │ │ │ │ -_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:571 │ │ │ │ │ -_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:529 │ │ │ │ │ -_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:483 │ │ │ │ │ -_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:536 │ │ │ │ │ -_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:498 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t │ │ │ │ │ -Helper to mimic a pointer for proxy objects. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:750 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t │ │ │ │ │ -constexpr ProxyArrowResult(const ProxyType &p) noexcept(std:: │ │ │ │ │ -is_nothrow_constructible_v< ProxyType, const ProxyType & >) │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:757 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -constexpr ProxyType * operator->() noexcept │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:767 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -constexpr const ProxyType * operator->() const noexcept │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:762 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t_:_:_P_r_o_x_y_A_r_r_o_w_R_e_s_u_l_t │ │ │ │ │ -constexpr ProxyArrowResult(ProxyType &&p) noexcept(std:: │ │ │ │ │ -is_nothrow_constructible_v< ProxyType, ProxyType && >) │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:752 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_A_c_c_e_s_s │ │ │ │ │ -This class encapsulates access of IteratorFacade. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:786 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -CRTP-Mixing class for stl conformant iterators of given iterator category. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1053 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -constexpr DerivedIterator operator--(int) │ │ │ │ │ -Postdecrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1192 │ │ │ │ │ -_D_u_n_e_:_:_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:1086 │ │ │ │ │ -_D_u_n_e_:_:_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 │ │ │ │ │ -C iterator_category │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1082 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e │ │ │ │ │ -IteratorFacade() │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1095 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -constexpr pointer operator->() const │ │ │ │ │ -Arrow access to members of referenced value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1129 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_P_o_i_n_t_e_r │ │ │ │ │ -pointer Pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1091 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -reference Reference │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1090 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ │ -constexpr DerivedIterator operator+(difference_type n) const │ │ │ │ │ -Create iterator incremented by given value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1236 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -constexpr DerivedIterator operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1156 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_d_e_r_i_v_e_d │ │ │ │ │ -constexpr DerivedIterator & derived() │ │ │ │ │ -Cast of *this to DerivedIterator type. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1074 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_D_e_r_i_v_e_d_I_t_e_r_a_t_o_r │ │ │ │ │ -It DerivedIterator │ │ │ │ │ -The derived iterator type. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1065 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -constexpr DerivedIterator & operator-=(difference_type n) │ │ │ │ │ -Decrement iterator by given value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1249 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -constexpr decltype(auto) operator--() │ │ │ │ │ -Predecrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1169 │ │ │ │ │ -_D_u_n_e_:_:_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:1084 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -constexpr reference operator[](difference_type n) const │ │ │ │ │ -Dereference element with given offset form this iterator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1207 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_d_e_r_i_v_e_d │ │ │ │ │ -constexpr const DerivedIterator & derived() const │ │ │ │ │ -Cast of *this to const DerivedIterator type. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1068 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_p_o_i_n_t_e_r │ │ │ │ │ -P pointer │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1085 │ │ │ │ │ -_D_u_n_e_:_:_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:1083 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_V_a_l_u_e │ │ │ │ │ -value_type Value │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1089 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -constexpr decltype(auto) operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1138 │ │ │ │ │ -_D_u_n_e_:_:_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 │ │ │ │ │ -difference_type DifferenceType │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1092 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_F_a_c_a_d_e_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ │ -constexpr DerivedIterator operator-(difference_type n) const │ │ │ │ │ -Create iterator decremented by given value. │ │ │ │ │ -DDeeffiinniittiioonn iteratorfacades.hh:1261 │ │ │ │ │ -_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_:_:_m_a_x___v_a_l_u_e │ │ │ │ │ +T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:494 │ │ │ │ │ +_D_u_n_e_:_:_m_i_n___v_a_l_u_e │ │ │ │ │ +T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +DDeeffiinniittiioonn debugalign.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_R_a_n_g_e_E_r_r_o_r │ │ │ │ │ +Default exception class for range errors. │ │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:254 │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: tupleutility.hh File Reference │ │ │ │ +dune-common: fmatrixev.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,118 +70,67 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
tupleutility.hh File Reference
│ │ │ │ +
fmatrixev.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <dune-common-config.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

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

│ │ │ │ Namespaces

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

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

│ │ │ │ -

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

│ │ │ │ +

Eigenvalue computations for the FieldMatrix class.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,108 +1,59 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -tupleutility.hh File Reference │ │ │ │ │ -_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _T_u_p_l_e_ _U_t_i_l_i_t_i_e_s │ │ │ │ │ -Contains utility classes which can be used with std::tuple. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#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> │ │ │ │ │ +_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 │ │ │ │ │ +#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_/_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> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _*_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _&_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r_<_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_o_r_E_a_c_h_T_y_p_e_<_ _T_E_,_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _>_:_:_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_R_e_f_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ -  TypeEvaluator to turn a type T into a reference to T _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ │ -  TypeEvaluator to turn a type T into a pointer to T _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _&_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_t_T_y_p_e_<_ _N_,_ _T_u_p_l_e_ _> │ │ │ │ │ -  Type for reverse element access. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_t_<_ _N_ _> │ │ │ │ │ -  Reverse element access. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_o_i_n_t_e_r_P_a_i_r_D_e_l_e_t_o_r_<_ _T_u_p_l_e_ _> │ │ │ │ │ -  Deletes all objects pointed to in a std::tuple of pointers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_i_r_s_t_P_r_e_d_i_c_a_t_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _P_r_e_d_i_c_a_t_e_,_ _s_t_a_r_t_,_ _s_i_z_e_ _> │ │ │ │ │ -  Finding the index of a certain type in a std::tuple. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  Generator for predicates accepting one particular type. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _>_:_:_P_r_e_d_i_c_a_t_e_<_ _U_ _> │ │ │ │ │ -  The actual predicate. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_r_s_t_T_y_p_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _T_,_ _s_t_a_r_t_ _> │ │ │ │ │ -  Find the first occurrence of a type in a std::tuple. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_u_s_h_B_a_c_k_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_u_s_h_F_r_o_n_t_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _N_ _> │ │ │ │ │ -  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _0_ _> │ │ │ │ │ -  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_J_o_i_n_T_u_p_l_e_s_<_ _H_e_a_d_,_ _T_a_i_l_ _> │ │ │ │ │ -  Join two std::tuple's. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_l_a_t_t_e_n_T_u_p_l_e_<_ _T_u_p_l_e_ _> │ │ │ │ │ -  Flatten a std::tuple of std::tuple's. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ 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 │ │ │ │ │ +  │ │ │ │ │ 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...))) │ │ │ │ │ +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 │ │ │ │ │ +  │ │ │ │ │ +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 │ │ │ │ │ +  │ │ │ │ │ +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 │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Contains utility classes which can be used with std::tuple. │ │ │ │ │ +Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ =============================================================================== │ │ │ │ │ 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: tupleutility.hh Source File │ │ │ │ +dune-common: fmatrixev.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,448 +74,641 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
tupleutility.hh
│ │ │ │ +
fmatrixev.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_TUPLE_UTILITY_HH
│ │ │ │ -
7#define DUNE_TUPLE_UTILITY_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ -
12#include <utility>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ +
5#ifndef DUNE_FMATRIXEIGENVALUES_HH
│ │ │ │ +
6#define DUNE_FMATRIXEIGENVALUES_HH
│ │ │ │ +
7
│ │ │ │ +
12#include <algorithm>
│ │ │ │ +
13#include <iostream>
│ │ │ │ +
14#include <cmath>
│ │ │ │ +
15#include <cassert>
│ │ │ │
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 };
│ │ │ │ -
│ │ │ │ +
17#include <dune-common-config.hh> // HAVE_LAPACK
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
21#include <dune/common/math.hh>
│ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24
│ │ │ │ +
30 namespace FMatrixHelp {
│ │ │ │ +
31
│ │ │ │ +
32#if HAVE_LAPACK
│ │ │ │ +
33 // defined in fmatrixev.cc
│ │ │ │ +
34 extern void eigenValuesLapackCall(
│ │ │ │ +
35 const char* jobz, const char* uplo, const long
│ │ │ │ +
36 int* n, double* a, const long int* lda, double* w,
│ │ │ │ +
37 double* work, const long int* lwork, long int* info);
│ │ │ │ +
38
│ │ │ │ +
39 extern void eigenValuesNonsymLapackCall(
│ │ │ │ +
40 const char* jobvl, const char* jobvr, const long
│ │ │ │ +
41 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl,
│ │ │ │ +
42 const long int* ldvl, double* vr, const long int* ldvr, double* work,
│ │ │ │ +
43 const long int* lwork, long int* info);
│ │ │ │ +
44
│ │ │ │ +
45 extern void eigenValuesLapackCall(
│ │ │ │ +
46 const char* jobz, const char* uplo, const long
│ │ │ │ +
47 int* n, float* a, const long int* lda, float* w,
│ │ │ │ +
48 float* work, const long int* lwork, long int* info);
│ │ │ │ +
49
│ │ │ │ +
50 extern void eigenValuesNonsymLapackCall(
│ │ │ │ +
51 const char* jobvl, const char* jobvr, const long
│ │ │ │ +
52 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl,
│ │ │ │ +
53 const long int* ldvl, float* vr, const long int* ldvr, float* work,
│ │ │ │ +
54 const long int* lwork, long int* info);
│ │ │ │ +
55
│ │ │ │ +
56#endif
│ │ │ │ +
57
│ │ │ │ +
58 namespace Impl {
│ │ │ │ +
59 //internal tag to activate/disable code for eigenvector calculation at compile time
│ │ │ │ +
60 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 };
│ │ │ │ +
61
│ │ │ │ +
62 //internal dummy used if only eigenvalues are to be calculated
│ │ │ │ +
63 template<typename K, int dim>
│ │ │ │ +
64 using EVDummy = FieldMatrix<K, dim, dim>;
│ │ │ │ +
65
│ │ │ │ +
66 //compute the cross-product of two vectors
│ │ │ │ +
67 template<typename K>
│ │ │ │ +
68 inline FieldVector<K,3> crossProduct(const FieldVector<K,3>& vec0, const FieldVector<K,3>& vec1) {
│ │ │ │ +
69 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]};
│ │ │ │ +
70 }
│ │ │ │ +
71
│ │ │ │ +
72 template <typename K>
│ │ │ │ +
73 static void eigenValues2dImpl(const FieldMatrix<K, 2, 2>& matrix,
│ │ │ │ +
74 FieldVector<K, 2>& eigenvalues)
│ │ │ │ +
75 {
│ │ │ │ +
76 using std::sqrt;
│ │ │ │ +
77 const K p = 0.5 * (matrix[0][0] + matrix [1][1]);
│ │ │ │ +
78 const K p2 = p - matrix[1][1];
│ │ │ │ +
79 K q = p2 * p2 + matrix[1][0] * matrix[0][1];
│ │ │ │ +
80 if( q < 0 && q > -1e-14 ) q = 0;
│ │ │ │ +
81 if (q < 0)
│ │ │ │ +
82 {
│ │ │ │ +
83 std::cout << matrix << std::endl;
│ │ │ │ +
84 // Complex eigenvalues are either caused by non-symmetric matrices or by round-off errors
│ │ │ │ +
85 DUNE_THROW(MathError, "Complex eigenvalue detected (which this implementation cannot handle).");
│ │ │ │ +
86 }
│ │ │ │ +
87
│ │ │ │ +
88 // get square root
│ │ │ │ +
89 q = sqrt(q);
│ │ │ │
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 }
│ │ │ │ +
91 // store eigenvalues in ascending order
│ │ │ │ +
92 eigenvalues[0] = p - q;
│ │ │ │ +
93 eigenvalues[1] = p + q;
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
96 /*
│ │ │ │ +
97 This implementation was adapted from the pseudo-code (Python?) implementation found on
│ │ │ │ +
98 http://en.wikipedia.org/wiki/Eigenvalue_algorithm (retrieved late August 2014).
│ │ │ │ +
99 Wikipedia claims to have taken it from
│ │ │ │ +
100 Smith, Oliver K. (April 1961), Eigenvalues of a symmetric 3 × 3 matrix.,
│ │ │ │ +
101 Communications of the ACM 4 (4): 168, doi:10.1145/355578.366316
│ │ │ │ +
102 */
│ │ │ │ +
103 template <typename K>
│ │ │ │ +
104 static K eigenValues3dImpl(const FieldMatrix<K, 3, 3>& matrix,
│ │ │ │ +
105 FieldVector<K, 3>& eigenvalues)
│ │ │ │ +
106 {
│ │ │ │ +
107 using std::sqrt;
│ │ │ │ +
108 using std::acos;
│ │ │ │ +
109 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ +
110 const K pi = MathematicalConstants<K>::pi();
│ │ │ │ +
111 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1][2]*matrix[1][2];
│ │ │ │ +
112
│ │ │ │ +
113 if (p1 <= std::numeric_limits<K>::epsilon()) {
│ │ │ │ +
114 // A is diagonal.
│ │ │ │ +
115 eigenvalues[0] = matrix[0][0];
│ │ │ │ +
116 eigenvalues[1] = matrix[1][1];
│ │ │ │ +
117 eigenvalues[2] = matrix[2][2];
│ │ │ │ +
118 std::sort(eigenvalues.begin(), eigenvalues.end());
│ │ │ │ +
119
│ │ │ │ +
120 return 0.0;
│ │ │ │ +
121 }
│ │ │ │ +
122 else
│ │ │ │ +
123 {
│ │ │ │ +
124 // q = trace(A)/3
│ │ │ │ +
125 K q = 0;
│ │ │ │ +
126 for (int i=0; i<3; i++)
│ │ │ │ +
127 q += matrix[i][i] / 3.0;
│ │ │ │ +
128
│ │ │ │ +
129 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;
│ │ │ │ +
130 K p = sqrt(p2 / 6);
│ │ │ │ +
131 // B = (1 / p) * (A - q * I); // I is the identity matrix
│ │ │ │ +
132 FieldMatrix<K,3,3> B;
│ │ │ │ +
133 for (int i=0; i<3; i++)
│ │ │ │ +
134 for (int j=0; j<3; j++)
│ │ │ │ +
135 B[i][j] = (real_type(1.0)/p) * (matrix[i][j] - q*(i==j));
│ │ │ │ +
136
│ │ │ │ +
137 K r = B.determinant() / 2.0;
│ │ │ │
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 {};
│ │ │ │ -
│ │ │ │ +
139 /*In exact arithmetic for a symmetric matrix -1 <= r <= 1
│ │ │ │ +
140 but computation error can leave it slightly outside this range.
│ │ │ │ +
141 acos(z) function requires |z| <= 1, but will fail silently
│ │ │ │ +
142 and return NaN if the input is larger than 1 in magnitude.
│ │ │ │ +
143 Thus r is clamped to [-1,1].*/
│ │ │ │ +
144 using std::clamp;
│ │ │ │ +
145 r = clamp<K>(r, -1.0, 1.0);
│ │ │ │ +
146 K phi = acos(r) / 3.0;
│ │ │ │ +
147
│ │ │ │ +
148 // the eigenvalues satisfy eig[2] <= eig[1] <= eig[0]
│ │ │ │ +
149 eigenvalues[2] = q + 2 * p * cos(phi);
│ │ │ │ +
150 eigenvalues[0] = q + 2 * p * cos(phi + (2*pi/3));
│ │ │ │ +
151 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2]; // since trace(matrix) = eig1 + eig2 + eig3
│ │ │ │ +
152
│ │ │ │ +
153 return r;
│ │ │ │ +
154 }
│ │ │ │ +
155 }
│ │ │ │ +
156
│ │ │ │ +
157 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ +
158 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
│ │ │ │ +
159 template<typename K>
│ │ │ │ +
160 void orthoComp(const FieldVector<K,3>& evec0, FieldVector<K,3>& u, FieldVector<K,3>& v) {
│ │ │ │ +
161 using std::abs;
│ │ │ │ +
162 if(abs(evec0[0]) > abs(evec0[1])) {
│ │ │ │ +
163 //The component of maximum absolute value is either evec0[0] or evec0[2].
│ │ │ │ +
164 FieldVector<K,2> temp = {evec0[0], evec0[2]};
│ │ │ │ +
165 auto L = 1.0 / temp.two_norm();
│ │ │ │ +
166 u = L * FieldVector<K,3>({-evec0[2], 0.0, evec0[0]});
│ │ │ │ +
167 }
│ │ │ │ +
168 else {
│ │ │ │ +
169 //The component of maximum absolute value is either evec0[1] or evec0[2].
│ │ │ │ +
170 FieldVector<K,2> temp = {evec0[1], evec0[2]};
│ │ │ │ +
171 auto L = 1.0 / temp.two_norm();
│ │ │ │ +
172 u = L * FieldVector<K,3>({0.0, evec0[2], -evec0[1]});
│ │ │ │ +
173 }
│ │ │ │ +
174 v = crossProduct(evec0, u);
│ │ │ │ +
175 }
│ │ │ │ +
176
│ │ │ │ +
177 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ +
178 template<typename K>
│ │ │ │ +
179 void eig0(const FieldMatrix<K,3,3>& matrix, K eval0, FieldVector<K,3>& evec0) {
│ │ │ │ +
180 /* Compute a unit-length eigenvector for eigenvalue[i0]. The
│ │ │ │ +
181 matrix is rank 2, so two of the rows are linearly independent.
│ │ │ │ +
182 For a robust computation of the eigenvector, select the two
│ │ │ │ +
183 rows whose cross product has largest length of all pairs of
│ │ │ │ +
184 rows. */
│ │ │ │ +
185 using Vector = FieldVector<K,3>;
│ │ │ │ +
186 Vector row0 = {matrix[0][0]-eval0, matrix[0][1], matrix[0][2]};
│ │ │ │ +
187 Vector row1 = {matrix[1][0], matrix[1][1]-eval0, matrix[1][2]};
│ │ │ │ +
188 Vector row2 = {matrix[2][0], matrix[2][1], matrix[2][2]-eval0};
│ │ │ │ +
189
│ │ │ │ +
190 Vector r0xr1 = crossProduct(row0, row1);
│ │ │ │ +
191 Vector r0xr2 = crossProduct(row0, row2);
│ │ │ │ +
192 Vector r1xr2 = crossProduct(row1, row2);
│ │ │ │ +
193 auto d0 = r0xr1.two_norm();
│ │ │ │ +
194 auto d1 = r0xr2.two_norm();
│ │ │ │ +
195 auto d2 = r1xr2.two_norm();
│ │ │ │ +
196
│ │ │ │ +
197 auto dmax = d0 ;
│ │ │ │ +
198 int imax = 0;
│ │ │ │ +
199 if(d1>dmax) {
│ │ │ │ +
200 dmax = d1;
│ │ │ │ +
201 imax = 1;
│ │ │ │ +
202 }
│ │ │ │ +
203 if(d2>dmax)
│ │ │ │ +
204 imax = 2;
│ │ │ │ +
205
│ │ │ │ +
206 if(imax == 0)
│ │ │ │ +
207 evec0 = r0xr1 / d0;
│ │ │ │ +
208 else if(imax == 1)
│ │ │ │ +
209 evec0 = r0xr2 / d1;
│ │ │ │ +
210 else
│ │ │ │ +
211 evec0 = r1xr2 / d2;
│ │ │ │ +
212 }
│ │ │ │ +
213
│ │ │ │ +
214 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ +
215 template<typename K>
│ │ │ │ +
216 void eig1(const FieldMatrix<K,3,3>& matrix, const FieldVector<K,3>& evec0, FieldVector<K,3>& evec1, K eval1) {
│ │ │ │ +
217 using Vector = FieldVector<K,3>;
│ │ │ │ +
218
│ │ │ │ +
219 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
│ │ │ │ +
220 Vector u,v;
│ │ │ │ +
221 orthoComp(evec0, u, v);
│ │ │ │ +
222
│ │ │ │ +
223 /* Let e be eval1 and let E be a corresponding eigenvector which
│ │ │ │ +
224 is a solution to the linear system (A - e*I)*E = 0. The matrix
│ │ │ │ +
225 (A - e*I) is 3x3, not invertible (so infinitely many
│ │ │ │ +
226 solutions), and has rank 2 when eval1 and eval are different.
│ │ │ │ +
227 It has rank 1 when eval1 and eval2 are equal. Numerically, it
│ │ │ │ +
228 is difficult to compute robustly the rank of a matrix. Instead,
│ │ │ │ +
229 the 3x3 linear system is reduced to a 2x2 system as follows.
│ │ │ │ +
230 Define the 3x2 matrix J = [u,v] whose columns are the u and v
│ │ │ │ +
231 computed previously. Define the 2x1 vector X = J*E. The 2x2
│ │ │ │ +
232 system is 0 = M * X = (J^T * (A - e*I) * J) * X where J^T is
│ │ │ │ +
233 the transpose of J and M = J^T * (A - e*I) * J is a 2x2 matrix.
│ │ │ │ +
234 The system may be written as
│ │ │ │ +
235 +- -++- -+ +- -+
│ │ │ │ +
236 | U^T*A*U - e U^T*A*V || x0 | = e * | x0 |
│ │ │ │ +
237 | V^T*A*U V^T*A*V - e || x1 | | x1 |
│ │ │ │ +
238 +- -++ -+ +- -+
│ │ │ │ +
239 where X has row entries x0 and x1. */
│ │ │ │
240
│ │ │ │ -
│ │ │ │ -
241 TransformTupleFunctor(Args&&... args)
│ │ │ │ -
242 : tup(args...)
│ │ │ │ -
243 { }
│ │ │ │ -
│ │ │ │ +
241 Vector Au, Av;
│ │ │ │ +
242 matrix.mv(u, Au);
│ │ │ │ +
243 matrix.mv(v, Av);
│ │ │ │
244
│ │ │ │ -
245 template<class T>
│ │ │ │ -
│ │ │ │ -
246 inline auto operator()(T&& t) ->
│ │ │ │ -
247 decltype(this->apply(t,std::index_sequence_for<Args...>{})) const
│ │ │ │ -
248 {
│ │ │ │ -
249 return apply(t,std::index_sequence_for<Args...>{});
│ │ │ │ -
250 }
│ │ │ │ -
│ │ │ │ -
251 };
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
253 template<template<class> class TE, class... Args>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
255 {
│ │ │ │ -
256 return TransformTupleFunctor<TE, Args...>(args...);
│ │ │ │ -
257 }
│ │ │ │ -
│ │ │ │ -
258
│ │ │ │ -
291 template<template<class> class TypeEvaluator, class Tuple, class... Args>
│ │ │ │ -
│ │ │ │ -
292 auto transformTuple(Tuple&& orig, Args&&... args) ->
│ │ │ │ -
293 decltype(genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...)))
│ │ │ │ -
294 {
│ │ │ │ -
295 return genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...));
│ │ │ │ -
296 }
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
299
│ │ │ │ -
303 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
305 {
│ │ │ │ -
306 typedef T& Type;
│ │ │ │ -
│ │ │ │ -
307 static Type apply(T& t)
│ │ │ │ -
308 {
│ │ │ │ -
309 return t;
│ │ │ │ -
310 }
│ │ │ │ -
│ │ │ │ -
311 };
│ │ │ │ -
│ │ │ │ -
312
│ │ │ │ -
314
│ │ │ │ -
318 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
320 {
│ │ │ │ -
321 typedef typename std::remove_reference<T>::type* Type;
│ │ │ │ -
│ │ │ │ -
322 static Type apply(T& t)
│ │ │ │ -
323 {
│ │ │ │ -
324 return &t;
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
326 };
│ │ │ │ -
│ │ │ │ -
327
│ │ │ │ -
328 // Specialization, in case the type is already a reference
│ │ │ │ -
329 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
331 {
│ │ │ │ -
332 typedef typename std::remove_reference<T>::type* Type;
│ │ │ │ -
│ │ │ │ -
333 static Type apply(T& t)
│ │ │ │ -
334 {
│ │ │ │ -
335 return &t;
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337 };
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
344 template<int N, class Tuple>
│ │ │ │ -
│ │ │ │ -
345 struct AtType
│ │ │ │ -
346 {
│ │ │ │ -
347 typedef typename std::tuple_element<std::tuple_size<Tuple>::value - N - 1, Tuple>::type Type;
│ │ │ │ -
348 };
│ │ │ │ -
│ │ │ │ +
245 auto m00 = u.dot(Au) - eval1;
│ │ │ │ +
246 auto m01 = u.dot(Av);
│ │ │ │ +
247 auto m11 = v.dot(Av) - eval1;
│ │ │ │ +
248
│ │ │ │ +
249 /* For robustness, choose the largest-length row of M to compute
│ │ │ │ +
250 the eigenvector. The 2-tuple of coefficients of U and V in the
│ │ │ │ +
251 assignments to eigenvector[1] lies on a circle, and U and V are
│ │ │ │ +
252 unit length and perpendicular, so eigenvector[1] is unit length
│ │ │ │ +
253 (within numerical tolerance). */
│ │ │ │ +
254 using std::abs, std::sqrt, std::max;
│ │ │ │ +
255 auto absM00 = abs(m00);
│ │ │ │ +
256 auto absM01 = abs(m01);
│ │ │ │ +
257 auto absM11 = abs(m11);
│ │ │ │ +
258 if(absM00 >= absM11) {
│ │ │ │ +
259 auto maxAbsComp = max(absM00, absM01);
│ │ │ │ +
260 if(maxAbsComp > 0.0) {
│ │ │ │ +
261 if(absM00 >= absM01) {
│ │ │ │ +
262 m01 /= m00;
│ │ │ │ +
263 m00 = 1.0 / sqrt(1.0 + m01*m01);
│ │ │ │ +
264 m01 *= m00;
│ │ │ │ +
265 }
│ │ │ │ +
266 else {
│ │ │ │ +
267 m00 /= m01;
│ │ │ │ +
268 m01 = 1.0 / sqrt(1.0 + m00*m00);
│ │ │ │ +
269 m00 *= m01;
│ │ │ │ +
270 }
│ │ │ │ +
271 evec1 = m01*u - m00*v;
│ │ │ │ +
272 }
│ │ │ │ +
273 else
│ │ │ │ +
274 evec1 = u;
│ │ │ │ +
275 }
│ │ │ │ +
276 else {
│ │ │ │ +
277 auto maxAbsComp = max(absM11, absM01);
│ │ │ │ +
278 if(maxAbsComp > 0.0) {
│ │ │ │ +
279 if(absM11 >= absM01) {
│ │ │ │ +
280 m01 /= m11;
│ │ │ │ +
281 m11 = 1.0 / sqrt(1.0 + m01*m01);
│ │ │ │ +
282 m01 *= m11;
│ │ │ │ +
283 }
│ │ │ │ +
284 else {
│ │ │ │ +
285 m11 /= m01;
│ │ │ │ +
286 m01 = 1.0 / sqrt(1.0 + m11*m11);
│ │ │ │ +
287 m11 *= m01;
│ │ │ │ +
288 }
│ │ │ │ +
289 evec1 = m11*u - m01*v;
│ │ │ │ +
290 }
│ │ │ │ +
291 else
│ │ │ │ +
292 evec1 = u;
│ │ │ │ +
293 }
│ │ │ │ +
294 }
│ │ │ │ +
295
│ │ │ │ +
296 // 1d specialization
│ │ │ │ +
297 template<Jobs Tag, typename K>
│ │ │ │ +
298 static void eigenValuesVectorsImpl(const FieldMatrix<K, 1, 1>& matrix,
│ │ │ │ +
299 FieldVector<K, 1>& eigenValues,
│ │ │ │ +
300 FieldMatrix<K, 1, 1>& eigenVectors)
│ │ │ │ +
301 {
│ │ │ │ +
302 eigenValues[0] = matrix[0][0];
│ │ │ │ +
303 if constexpr(Tag==EigenvaluesEigenvectors)
│ │ │ │ +
304 eigenVectors[0] = {1.0};
│ │ │ │ +
305 }
│ │ │ │ +
306
│ │ │ │ +
307
│ │ │ │ +
308 // 2d specialization
│ │ │ │ +
309 template <Jobs Tag, typename K>
│ │ │ │ +
310 static void eigenValuesVectorsImpl(const FieldMatrix<K, 2, 2>& matrix,
│ │ │ │ +
311 FieldVector<K, 2>& eigenValues,
│ │ │ │ +
312 FieldMatrix<K, 2, 2>& eigenVectors)
│ │ │ │ +
313 {
│ │ │ │ +
314 // Compute eigen values
│ │ │ │ +
315 Impl::eigenValues2dImpl(matrix, eigenValues);
│ │ │ │ +
316
│ │ │ │ +
317 // Compute eigenvectors by exploiting the Cayley–Hamilton theorem.
│ │ │ │ +
318 // If λ_1, λ_2 are the eigenvalues, then (A - λ_1I )(A - λ_2I ) = (A - λ_2I )(A - λ_1I ) = 0,
│ │ │ │ +
319 // so the columns of (A - λ_2I ) are annihilated by (A - λ_1I ) and vice versa.
│ │ │ │ +
320 // Assuming neither matrix is zero, the columns of each must include eigenvectors
│ │ │ │ +
321 // for the other eigenvalue. (If either matrix is zero, then A is a multiple of the
│ │ │ │ +
322 // identity and any non-zero vector is an eigenvector.)
│ │ │ │ +
323 // From: https://en.wikipedia.org/wiki/Eigenvalue_algorithm#2x2_matrices
│ │ │ │ +
324 if constexpr(Tag==EigenvaluesEigenvectors) {
│ │ │ │ +
325
│ │ │ │ +
326 // Special casing for multiples of the identity
│ │ │ │ +
327 FieldMatrix<K,2,2> temp = matrix;
│ │ │ │ +
328 temp[0][0] -= eigenValues[0];
│ │ │ │ +
329 temp[1][1] -= eigenValues[0];
│ │ │ │ +
330 if(temp.infinity_norm() <= 1e-14) {
│ │ │ │ +
331 eigenVectors[0] = {1.0, 0.0};
│ │ │ │ +
332 eigenVectors[1] = {0.0, 1.0};
│ │ │ │ +
333 }
│ │ │ │ +
334 else {
│ │ │ │ +
335 // The columns of A - λ_2I are eigenvectors for λ_1, or zero.
│ │ │ │ +
336 // Take the column with the larger norm to avoid zero columns.
│ │ │ │ +
337 FieldVector<K,2> ev0 = {matrix[0][0]-eigenValues[1], matrix[1][0]};
│ │ │ │ +
338 FieldVector<K,2> ev1 = {matrix[0][1], matrix[1][1]-eigenValues[1]};
│ │ │ │ +
339 eigenVectors[0] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
│ │ │ │ +
340
│ │ │ │ +
341 // The columns of A - λ_1I are eigenvectors for λ_2, or zero.
│ │ │ │ +
342 // Take the column with the larger norm to avoid zero columns.
│ │ │ │ +
343 ev0 = {matrix[0][0]-eigenValues[0], matrix[1][0]};
│ │ │ │ +
344 ev1 = {matrix[0][1], matrix[1][1]-eigenValues[0]};
│ │ │ │ +
345 eigenVectors[1] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
│ │ │ │ +
346 }
│ │ │ │ +
347 }
│ │ │ │ +
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 };
│ │ │ │ -
│ │ │ │ +
350 // 3d specialization
│ │ │ │ +
351 template <Jobs Tag, typename K>
│ │ │ │ +
352 static void eigenValuesVectorsImpl(const FieldMatrix<K, 3, 3>& matrix,
│ │ │ │ +
353 FieldVector<K, 3>& eigenValues,
│ │ │ │ +
354 FieldMatrix<K, 3, 3>& eigenVectors)
│ │ │ │ +
355 {
│ │ │ │ +
356 using Vector = FieldVector<K,3>;
│ │ │ │ +
357 using Matrix = FieldMatrix<K,3,3>;
│ │ │ │ +
358
│ │ │ │ +
359 //compute eigenvalues
│ │ │ │ +
360 /* Precondition the matrix by factoring out the maximum absolute
│ │ │ │ +
361 value of the components. This guards against floating-point
│ │ │ │ +
362 overflow when computing the eigenvalues.*/
│ │ │ │ +
363 using std::isnormal;
│ │ │ │ +
364 K maxAbsElement = (isnormal(matrix.infinity_norm())) ? matrix.infinity_norm() : K(1.0);
│ │ │ │ +
365 Matrix scaledMatrix = matrix / maxAbsElement;
│ │ │ │ +
366 K r = Impl::eigenValues3dImpl(scaledMatrix, eigenValues);
│ │ │ │ +
367
│ │ │ │ +
368 if constexpr(Tag==EigenvaluesEigenvectors) {
│ │ │ │ +
369 K offDiagNorm = Vector{scaledMatrix[0][1],scaledMatrix[0][2],scaledMatrix[1][2]}.two_norm2();
│ │ │ │ +
370 if (offDiagNorm <= std::numeric_limits<K>::epsilon())
│ │ │ │ +
371 {
│ │ │ │ +
372 eigenValues = {scaledMatrix[0][0], scaledMatrix[1][1], scaledMatrix[2][2]};
│ │ │ │ +
373 eigenVectors = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
│ │ │ │
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 };
│ │ │ │ -
│ │ │ │ +
375 // Use bubble sort to jointly sort eigenvalues and eigenvectors
│ │ │ │ +
376 // such that eigenvalues are ascending
│ │ │ │ +
377 if (eigenValues[0] > eigenValues[1])
│ │ │ │ +
378 {
│ │ │ │ +
379 std::swap(eigenValues[0], eigenValues[1]);
│ │ │ │ +
380 std::swap(eigenVectors[0], eigenVectors[1]);
│ │ │ │ +
381 }
│ │ │ │ +
382 if (eigenValues[1] > eigenValues[2])
│ │ │ │ +
383 {
│ │ │ │ +
384 std::swap(eigenValues[1], eigenValues[2]);
│ │ │ │ +
385 std::swap(eigenVectors[1], eigenVectors[2]);
│ │ │ │ +
386 }
│ │ │ │ +
387 if (eigenValues[0] > eigenValues[1])
│ │ │ │ +
388 {
│ │ │ │ +
389 std::swap(eigenValues[0], eigenValues[1]);
│ │ │ │ +
390 std::swap(eigenVectors[0], eigenVectors[1]);
│ │ │ │ +
391 }
│ │ │ │ +
392 }
│ │ │ │ +
393 else {
│ │ │ │ +
394 /*Compute the eigenvectors so that the set
│ │ │ │ +
395 [evec[0], evec[1], evec[2]] is right handed and
│ │ │ │ +
396 orthonormal. */
│ │ │ │ +
397
│ │ │ │ +
398 Matrix evec(0.0);
│ │ │ │ +
399 Vector eval(eigenValues);
│ │ │ │ +
400 if(r >= 0) {
│ │ │ │ +
401 Impl::eig0(scaledMatrix, eval[2], evec[2]);
│ │ │ │ +
402 Impl::eig1(scaledMatrix, evec[2], evec[1], eval[1]);
│ │ │ │ +
403 evec[0] = Impl::crossProduct(evec[1], evec[2]);
│ │ │ │ +
404 }
│ │ │ │ +
405 else {
│ │ │ │ +
406 Impl::eig0(scaledMatrix, eval[0], evec[0]);
│ │ │ │ +
407 Impl::eig1(scaledMatrix, evec[0], evec[1], eval[1]);
│ │ │ │ +
408 evec[2] = Impl::crossProduct(evec[0], evec[1]);
│ │ │ │ +
409 }
│ │ │ │ +
410 //sort eval/evec-pairs in ascending order
│ │ │ │ +
411 using EVPair = std::pair<K, Vector>;
│ │ │ │ +
412 std::vector<EVPair> pairs;
│ │ │ │ +
413 for(std::size_t i=0; i<=2; ++i)
│ │ │ │ +
414 pairs.push_back(EVPair(eval[i], evec[i]));
│ │ │ │ +
415 auto comp = [](EVPair x, EVPair y){ return x.first < y.first; };
│ │ │ │ +
416 std::sort(pairs.begin(), pairs.end(), comp);
│ │ │ │ +
417 for(std::size_t i=0; i<=2; ++i){
│ │ │ │ +
418 eigenValues[i] = pairs[i].first;
│ │ │ │ +
419 eigenVectors[i] = pairs[i].second;
│ │ │ │ +
420 }
│ │ │ │ +
421 }
│ │ │ │ +
422 }
│ │ │ │ +
423 //The preconditioning scaled the matrix, which scales the eigenvalues. Revert the scaling.
│ │ │ │ +
424 eigenValues *= maxAbsElement;
│ │ │ │ +
425 }
│ │ │ │ +
426
│ │ │ │ +
427 // forwarding to LAPACK with corresponding tag
│ │ │ │ +
428 template <Jobs Tag, int dim, typename K>
│ │ │ │ +
429 static void eigenValuesVectorsLapackImpl(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ +
430 FieldVector<K, dim>& eigenValues,
│ │ │ │ +
431 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ +
432 {
│ │ │ │ +
433 {
│ │ │ │ +
434#if HAVE_LAPACK
│ │ │ │ +
435 /*Lapack uses a proprietary tag to determine whether both eigenvalues and
│ │ │ │ +
436 -vectors ('v') or only eigenvalues ('n') should be calculated */
│ │ │ │ +
437 const char jobz = "nv"[Tag];
│ │ │ │ +
438
│ │ │ │ +
439 const long int N = dim ;
│ │ │ │ +
440 const char uplo = 'u'; // use upper triangular matrix
│ │ │ │ +
441
│ │ │ │ +
442 // length of matrix vector, LWORK >= max(1,3*N-1)
│ │ │ │ +
443 const long int lwork = 3*N -1 ;
│ │ │ │ +
444
│ │ │ │ +
445 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
│ │ │ │ +
446 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
│ │ │ │ +
447
│ │ │ │ +
448 // matrix to put into dsyev
│ │ │ │ +
449 LapackNumType matrixVector[dim * dim];
│ │ │ │
450
│ │ │ │ -
464 template<class Tuple, class T, std::size_t start = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
466 public FirstPredicateIndex<Tuple, IsType<T>::template Predicate, start>
│ │ │ │ -
467 { };
│ │ │ │ -
│ │ │ │ -
468
│ │ │ │ -
475 template<class Tuple, class T>
│ │ │ │ - │ │ │ │ -
477
│ │ │ │ -
478 template<class... Args, class T>
│ │ │ │ -
│ │ │ │ -
479 struct PushBackTuple<typename std::tuple<Args...>, T>
│ │ │ │ -
480 {
│ │ │ │ -
481 typedef typename std::tuple<Args..., T> type;
│ │ │ │ -
482 };
│ │ │ │ -
│ │ │ │ -
483
│ │ │ │ -
490 template<class Tuple, class T>
│ │ │ │ - │ │ │ │ -
492
│ │ │ │ -
493 template<class... Args, class T>
│ │ │ │ -
│ │ │ │ -
494 struct PushFrontTuple<typename std::tuple<Args...>, T>
│ │ │ │ -
495 {
│ │ │ │ -
496 typedef typename std::tuple<T, Args...> type;
│ │ │ │ -
497 };
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
511 template<
│ │ │ │ -
512 template <class, class> class F,
│ │ │ │ -
513 class Tuple,
│ │ │ │ -
514 class Seed=std::tuple<>,
│ │ │ │ -
515 int N=std::tuple_size<Tuple>::value>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
517 {
│ │ │ │ -
518 typedef typename ReduceTuple<F, Tuple, Seed, N-1>::type Accumulated;
│ │ │ │ -
519 typedef typename std::tuple_element<N-1, Tuple>::type Value;
│ │ │ │ -
520
│ │ │ │ -
522 typedef typename F<Accumulated, Value>::type type;
│ │ │ │ -
523 };
│ │ │ │ -
│ │ │ │ -
524
│ │ │ │ -
535 template<
│ │ │ │ -
536 template <class, class> class F,
│ │ │ │ -
537 class Tuple,
│ │ │ │ -
538 class Seed>
│ │ │ │ -
│ │ │ │ -
539 struct ReduceTuple<F, Tuple, Seed, 0>
│ │ │ │ -
540 {
│ │ │ │ -
542 typedef Seed type;
│ │ │ │ -
543 };
│ │ │ │ -
│ │ │ │ -
544
│ │ │ │ -
554 template<class Head, class Tail>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
556 {
│ │ │ │ - │ │ │ │ -
559 };
│ │ │ │ -
│ │ │ │ -
560
│ │ │ │ -
569 template<class Tuple>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
571 {
│ │ │ │ - │ │ │ │ -
574 };
│ │ │ │ -
│ │ │ │ -
575
│ │ │ │ -
577}
│ │ │ │ -
578
│ │ │ │ -
579#endif
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ - │ │ │ │ -
std::add_const< T >::type & ConstType
Definition tupleutility.hh:50
│ │ │ │ -
static void apply(std::tuple< Ts... > &t)
Definition tupleutility.hh:382
│ │ │ │ -
T * ParameterType
Definition tupleutility.hh:60
│ │ │ │ -
auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
Definition tupleutility.hh:292
│ │ │ │ -
T & ConstType
Definition tupleutility.hh:66
│ │ │ │ -
ReduceTuple< F, Tuple, Seed, N-1 >::type Accumulated
Definition tupleutility.hh:518
│ │ │ │ -
T * NonConstType
Definition tupleutility.hh:59
│ │ │ │ -
Seed type
Result of the reduce operation.
Definition tupleutility.hh:542
│ │ │ │ -
std::remove_reference< T >::type * Type
Definition tupleutility.hh:321
│ │ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:307
│ │ │ │ -
static ResultType apply()
Definition tupleutility.hh:85
│ │ │ │ -
std::tuple< Args... > ResultType
Definition tupleutility.hh:84
│ │ │ │ -
std::remove_reference< T >::type * Type
Definition tupleutility.hh:332
│ │ │ │ -
TransformTupleFunctor(Args &&... args)
Definition tupleutility.hh:241
│ │ │ │ -
std::tuple_element< std::tuple_size< Tuple >::value-N-1, Tuple >::type Type
Definition tupleutility.hh:347
│ │ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:333
│ │ │ │ -
auto operator()(T &&t) -> decltype(this->apply(t, std::index_sequence_for< Args... >{})) const
Definition tupleutility.hh:246
│ │ │ │ -
T & NonConstType
Definition tupleutility.hh:67
│ │ │ │ -
T & NonConstType
Definition tupleutility.hh:51
│ │ │ │ -
static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::ConstType get(const Tuple &t)
Definition tupleutility.hh:369
│ │ │ │ -
T & Type
Definition tupleutility.hh:306
│ │ │ │ -
static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::NonConstType get(Tuple &t)
Definition tupleutility.hh:362
│ │ │ │ -
std::tuple< Args..., T > type
Definition tupleutility.hh:481
│ │ │ │ -
std::tuple_element< N-1, Tuple >::type Value
Definition tupleutility.hh:519
│ │ │ │ -
std::tuple< T, Args... > type
Definition tupleutility.hh:496
│ │ │ │ -
ReduceTuple< JoinTuples, Tuple >::type type
Result of the flatten operation.
Definition tupleutility.hh:573
│ │ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:322
│ │ │ │ -
F< Accumulated, Value >::type type
Result of the reduce operation.
Definition tupleutility.hh:522
│ │ │ │ -
ReduceTuple< PushBackTuple, Tail, Head >::type type
Result of the join operation.
Definition tupleutility.hh:558
│ │ │ │ -
std::tuple< typename TE< Args >::Type... > Type
Definition tupleutility.hh:121
│ │ │ │ -
auto genericTransformTuple(Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
Definition tupleutility.hh:186
│ │ │ │ -
decltype(auto) applyPartial(F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
Apply function with arguments from a given tuple.
Definition tupleutility.hh:42
│ │ │ │ -
T & ParameterType
Definition tupleutility.hh:68
│ │ │ │ -
const std::remove_const< T >::type & ParameterType
Definition tupleutility.hh:52
│ │ │ │ -
std::add_const< T >::type * ConstType
Definition tupleutility.hh:58
│ │ │ │ -
TransformTupleFunctor< TE, Args... > makeTransformTupleFunctor(Args &&... args)
Definition tupleutility.hh:254
│ │ │ │ -
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition hybridutilities.hh:256
│ │ │ │ -
STL namespace.
│ │ │ │ +
451 // copy matrix
│ │ │ │ +
452 int row = 0;
│ │ │ │ +
453 for(int i=0; i<dim; ++i)
│ │ │ │ +
454 {
│ │ │ │ +
455 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ +
456 {
│ │ │ │ +
457 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ +
458 }
│ │ │ │ +
459 }
│ │ │ │ +
460
│ │ │ │ +
461 // working memory
│ │ │ │ +
462 LapackNumType workSpace[lwork];
│ │ │ │ +
463
│ │ │ │ +
464 // return value information
│ │ │ │ +
465 long int info = 0;
│ │ │ │ +
466 LapackNumType* ev;
│ │ │ │ +
467 if constexpr (isKLapackType){
│ │ │ │ +
468 ev = &eigenValues[0];
│ │ │ │ +
469 }else{
│ │ │ │ +
470 ev = new LapackNumType[dim];
│ │ │ │ +
471 }
│ │ │ │ +
472
│ │ │ │ +
473 // call LAPACK routine (see fmatrixev.cc)
│ │ │ │ +
474 eigenValuesLapackCall(&jobz, &uplo, &N, &matrixVector[0], &N,
│ │ │ │ +
475 ev, &workSpace[0], &lwork, &info);
│ │ │ │ +
476
│ │ │ │ +
477 if constexpr (!isKLapackType){
│ │ │ │ +
478 for(size_t i=0;i<dim;++i)
│ │ │ │ +
479 eigenValues[i] = ev[i];
│ │ │ │ +
480 delete[] ev;
│ │ │ │ +
481 }
│ │ │ │ +
482
│ │ │ │ +
483 // restore eigenvectors matrix
│ │ │ │ +
484 if (Tag==Jobs::EigenvaluesEigenvectors){
│ │ │ │ +
485 row = 0;
│ │ │ │ +
486 for(int i=0; i<dim; ++i)
│ │ │ │ +
487 {
│ │ │ │ +
488 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ +
489 {
│ │ │ │ +
490 eigenVectors[ i ][ j ] = matrixVector[ row ];
│ │ │ │ +
491 }
│ │ │ │ +
492 }
│ │ │ │ +
493 }
│ │ │ │ +
494
│ │ │ │ +
495 if( info != 0 )
│ │ │ │ +
496 {
│ │ │ │ +
497 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ +
498 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ +
499 }
│ │ │ │ +
500#else
│ │ │ │ +
501 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ +
502#endif
│ │ │ │ +
503 }
│ │ │ │ +
504 }
│ │ │ │ +
505
│ │ │ │ +
506 // generic specialization
│ │ │ │ +
507 template <Jobs Tag, int dim, typename K>
│ │ │ │ +
508 static void eigenValuesVectorsImpl(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ +
509 FieldVector<K, dim>& eigenValues,
│ │ │ │ +
510 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ +
511 {
│ │ │ │ +
512 eigenValuesVectorsLapackImpl<Tag>(matrix,eigenValues,eigenVectors);
│ │ │ │ +
513 }
│ │ │ │ +
514 } //namespace Impl
│ │ │ │ +
515
│ │ │ │ +
523 template <int dim, typename K>
│ │ │ │ +
│ │ │ │ +
524 static void eigenValues(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ + │ │ │ │ +
526 {
│ │ │ │ + │ │ │ │ +
528 Impl::eigenValuesVectorsImpl<Impl::Jobs::OnlyEigenvalues>(matrix, eigenValues, dummy);
│ │ │ │ +
529 }
│ │ │ │ +
│ │ │ │ +
530
│ │ │ │ +
539 template <int dim, typename K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
542 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ +
543 {
│ │ │ │ +
544 Impl::eigenValuesVectorsImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
│ │ │ │ +
545 }
│ │ │ │ +
│ │ │ │ +
546
│ │ │ │ +
554 template <int dim, typename K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
557 {
│ │ │ │ + │ │ │ │ +
559 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, dummy);
│ │ │ │ +
560 }
│ │ │ │ +
│ │ │ │ +
561
│ │ │ │ +
570 template <int dim, typename K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
573 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ +
574 {
│ │ │ │ +
575 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
│ │ │ │ +
576 }
│ │ │ │ +
│ │ │ │ +
577
│ │ │ │ +
585 template <int dim, typename K, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
588 {
│ │ │ │ +
589#if HAVE_LAPACK
│ │ │ │ +
590 {
│ │ │ │ +
591 const long int N = dim ;
│ │ │ │ +
592 const char jobvl = 'n';
│ │ │ │ +
593 const char jobvr = 'n';
│ │ │ │ +
594
│ │ │ │ +
595 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
│ │ │ │ +
596 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
│ │ │ │ +
597
│ │ │ │ +
598 // matrix to put into dgeev
│ │ │ │ +
599 LapackNumType matrixVector[dim * dim];
│ │ │ │ +
600
│ │ │ │ +
601 // copy matrix
│ │ │ │ +
602 int row = 0;
│ │ │ │ +
603 for(int i=0; i<dim; ++i)
│ │ │ │ +
604 {
│ │ │ │ +
605 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ +
606 {
│ │ │ │ +
607 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ +
608 }
│ │ │ │ +
609 }
│ │ │ │ +
610
│ │ │ │ +
611 // working memory
│ │ │ │ +
612 LapackNumType eigenR[dim];
│ │ │ │ +
613 LapackNumType eigenI[dim];
│ │ │ │ +
614 LapackNumType work[3*dim];
│ │ │ │ +
615
│ │ │ │ +
616 // return value information
│ │ │ │ +
617 long int info = 0;
│ │ │ │ +
618 const long int lwork = 3*dim;
│ │ │ │ +
619
│ │ │ │ +
620 // call LAPACK routine (see fmatrixev_ext.cc)
│ │ │ │ +
621 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, &matrixVector[0], &N,
│ │ │ │ +
622 &eigenR[0], &eigenI[0], nullptr, &N, nullptr, &N, &work[0],
│ │ │ │ +
623 &lwork, &info);
│ │ │ │ +
624
│ │ │ │ +
625 if( info != 0 )
│ │ │ │ +
626 {
│ │ │ │ +
627 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ +
628 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ +
629 }
│ │ │ │ +
630 for (int i=0; i<N; ++i) {
│ │ │ │ +
631 eigenValues[i].real = eigenR[i];
│ │ │ │ +
632 eigenValues[i].imag = eigenI[i];
│ │ │ │ +
633 }
│ │ │ │ +
634 }
│ │ │ │ +
635#else
│ │ │ │ +
636 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ +
637#endif
│ │ │ │ +
638 }
│ │ │ │ +
│ │ │ │ +
639 } // end namespace FMatrixHelp
│ │ │ │ +
640
│ │ │ │ +
643} // end namespace Dune
│ │ │ │ +
644#endif
│ │ │ │ +
Some useful basic math stuff.
│ │ │ │ +
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ +
constexpr auto max
Function object that returns the greater of the given values.
Definition hybridutilities.hh:484
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ │
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ │ -
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
│ │ │ │ -
Definition tupleutility.hh:49
│ │ │ │ -
A helper template that initializes a std::tuple consisting of pointers to nullptr.
Definition tupleutility.hh:79
│ │ │ │ -
Helper template to clone the type definition of a std::tuple with the storage types replaced by a use...
Definition tupleutility.hh:116
│ │ │ │ -
Definition tupleutility.hh:226
│ │ │ │ -
Definition tupleutility.hh:239
│ │ │ │ -
TypeEvaluator to turn a type T into a reference to T
Definition tupleutility.hh:305
│ │ │ │ -
TypeEvaluator to turn a type T into a pointer to T
Definition tupleutility.hh:320
│ │ │ │ -
Type for reverse element access.
Definition tupleutility.hh:346
│ │ │ │ -
Reverse element access.
Definition tupleutility.hh:359
│ │ │ │ -
Deletes all objects pointed to in a std::tuple of pointers.
Definition tupleutility.hh:380
│ │ │ │ -
Finding the index of a certain type in a std::tuple.
Definition tupleutility.hh:418
│ │ │ │ -
Generator for predicates accepting one particular type.
Definition tupleutility.hh:445
│ │ │ │ -
The actual predicate.
Definition tupleutility.hh:448
│ │ │ │ -
Find the first occurrence of a type in a std::tuple.
Definition tupleutility.hh:467
│ │ │ │ -
Helper template to append a type to a std::tuple.
Definition tupleutility.hh:476
│ │ │ │ -
Helper template to prepend a type to a std::tuple.
Definition tupleutility.hh:491
│ │ │ │ -
Apply reduce with meta binary function to template.
Definition tupleutility.hh:517
│ │ │ │ -
Join two std::tuple's.
Definition tupleutility.hh:556
│ │ │ │ -
Flatten a std::tuple of std::tuple's.
Definition tupleutility.hh:571
│ │ │ │ -
template which always yields a false value
Definition typetraits.hh:124
│ │ │ │ +
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:586
│ │ │ │ +
static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition fmatrixev.hh:524
│ │ │ │ +
static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition fmatrixev.hh:555
│ │ │ │ +
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:540
│ │ │ │ +
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:571
│ │ │ │ +
A dense n x m matrix.
Definition fmatrix.hh:117
│ │ │ │ +
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ │ +
Default exception for dummy implementations.
Definition exceptions.hh:263
│ │ │ │ +
Default exception if a function was called while the object is not in a valid state for that function...
Definition exceptions.hh:281
│ │ │ │ +
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ │ +
static const Field pi()
Archimedes' constant.
Definition math.hh:48
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,520 +1,710 @@ │ │ │ │ │ dune-common 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -tupleutility.hh │ │ │ │ │ +fmatrixev.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_TUPLE_UTILITY_HH │ │ │ │ │ -7#define DUNE_TUPLE_UTILITY_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -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> │ │ │ │ │ +5#ifndef DUNE_FMATRIXEIGENVALUES_HH │ │ │ │ │ +6#define DUNE_FMATRIXEIGENVALUES_HH │ │ │ │ │ +7 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 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 }; │ │ │ │ │ +17#include // HAVE_LAPACK │ │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_m_a_t_r_i_x_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_h_._h_h> │ │ │ │ │ +22 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24 │ │ │ │ │ +30 namespace FMatrixHelp { │ │ │ │ │ +31 │ │ │ │ │ +32#if HAVE_LAPACK │ │ │ │ │ +33 // defined in fmatrixev.cc │ │ │ │ │ +34 extern void eigenValuesLapackCall( │ │ │ │ │ +35 const char* jobz, const char* uplo, const long │ │ │ │ │ +36 int* n, double* a, const long int* lda, double* w, │ │ │ │ │ +37 double* work, const long int* lwork, long int* info); │ │ │ │ │ +38 │ │ │ │ │ +39 extern void eigenValuesNonsymLapackCall( │ │ │ │ │ +40 const char* jobvl, const char* jobvr, const long │ │ │ │ │ +41 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl, │ │ │ │ │ +42 const long int* ldvl, double* vr, const long int* ldvr, double* work, │ │ │ │ │ +43 const long int* lwork, long int* info); │ │ │ │ │ +44 │ │ │ │ │ +45 extern void eigenValuesLapackCall( │ │ │ │ │ +46 const char* jobz, const char* uplo, const long │ │ │ │ │ +47 int* n, float* a, const long int* lda, float* w, │ │ │ │ │ +48 float* work, const long int* lwork, long int* info); │ │ │ │ │ +49 │ │ │ │ │ +50 extern void eigenValuesNonsymLapackCall( │ │ │ │ │ +51 const char* jobvl, const char* jobvr, const long │ │ │ │ │ +52 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl, │ │ │ │ │ +53 const long int* ldvl, float* vr, const long int* ldvr, float* work, │ │ │ │ │ +54 const long int* lwork, long int* info); │ │ │ │ │ +55 │ │ │ │ │ +56#endif │ │ │ │ │ +57 │ │ │ │ │ +58 namespace Impl { │ │ │ │ │ +59 //internal tag to activate/disable code for eigenvector calculation at │ │ │ │ │ +compile time │ │ │ │ │ +60 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 }; │ │ │ │ │ +61 │ │ │ │ │ +62 //internal dummy used if only eigenvalues are to be calculated │ │ │ │ │ +63 template │ │ │ │ │ +64 using EVDummy = FieldMatrix; │ │ │ │ │ +65 │ │ │ │ │ +66 //compute the cross-product of two vectors │ │ │ │ │ +67 template │ │ │ │ │ +68 inline FieldVector crossProduct(const FieldVector& vec0, const │ │ │ │ │ +FieldVector& vec1) { │ │ │ │ │ +69 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]}; │ │ │ │ │ +70 } │ │ │ │ │ +71 │ │ │ │ │ +72 template │ │ │ │ │ +73 static void eigenValues2dImpl(const FieldMatrix& matrix, │ │ │ │ │ +74 FieldVector& eigenvalues) │ │ │ │ │ +75 { │ │ │ │ │ +76 using std::sqrt; │ │ │ │ │ +77 const K p = 0.5 * (matrix[0][0] + matrix [1][1]); │ │ │ │ │ +78 const K p2 = p - matrix[1][1]; │ │ │ │ │ +79 K q = p2 * p2 + matrix[1][0] * matrix[0][1]; │ │ │ │ │ +80 if( q < 0 && q > -1e-14 ) q = 0; │ │ │ │ │ +81 if (q < 0) │ │ │ │ │ +82 { │ │ │ │ │ +83 std::cout << matrix << std::endl; │ │ │ │ │ +84 // Complex eigenvalues are either caused by non-symmetric matrices or by │ │ │ │ │ +round-off errors │ │ │ │ │ +85 _D_U_N_E___T_H_R_O_W(MathError, "Complex eigenvalue detected (which this │ │ │ │ │ +implementation cannot handle)."); │ │ │ │ │ +86 } │ │ │ │ │ +87 │ │ │ │ │ +88 // get square root │ │ │ │ │ +89 q = sqrt(q); │ │ │ │ │ 90 │ │ │ │ │ -115 template