{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.pznnKZeu/b1/dune-typetree_2.10.0-1_i386.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.pznnKZeu/b2/dune-typetree_2.10.0-1_i386.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,3 +1,3 @@\n \n ce0b7fa64850eb7d006b9b95c79aeb20 41688 libdevel optional libdune-typetree-dev_2.10.0-1_i386.deb\n- ad002fc80a7b8107846da20bd79b5eec 991664 doc optional libdune-typetree-doc_2.10.0-1_all.deb\n+ 9f47ccf927c2512b5efbc8e908a73ff7 991672 doc optional libdune-typetree-doc_2.10.0-1_all.deb\n"}, {"source1": "libdune-typetree-doc_2.10.0-1_all.deb", "source2": "libdune-typetree-doc_2.10.0-1_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2024-11-14 20:30:42.000000 debian-binary\n--rw-r--r-- 0 0 0 9644 2024-11-14 20:30:42.000000 control.tar.xz\n--rw-r--r-- 0 0 0 981828 2024-11-14 20:30:42.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 9636 2024-11-14 20:30:42.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 981844 2024-11-14 20:30:42.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -5,68 +5,68 @@\n drwxr-xr-x 0 root (0) root (0) 0 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/\n -rw-r--r-- 0 root (0) root (0) 885 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/changelog.Debian.gz\n -rw-r--r-- 0 root (0) root (0) 2679 2024-09-05 06:40:04.000000 ./usr/share/doc/libdune-typetree-doc/changelog.gz\n -rw-r--r-- 0 root (0) root (0) 3031 2023-01-12 15:07:35.000000 ./usr/share/doc/libdune-typetree-doc/copyright\n drwxr-xr-x 0 root (0) root (0) 0 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/\n -rw-r--r-- 0 root (0) root (0) 3048 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00002.html\n -rw-r--r-- 0 root (0) root (0) 3046 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00005.html\n--rw-r--r-- 0 root (0) root (0) 9728 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00008.html\n--rw-r--r-- 0 root (0) root (0) 67498 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00008_source.html\n--rw-r--r-- 0 root (0) root (0) 17215 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00011.html\n--rw-r--r-- 0 root (0) root (0) 73690 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00011_source.html\n--rw-r--r-- 0 root (0) root (0) 11111 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00014.html\n--rw-r--r-- 0 root (0) root (0) 56098 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00014_source.html\n--rw-r--r-- 0 root (0) root (0) 6911 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00017.html\n--rw-r--r-- 0 root (0) root (0) 15988 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00017_source.html\n--rw-r--r-- 0 root (0) root (0) 6860 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00020.html\n--rw-r--r-- 0 root (0) root (0) 87521 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00020_source.html\n--rw-r--r-- 0 root (0) root (0) 5150 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00023.html\n--rw-r--r-- 0 root (0) root (0) 32708 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00023_source.html\n--rw-r--r-- 0 root (0) root (0) 5910 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00026.html\n--rw-r--r-- 0 root (0) root (0) 48639 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00026_source.html\n--rw-r--r-- 0 root (0) root (0) 8712 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00029.html\n--rw-r--r-- 0 root (0) root (0) 19409 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00029_source.html\n--rw-r--r-- 0 root (0) root (0) 15110 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00032.html\n--rw-r--r-- 0 root (0) root (0) 97993 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00032_source.html\n--rw-r--r-- 0 root (0) root (0) 7399 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00035.html\n--rw-r--r-- 0 root (0) root (0) 41519 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00035_source.html\n--rw-r--r-- 0 root (0) root (0) 6195 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00038.html\n--rw-r--r-- 0 root (0) root (0) 68730 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00038_source.html\n--rw-r--r-- 0 root (0) root (0) 37497 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00041.html\n--rw-r--r-- 0 root (0) root (0) 127500 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00041_source.html\n--rw-r--r-- 0 root (0) root (0) 15418 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00044.html\n--rw-r--r-- 0 root (0) root (0) 53520 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00044_source.html\n--rw-r--r-- 0 root (0) root (0) 5534 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00047.html\n--rw-r--r-- 0 root (0) root (0) 38082 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00047_source.html\n--rw-r--r-- 0 root (0) root (0) 3695 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00050.html\n--rw-r--r-- 0 root (0) root (0) 5943 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00050_source.html\n--rw-r--r-- 0 root (0) root (0) 10552 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00053.html\n--rw-r--r-- 0 root (0) root (0) 47000 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00053_source.html\n--rw-r--r-- 0 root (0) root (0) 6234 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00056.html\n--rw-r--r-- 0 root (0) root (0) 9310 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00056_source.html\n--rw-r--r-- 0 root (0) root (0) 4850 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00059.html\n--rw-r--r-- 0 root (0) root (0) 9300 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00059_source.html\n--rw-r--r-- 0 root (0) root (0) 8737 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00062.html\n--rw-r--r-- 0 root (0) root (0) 57453 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00062_source.html\n--rw-r--r-- 0 root (0) root (0) 7065 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00065.html\n--rw-r--r-- 0 root (0) root (0) 26864 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00065_source.html\n--rw-r--r-- 0 root (0) root (0) 5126 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00068.html\n--rw-r--r-- 0 root (0) root (0) 13808 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00068_source.html\n--rw-r--r-- 0 root (0) root (0) 6050 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00071.html\n--rw-r--r-- 0 root (0) root (0) 48822 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00071_source.html\n--rw-r--r-- 0 root (0) root (0) 11231 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00074.html\n--rw-r--r-- 0 root (0) root (0) 43487 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00074_source.html\n--rw-r--r-- 0 root (0) root (0) 5604 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00077.html\n--rw-r--r-- 0 root (0) root (0) 39473 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00077_source.html\n--rw-r--r-- 0 root (0) root (0) 13745 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00080.html\n--rw-r--r-- 0 root (0) root (0) 52788 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00080_source.html\n--rw-r--r-- 0 root (0) root (0) 7479 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00083.html\n--rw-r--r-- 0 root (0) root (0) 17526 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00083_source.html\n--rw-r--r-- 0 root (0) root (0) 5212 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00086.html\n--rw-r--r-- 0 root (0) root (0) 7085 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00086_source.html\n+-rw-r--r-- 0 root (0) root (0) 15418 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00008.html\n+-rw-r--r-- 0 root (0) root (0) 53520 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00008_source.html\n+-rw-r--r-- 0 root (0) root (0) 6234 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00011.html\n+-rw-r--r-- 0 root (0) root (0) 9310 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00011_source.html\n+-rw-r--r-- 0 root (0) root (0) 10552 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00014.html\n+-rw-r--r-- 0 root (0) root (0) 47000 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00014_source.html\n+-rw-r--r-- 0 root (0) root (0) 5126 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00017.html\n+-rw-r--r-- 0 root (0) root (0) 13808 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00017_source.html\n+-rw-r--r-- 0 root (0) root (0) 5534 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00020.html\n+-rw-r--r-- 0 root (0) root (0) 38082 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00020_source.html\n+-rw-r--r-- 0 root (0) root (0) 9728 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00023.html\n+-rw-r--r-- 0 root (0) root (0) 67498 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00023_source.html\n+-rw-r--r-- 0 root (0) root (0) 6195 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00026.html\n+-rw-r--r-- 0 root (0) root (0) 68730 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00026_source.html\n+-rw-r--r-- 0 root (0) root (0) 7399 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00029.html\n+-rw-r--r-- 0 root (0) root (0) 41519 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00029_source.html\n+-rw-r--r-- 0 root (0) root (0) 13745 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00032.html\n+-rw-r--r-- 0 root (0) root (0) 52788 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00032_source.html\n+-rw-r--r-- 0 root (0) root (0) 17215 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00035.html\n+-rw-r--r-- 0 root (0) root (0) 73690 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00035_source.html\n+-rw-r--r-- 0 root (0) root (0) 6050 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00038.html\n+-rw-r--r-- 0 root (0) root (0) 48822 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00038_source.html\n+-rw-r--r-- 0 root (0) root (0) 3695 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00041.html\n+-rw-r--r-- 0 root (0) root (0) 5943 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00041_source.html\n+-rw-r--r-- 0 root (0) root (0) 11111 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00044.html\n+-rw-r--r-- 0 root (0) root (0) 56098 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00044_source.html\n+-rw-r--r-- 0 root (0) root (0) 6911 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00047.html\n+-rw-r--r-- 0 root (0) root (0) 15988 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00047_source.html\n+-rw-r--r-- 0 root (0) root (0) 37497 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00050.html\n+-rw-r--r-- 0 root (0) root (0) 127500 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00050_source.html\n+-rw-r--r-- 0 root (0) root (0) 8712 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00053.html\n+-rw-r--r-- 0 root (0) root (0) 19409 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00053_source.html\n+-rw-r--r-- 0 root (0) root (0) 8737 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00056.html\n+-rw-r--r-- 0 root (0) root (0) 57453 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00056_source.html\n+-rw-r--r-- 0 root (0) root (0) 5910 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00059.html\n+-rw-r--r-- 0 root (0) root (0) 48639 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00059_source.html\n+-rw-r--r-- 0 root (0) root (0) 6860 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00062.html\n+-rw-r--r-- 0 root (0) root (0) 87521 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00062_source.html\n+-rw-r--r-- 0 root (0) root (0) 15110 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00065.html\n+-rw-r--r-- 0 root (0) root (0) 97993 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00065_source.html\n+-rw-r--r-- 0 root (0) root (0) 7065 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00068.html\n+-rw-r--r-- 0 root (0) root (0) 26864 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00068_source.html\n+-rw-r--r-- 0 root (0) root (0) 5604 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00071.html\n+-rw-r--r-- 0 root (0) root (0) 39473 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00071_source.html\n+-rw-r--r-- 0 root (0) root (0) 5150 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00074.html\n+-rw-r--r-- 0 root (0) root (0) 32708 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00074_source.html\n+-rw-r--r-- 0 root (0) root (0) 4850 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00077.html\n+-rw-r--r-- 0 root (0) root (0) 9300 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00077_source.html\n+-rw-r--r-- 0 root (0) root (0) 7479 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00080.html\n+-rw-r--r-- 0 root (0) root (0) 17526 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00080_source.html\n+-rw-r--r-- 0 root (0) root (0) 5212 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00083.html\n+-rw-r--r-- 0 root (0) root (0) 7085 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00083_source.html\n+-rw-r--r-- 0 root (0) root (0) 11231 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00086.html\n+-rw-r--r-- 0 root (0) root (0) 43487 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00086_source.html\n -rw-r--r-- 0 root (0) root (0) 16500 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00089.html\n -rw-r--r-- 0 root (0) root (0) 11643 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00089.png\n -rw-r--r-- 0 root (0) root (0) 33697 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00090.html\n -rw-r--r-- 0 root (0) root (0) 4364 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00090.png\n -rw-r--r-- 0 root (0) root (0) 21122 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00091.html\n -rw-r--r-- 0 root (0) root (0) 3530 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00091.png\n -rw-r--r-- 0 root (0) root (0) 25232 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/a00092.html\n@@ -372,15 +372,15 @@\n -rw-r--r-- 0 root (0) root (0) 3903 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_04f2ecc425faf0d475a3caf484e551f3.html\n -rw-r--r-- 0 root (0) root (0) 2277 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_04f2ecc425faf0d475a3caf484e551f3_dep.png\n -rw-r--r-- 0 root (0) root (0) 3676 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_5e69be5995c9f5d42bf491ae6f29600e.html\n -rw-r--r-- 0 root (0) root (0) 13067 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_5e74c06688912037f4b476b8dc05fab9.html\n -rw-r--r-- 0 root (0) root (0) 2105 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_5e74c06688912037f4b476b8dc05fab9_dep.png\n -rw-r--r-- 0 root (0) root (0) 3672 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html\n -rw-r--r-- 0 root (0) root (0) 45631 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/doxygen.css\n--rw-r--r-- 0 root (0) root (0) 23506 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dune-typetree.tag.gz\n+-rw-r--r-- 0 root (0) root (0) 23511 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dune-typetree.tag.gz\n -rw-r--r-- 0 root (0) root (0) 7704 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/dynsections.js\n -rw-r--r-- 0 root (0) root (0) 12259 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/files.html\n -rw-r--r-- 0 root (0) root (0) 3441 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/functions.html\n -rw-r--r-- 0 root (0) root (0) 3960 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/functions_b.html\n -rw-r--r-- 0 root (0) root (0) 6674 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/functions_c.html\n -rw-r--r-- 0 root (0) root (0) 6085 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/functions_d.html\n -rw-r--r-- 0 root (0) root (0) 3515 2024-11-14 20:30:42.000000 ./usr/share/doc/libdune-typetree-doc/doxygen/functions_e.html\n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00008.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00008.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: proxynode.hh File Reference\n+dune-typetree: typetraits.hh File Reference\n \n \n \n \n \n \n \n@@ -71,60 +71,100 @@\n \n \n \n
\n
\n Classes |\n-Namespaces
\n-
proxynode.hh File Reference
\n+Namespaces |\n+Functions
\n+
typetraits.hh File Reference
\n \n
\n
#include <type_traits>
\n-#include <dune/typetree/nodeinterface.hh>
\n-#include <dune/typetree/nodetags.hh>
\n-#include <dune/common/shared_ptr.hh>
\n-#include <dune/common/indices.hh>
\n-#include <dune/common/std/type_traits.hh>
\n+#include <dune/common/typetraits.hh>
\n+#include <dune/typetree/treepath.hh>
\n+#include <dune/typetree/nodeinterface.hh>
\n
\n

Go to the source code of this file.

\n \n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

\n Classes

class  Dune::TypeTree::StaticChildAccessors< ProxiedNode >
 Mixin class providing methods for child access with compile-time parameter. More...
struct  Dune::first_type< T0, T... >
 
struct  Dune::TypeTree::StaticChildAccessors< ProxiedNode >::Child< k >
 Access to the type and storage type of the i-th child. More...
struct  Dune::TypeTree::has_node_tag< T >
 
class  Dune::TypeTree::DynamicChildAccessors< ProxiedNode >
 Mixin class providing methods for child access with run-time parameter. More...
struct  Dune::TypeTree::has_node_tag< T >::yes
 
struct  Dune::TypeTree::ProxyNodeBase< Node, LeafNodeTag >
 ProxyNode base class for LeafNode. More...
struct  Dune::TypeTree::has_node_tag< T >::no
 
struct  Dune::TypeTree::ProxyNodeBase< Node, CompositeNodeTag >
 ProxyNode base class for CompositeNode. More...
struct  Dune::TypeTree::has_node_tag_value< T, V >
 
struct  Dune::TypeTree::ProxyNodeBase< Node, PowerNodeTag >
 ProxyNode base class for PowerNode. More...
struct  Dune::TypeTree::has_node_tag_value< T, V >::maybe< N >
 
struct  Dune::TypeTree::ProxyNodeBase< Node, DynamicPowerNodeTag >
 ProxyNode base class for DynamicPowerNode. More...
struct  Dune::TypeTree::has_node_tag_value< T, V >::yes
 
class  Dune::TypeTree::ProxyNode< Node >
 Base class for nodes acting as a proxy for an existing node. More...
struct  Dune::TypeTree::has_node_tag_value< T, V >::no
 
struct  Dune::TypeTree::has_implementation_tag< T >
 
struct  Dune::TypeTree::has_implementation_tag< T >::yes
 
struct  Dune::TypeTree::has_implementation_tag< T >::no
 
struct  Dune::TypeTree::has_implementation_tag_value< T, V >
 
struct  Dune::TypeTree::has_implementation_tag_value< T, V >::maybe< N >
 
struct  Dune::TypeTree::has_implementation_tag_value< T, V >::yes
 
struct  Dune::TypeTree::has_implementation_tag_value< T, V >::no
 
struct  Dune::TypeTree::AlwaysVoid< typename >
 
struct  Dune::TypeTree::meta_function
 Marker tag declaring a meta function. More...
 
struct  Dune::TypeTree::lazy_evaluate< F >
 Helper meta function to delay evaluation of F. More...
 
struct  Dune::TypeTree::lazy_identity< F >
 Identity function. More...
 
struct  Dune::TypeTree::evaluate_if_meta_function< F >
 Meta function that evaluates its argument iff it inherits from meta_function. More...
 
struct  Dune::TypeTree::IsTreePath< T >
 Check if type represents a tree path. More...
 
\n \n \n \n \n \n+\n+\n+

\n Namespaces

namespace  Dune
 
namespace  Dune::TypeTree
 
namespace  Dune::TypeTree::impl
 
\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

\n+Functions

template<typename T >
T * Dune::TypeTree::declptr ()
 Helper function for generating a pointer to a value of type T in an unevaluated operand setting.
 
constexpr auto Dune::TypeTree::impl::isTreePath (void *) -> std::false_type
 
template<class... I>
constexpr auto Dune::TypeTree::impl::isTreePath (const HybridTreePath< I... > *) -> std::true_type
 
template<class T >
constexpr auto Dune::TypeTree::isTreePath (const T &) -> IsTreePath< T >
 Check if given object represents a tree path.
 
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,87 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-proxynode.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+typetraits.hh File Reference\n #include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include \n-#include \n-#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0 Mixin class providing methods for child access with compile-time\n- parameter. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b0_\b,_\b _\bT_\b._\b._\b._\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n-\u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0 Mixin class providing methods for child access with run-time\n- parameter. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\by_\be_\bs\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n-\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\bn_\bo\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n-\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n-\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bm_\ba_\by_\bb_\be_\b<_\b _\bN_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n-\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\by_\be_\bs\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n-\u00a0 Base class for nodes acting as a proxy for an existing node. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bn_\bo\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\by_\be_\bs\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\bn_\bo\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bm_\ba_\by_\bb_\be_\b<_\b _\bN_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\by_\be_\bs\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bn_\bo\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+\u00a0 Marker tag declaring a meta function. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b<_\b _\bF_\b _\b>\n+\u00a0 Helper meta function to delay evaluation of F. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b<_\b _\bF_\b _\b>\n+\u00a0 Identity function. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bF_\b _\b>\n+\u00a0 Meta function that evaluates its argument iff it inherits from\n+ _\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bT_\b _\b>\n+\u00a0 Check if type represents a tree path. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ T *\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bc_\bl_\bp_\bt_\br ()\n+\u00a0 Helper function for generating a pointer to a value of type T\n+ in an unevaluated operand setting.\n+\u00a0\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (void *) -> std::false_type\n+\u00a0\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< I... >\n+ *) -> std::true_type\n+\u00a0\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T &) -> _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T >\n+\u00a0 Check if given object represents a tree path.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00008_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00008_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: proxynode.hh Source File\n+dune-typetree: typetraits.hh Source File\n \n \n \n \n \n \n \n@@ -74,397 +74,278 @@\n \n
\n \n
\n \n
\n-
proxynode.hh
\n+
typetraits.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
\n
5
\n-
6#ifndef DUNE_TYPETREE_PROXYNODE_HH
\n-
7#define DUNE_TYPETREE_PROXYNODE_HH
\n+
6#ifndef DUNE_TYPETREE_TYPETRAITS_HH
\n+
7#define DUNE_TYPETREE_TYPETRAITS_HH
\n
8
\n
9#include <type_traits>
\n-\n-\n-
12#include <dune/common/shared_ptr.hh>
\n-
13#include <dune/common/indices.hh>
\n-
14#include <dune/common/std/type_traits.hh>
\n-
15
\n-
16namespace Dune {
\n-
17 namespace TypeTree {
\n-
18
\n-
24 template<typename Node>
\n-
25 class ProxyNode;
\n-
26
\n-
28 template<typename ProxiedNode>
\n-
\n-\n-
30 {
\n-
31
\n-
32 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
\n-
33
\n-
34 template<std::size_t k>
\n-
35 struct lazy_enabled
\n-
36 {
\n-
37 static const bool value = !proxiedNodeIsConst;
\n-
38 };
\n-
39
\n-\n+
10#include <dune/common/typetraits.hh>
\n+
11
\n+\n+\n+
14
\n+
15namespace Dune {
\n+
16
\n+
17 // Provide some more C++11 TMP helpers.
\n+
18 // These should be upstreamed to dune-common ASAP.
\n+
19
\n+
20 template<typename... T>
\n+
21 struct first_type;
\n+
22
\n+
23 template<typename T0, typename... T>
\n+
\n+
24 struct first_type<T0,T...>
\n+
25 {
\n+
26 typedef T0 type;
\n+
27 };
\n+
\n+
28
\n+
29 namespace TypeTree {
\n+
30
\n+
31 template<typename T>
\n+
\n+\n+
33 {
\n+
34 struct yes { char dummy[1]; };
\n+
35 struct no { char dummy[2]; };
\n+
36
\n+
37 template<typename X>
\n+
38 static yes test(NodeTag<X> *);
\n+
39 template<typename X>
\n+
40 static no test(...);
\n
41
\n-
42 template<bool enabled = !proxiedNodeIsConst>
\n-
43 typename std::enable_if<enabled,Node&>::type
\n-
44 node ()
\n-
45 {
\n-
46 return static_cast<Node&>(*this);
\n-
47 }
\n-
48
\n-
49 const Node& node () const
\n-
50 {
\n-
51 return static_cast<const Node&>(*this);
\n-
52 }
\n+
43 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
\n+
44 };
\n+
\n+
45
\n+
46 template<typename T, typename V>
\n+
\n+\n+
48 {
\n+
49 template<int N>
\n+
50 struct maybe { char dummy[N+1]; };
\n+
51 struct yes { char dummy[2]; };
\n+
52 struct no { char dummy[1]; };
\n
53
\n-
54 public:
\n-
55
\n-
57 template<std::size_t k>
\n-
\n-
58 struct Child
\n-
59 : public ProxiedNode::template Child<k>
\n-
60 {};
\n-
\n-
61
\n-
64
\n-
66
\n-
69 template<std::size_t k,
\n-
70 typename std::enable_if<lazy_enabled<k>::value, int>::type = 0>
\n-
\n-
71 auto& child (index_constant<k> = {})
\n-
72 {
\n-
73 return node().proxiedNode().template child<k>();
\n-
74 }
\n-
\n-
75
\n-
77
\n-
80 template<std::size_t k>
\n-
\n-
81 const auto& child (index_constant<k> = {}) const
\n-
82 {
\n-
83 return node().proxiedNode().template child<k>();
\n-
84 }
\n-
\n-
85
\n-
87
\n-
90 template<std::size_t k,
\n-
91 typename std::enable_if<lazy_enabled<k>::value, int>::type = 0>
\n-
\n-
92 auto childStorage (index_constant<k> = {})
\n-
93 {
\n-
94 return node().proxiedNode().template childStorage<k>();
\n-
95 }
\n+
54 template<typename X>
\n+\n+\n+
57 template<typename X>
\n+
58 static no test(...);
\n+
59
\n+
61 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
\n+
62 };
\n+
\n+
63
\n+
64 template<typename T>
\n+
\n+\n+
66 {
\n+
67 struct yes { char dummy[1]; };
\n+
68 struct no { char dummy[2]; };
\n+
69
\n+
70 template<typename X>
\n+\n+
72 template<typename X>
\n+
73 static no test(...);
\n+
74
\n+
76 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
\n+
77 };
\n+
\n+
78
\n+
79 template<typename T, typename V>
\n+
\n+\n+
81 {
\n+
82 template<int N>
\n+
83 struct maybe { char dummy[N+1]; };
\n+
84 struct yes { char dummy[2]; };
\n+
85 struct no { char dummy[1]; };
\n+
86
\n+
87 template<typename X>
\n+\n+\n+
90 template<typename X>
\n+
91 static no test(...);
\n+
92
\n+
94 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
\n+
95 };
\n
\n
96
\n-
98
\n-
104 template<std::size_t k>
\n-
\n-
105 auto childStorage (index_constant<k> = {}) const
\n-
106 {
\n-
107 return node().proxiedNode().template childStorage<k>();
\n-
108 }
\n-
\n-
109
\n-
111 template<std::size_t k, class ProxyChild>
\n-
\n-
112 void setChild (ProxyChild&& child, typename std::enable_if<lazy_enabled<k>::value,void*>::type = 0)
\n-
113 {
\n-
114 node().proxiedNode().template setChild<k>(std::forward<ProxyChild>(child));
\n-
115 }
\n-
\n-
116
\n-
\n-
117 const typename ProxiedNode::NodeStorage& nodeStorage () const
\n-
118 {
\n-
119 return node().proxiedNode().nodeStorage();
\n-
120 }
\n-
\n-
121
\n-
122 };
\n-
\n-
123
\n-
125
\n-
130 template<typename ProxiedNode>
\n-
\n-\n-
132 : public StaticChildAccessors<ProxiedNode>
\n-
133 {
\n-
134
\n-\n-
136
\n-
137 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
\n+
97 template<typename>
\n+
\n+\n+
99 {
\n+
100 typedef void type;
\n+
101 };
\n+
\n+
102
\n+
103
\n+
105 template<typename T>
\n+\n+
107
\n+
108
\n+
109 // Support for lazy evaluation of meta functions. This is required when doing
\n+
110 // nested tag dispatch without C++11-style typedefs (based on using syntax).
\n+
111 // The standard struct-based meta functions cause premature evaluation in a
\n+
112 // context that is not SFINAE-compatible. We thus have to return the meta function
\n+
113 // without evaluating it, placing that burden on the caller. On the other hand,
\n+
114 // the lookup will often directly be the target type, so here is some helper code
\n+
115 // to automatically do the additional evaluation if necessary.
\n+
116 // Too bad that the new syntax is GCC 4.6+...
\n+
117
\n+
118
\n+
120
\n+
123 struct meta_function {};
\n+
124
\n+
126 template<typename F>
\n+
\n+\n+
128 {
\n+
129 typedef typename F::type type;
\n+
130 };
\n+
\n+
131
\n+
133 template<typename F>
\n+
\n+\n+
135 {
\n+
136 typedef F type;
\n+
137 };
\n+
\n
138
\n-
139 template<bool enabled = !proxiedNodeIsConst>
\n-
140 typename std::enable_if<enabled,Node&>::type
\n-
141 node ()
\n-
142 {
\n-
143 return static_cast<Node&>(*this);
\n-
144 }
\n-
145
\n-
146 const Node& node () const
\n-
147 {
\n-
148 return static_cast<const Node&>(*this);
\n-
149 }
\n-
150
\n-
151 public:
\n-
152
\n-
155
\n-
157
\n-
160 template<bool enabled = !proxiedNodeIsConst,
\n-
161 typename std::enable_if<enabled, int>::type = 0>
\n-
\n-
162 auto& child (std::size_t i)
\n-
163 {
\n-
164 return node().proxiedNode().child(i);
\n-
165 }
\n+
140 template<typename F>
\n+
\n+\n+
142 {
\n+
143 typedef typename std::conditional<
\n+
144 std::is_base_of<meta_function,F>::value,
\n+\n+\n+
147 >::type::type type;
\n+
148 };
\n+
\n+
149
\n+
\n+
150 namespace impl {
\n+
151
\n+
152 // Check if type is a or is derived from one of the tree path types
\n+
153
\n+
154 // Default overload for types not representing a tree path
\n+
\n+
155 constexpr auto isTreePath(void*)
\n+
156 -> std::false_type
\n+
157 {
\n+
158 return std::false_type();
\n+
159 }
\n+
\n+
160
\n+
161 // Overload for instances of HybridTreePath<...>
\n+
162 template<class... I>
\n+
\n+
163 constexpr auto isTreePath(const HybridTreePath<I...>*)
\n+
164 -> std::true_type
\n+
165 {
\n+
166 return std::true_type();
\n+
167 }
\n
\n-
166
\n
168
\n-
\n-
171 const auto& child (std::size_t i) const
\n-
172 {
\n-
173 return node().proxiedNode().child(i);
\n-
174 }
\n-
\n-
175
\n-
177
\n-
180 template<bool enabled = !proxiedNodeIsConst,
\n-
181 typename std::enable_if<enabled, int>::type = 0>
\n-
\n-
182 auto childStorage (std::size_t i)
\n-
183 {
\n-
184 return node().proxiedNode().childStorage(i);
\n-
185 }
\n-
\n-
186
\n-
188
\n-
\n-
194 auto childStorage (std::size_t i) const
\n-
195 {
\n-
196 return node().proxiedNode().childStorage(i);
\n-
197 }
\n+
169 }
\n+
\n+
170
\n+
181 template<class T>
\n+
\n+
182 struct IsTreePath :
\n+
183 public decltype(impl::isTreePath((typename std::decay<T>::type*)(nullptr)))
\n+
184 {};
\n+
\n+
185
\n+
192 template<class T>
\n+
\n+
193 constexpr auto isTreePath(const T&)
\n+\n+
195 {
\n+
196 return IsTreePath<T>();
\n+
197 }
\n
\n
198
\n-
200 template<class ProxyChild, bool enabled = !proxiedNodeIsConst>
\n-
\n-
201 void setChild (std::size_t i, ProxyChild&& child, typename std::enable_if<enabled,void*>::type = 0)
\n-
202 {
\n-
203 node().proxiedNode().setChild(i, std::forward<ProxyChild>(child));
\n-
204 }
\n-
\n-
205
\n-
206 };
\n-
\n-
207
\n-
209 template<typename Node, typename NodeTag>
\n-\n-
211
\n-
213 template<typename Node>
\n-
\n-\n-
215 {
\n-
216 };
\n-
\n-
217
\n-
219 template<typename Node>
\n-
\n-\n-
221 : public StaticChildAccessors<Node>
\n-
222 {
\n-
223 typedef typename Node::ChildTypes ChildTypes;
\n-
224 typedef typename Node::NodeStorage NodeStorage;
\n-
225 };
\n-
\n-
226
\n-
228 template<typename Node>
\n-
\n-\n-
230 : public DynamicChildAccessors<Node>
\n-
231 {
\n-
232 typedef typename Node::ChildType ChildType;
\n-
233 typedef typename Node::NodeStorage NodeStorage;
\n-
234 };
\n-
\n-
235
\n-
237 template<typename Node>
\n-
\n-\n-
239 : public DynamicChildAccessors<Node>
\n-
240 {
\n-
241 typedef typename Node::ChildType ChildType;
\n-
242 typedef typename Node::NodeStorage NodeStorage;
\n-
243 };
\n-
\n-
244
\n-
246
\n-
252 template<typename Node>
\n-
\n-\n-
254 : public ProxyNodeBase<Node,NodeTag<Node>>
\n-
255 {
\n-
256 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
\n-
257
\n-
258 template <class N>
\n-
259 using HasStaticDegree = index_constant<N::degree()>;
\n-
260
\n-
261 template <class N>
\n-
262 static constexpr bool hasStaticDegree = Std::is_detected<HasStaticDegree, N>::value;
\n-
263
\n-
264 // accessor mixins need to be friends for access to proxiedNode()
\n-
265 friend class StaticChildAccessors<Node>;
\n-
266 friend class DynamicChildAccessors<Node>;
\n-
267
\n-
268 public:
\n-
269
\n-
270 typedef Node ProxiedNode;
\n-
271
\n-\n-
273
\n-
275 static const bool isLeaf = Node::isLeaf;
\n-
276
\n-
278 static const bool isPower = Node::isPower;
\n-
279
\n-
281 static const bool isComposite = Node::isComposite;
\n-
282
\n-
283 template <class N = Node,
\n-
284 std::enable_if_t<hasStaticDegree<N>, int> = 0>
\n-
\n-
285 static constexpr auto degree ()
\n-
286 {
\n-
287 return N::degree();
\n-
288 }
\n-
\n-
289
\n-
290 template <class N = Node,
\n-
291 std::enable_if_t<not hasStaticDegree<N>, int> = 0>
\n-
\n-
292 auto degree () const
\n-
293 {
\n-
294 return proxiedNode().degree();
\n-
295 }
\n-
\n-
296
\n-
297
\n-
298 protected:
\n-
299
\n-
302
\n-
304 template<bool enabled = !proxiedNodeIsConst>
\n-
305 typename std::enable_if<enabled,Node&>::type
\n-
\n-\n-
307 {
\n-
308 return *_node;
\n-
309 }
\n-
\n-
310
\n-
\n-
312 const Node& proxiedNode () const
\n-
313 {
\n-
314 return *_node;
\n-
315 }
\n-
\n-
316
\n-
318 template<bool enabled = !proxiedNodeIsConst>
\n-
319 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
\n-
\n-\n-
321 {
\n-
322 return _node;
\n-
323 }
\n-
\n-
324
\n-
\n-
326 std::shared_ptr<const Node> proxiedNodeStorage () const
\n-
327 {
\n-
328 return _node;
\n-
329 }
\n-
\n-
330
\n-
332
\n-
335
\n-
\n-
336 ProxyNode (Node& node)
\n-
337 : _node(stackobject_to_shared_ptr(node))
\n-
338 {}
\n-
\n-
339
\n-
\n-
340 ProxyNode (std::shared_ptr<Node> node)
\n-
341 : _node(std::move(node))
\n-
342 {}
\n-
\n-
343
\n-
345
\n-
346 private:
\n-
347
\n-
348 std::shared_ptr<Node> _node;
\n-
349 };
\n-
\n-
350
\n-
352
\n-
353 } // namespace TypeTree
\n-
354} //namespace Dune
\n-
355
\n-
356#endif // DUNE_TYPETREE_PROXYNODE_HH
\n-\n-\n+
199
\n+
200 } // end namespace TypeTree
\n+
201} // end namespace Dune
\n+
202
\n+
203#endif // DUNE_TYPETREE_TYPETRAITS_HH
\n+\n+\n
typename std::decay_t< Node >::NodeTag NodeTag
Returns the node tag of the given Node.
Definition nodeinterface.hh:70
\n+
typename std::decay_t< T >::ImplementationTag ImplementationTag
Returns the implementation tag of the given Node.
Definition nodeinterface.hh:74
\n
Definition accumulate_static.hh:16
\n-
Tag designating a leaf node.
Definition nodetags.hh:18
\n-
Tag designating a power node.
Definition nodetags.hh:21
\n-
Tag designating a power node with runtime degree.
Definition nodetags.hh:24
\n-
Tag designating a composite node.
Definition nodetags.hh:27
\n-
Base class for nodes acting as a proxy for an existing node.
Definition proxynode.hh:255
\n-
ProxyNode(Node &node)
Definition proxynode.hh:336
\n-
Dune::TypeTree::NodeTag< Node > NodeTag
Definition proxynode.hh:272
\n-
static const bool isComposite
Mark this class as a composite in the dune-typetree.
Definition proxynode.hh:281
\n-
static const bool isLeaf
Mark this class as non leaf in the dune-typetree.
Definition proxynode.hh:275
\n-
static const bool isPower
Mark this class as a non power in the dune-typetree.
Definition proxynode.hh:278
\n-
auto degree() const
Definition proxynode.hh:292
\n-
std::enable_if< enabled, Node & >::type proxiedNode()
Returns the proxied node.
Definition proxynode.hh:306
\n-
std::shared_ptr< const Node > proxiedNodeStorage() const
Returns the storage of the proxied node (const version).
Definition proxynode.hh:326
\n-
Node ProxiedNode
Definition proxynode.hh:270
\n-
std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()
Returns the storage of the proxied node.
Definition proxynode.hh:320
\n-
static constexpr auto degree()
Definition proxynode.hh:285
\n-
ProxyNode(std::shared_ptr< Node > node)
Definition proxynode.hh:340
\n-
const Node & proxiedNode() const
Returns the proxied node (const version).
Definition proxynode.hh:312
\n-
Mixin class providing methods for child access with compile-time parameter.
Definition proxynode.hh:30
\n-
auto & child(index_constant< k >={})
Returns the i-th child.
Definition proxynode.hh:71
\n-
void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::value, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition proxynode.hh:112
\n-
const ProxiedNode::NodeStorage & nodeStorage() const
Definition proxynode.hh:117
\n-
auto childStorage(index_constant< k >={})
Returns the storage of the i-th child.
Definition proxynode.hh:92
\n-
const auto & child(index_constant< k >={}) const
Returns the i-th child (const version).
Definition proxynode.hh:81
\n-
auto childStorage(index_constant< k >={}) const
Returns the storage of the i-th child (const version).
Definition proxynode.hh:105
\n-
Access to the type and storage type of the i-th child.
Definition proxynode.hh:60
\n-
Mixin class providing methods for child access with run-time parameter.
Definition proxynode.hh:133
\n-
auto & child(std::size_t i)
Returns the i-th child.
Definition proxynode.hh:162
\n-
auto childStorage(std::size_t i) const
Returns the storage of the i-th child (const version).
Definition proxynode.hh:194
\n-
void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if< enabled, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition proxynode.hh:201
\n-
const auto & child(std::size_t i) const
Returns the i-th child (const version).
Definition proxynode.hh:171
\n-
auto childStorage(std::size_t i)
Returns the storage of the i-th child.
Definition proxynode.hh:182
\n-
Tag-based dispatch to appropriate base class that provides necessary functionality.
Definition proxynode.hh:210
\n-
Node::NodeStorage NodeStorage
Definition proxynode.hh:224
\n-
Node::ChildTypes ChildTypes
Definition proxynode.hh:223
\n-
Node::NodeStorage NodeStorage
Definition proxynode.hh:233
\n-
Node::ChildType ChildType
Definition proxynode.hh:232
\n-
Node::NodeStorage NodeStorage
Definition proxynode.hh:242
\n-
Node::ChildType ChildType
Definition proxynode.hh:241
\n+
constexpr auto isTreePath(const T &) -> IsTreePath< T >
Check if given object represents a tree path.
Definition typetraits.hh:193
\n+
T * declptr()
Helper function for generating a pointer to a value of type T in an unevaluated operand setting.
\n+
constexpr auto isTreePath(void *) -> std::false_type
Definition typetraits.hh:155
\n+
A hybrid version of TreePath that supports both compile time and run time indices.
Definition treepath.hh:158
\n+
Definition typetraits.hh:21
\n+
T0 type
Definition typetraits.hh:26
\n+
Definition typetraits.hh:33
\n+
static constexpr bool value
True if class T defines a NodeTag.
Definition typetraits.hh:43
\n+
static yes test(NodeTag< X > *)
\n+\n+
Definition typetraits.hh:34
\n+
char dummy[1]
Definition typetraits.hh:34
\n+
Definition typetraits.hh:35
\n+
char dummy[2]
Definition typetraits.hh:35
\n+
Definition typetraits.hh:48
\n+
static maybe< std::is_base_of< V, NodeTag< X > >::value > test(NodeTag< X > *a)
\n+
static constexpr bool value
True if class T defines a NodeTag of type V.
Definition typetraits.hh:61
\n+\n+\n+
char dummy[N+1]
Definition typetraits.hh:50
\n+
Definition typetraits.hh:51
\n+
char dummy[2]
Definition typetraits.hh:51
\n+
Definition typetraits.hh:52
\n+
char dummy[1]
Definition typetraits.hh:52
\n+
Definition typetraits.hh:66
\n+
static yes test(ImplementationTag< X > *)
\n+\n+
static constexpr bool value
True if class T defines an ImplementationTag.
Definition typetraits.hh:76
\n+\n+
char dummy[1]
Definition typetraits.hh:67
\n+\n+
char dummy[2]
Definition typetraits.hh:68
\n+\n+
static maybe< std::is_base_of< V, ImplementationTag< X > >::value > test(ImplementationTag< X > *a)
\n+\n+
static constexpr bool value
True if class T defines an ImplementationTag of type V.
Definition typetraits.hh:94
\n+\n+
char dummy[N+1]
Definition typetraits.hh:83
\n+\n+
char dummy[2]
Definition typetraits.hh:84
\n+\n+
char dummy[1]
Definition typetraits.hh:85
\n+
Definition typetraits.hh:99
\n+
void type
Definition typetraits.hh:100
\n+
Marker tag declaring a meta function.
Definition typetraits.hh:123
\n+
Helper meta function to delay evaluation of F.
Definition typetraits.hh:128
\n+
F::type type
Definition typetraits.hh:129
\n+
Identity function.
Definition typetraits.hh:135
\n+
F type
Definition typetraits.hh:136
\n+
Meta function that evaluates its argument iff it inherits from meta_function.
Definition typetraits.hh:142
\n+
std::conditional< std::is_base_of< meta_function, F >::value, lazy_evaluate< F >, lazy_identity< F > >::type::type type
Definition typetraits.hh:147
\n+
Check if type represents a tree path.
Definition typetraits.hh:184
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,446 +1,346 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-proxynode.hh\n+typetraits.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_PROXYNODE_HH\n-7#define DUNE_TYPETREE_PROXYNODE_HH\n+6#ifndef DUNE_TYPETREE_TYPETRAITS_HH\n+7#define DUNE_TYPETREE_TYPETRAITS_HH\n 8\n 9#include \n-10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-12#include \n-13#include \n-14#include \n-15\n-16namespace _\bD_\bu_\bn_\be {\n-17 namespace TypeTree {\n-18\n-24 template\n-25 class ProxyNode;\n-26\n-28 template\n-_\b2_\b9 class _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-30 {\n-31\n-32 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n-33\n-34 template\n-35 struct lazy_enabled\n-36 {\n-37 static const bool value = !proxiedNodeIsConst;\n-38 };\n-39\n-40 typedef _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be;\n+10#include \n+11\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+14\n+15namespace _\bD_\bu_\bn_\be {\n+16\n+17 // Provide some more C++11 TMP helpers.\n+18 // These should be upstreamed to dune-common ASAP.\n+19\n+20 template\n+_\b2_\b1 struct _\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be;\n+22\n+23 template\n+_\b2_\b4 struct _\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be\n+25 {\n+_\b2_\b6 typedef T0 _\bt_\by_\bp_\be;\n+27 };\n+28\n+29 namespace TypeTree {\n+30\n+31 template\n+_\b3_\b2 struct _\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg\n+33 {\n+_\b3_\b4 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[1]; };\n+_\b3_\b5 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[2]; };\n+36\n+37 template\n+_\b3_\b8 static _\by_\be_\bs _\bt_\be_\bs_\bt(_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b> *);\n+39 template\n+_\b4_\b0 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n 41\n-42 template\n-43 typename std::enable_if::type\n-44 node ()\n-45 {\n-46 return static_cast<_\bN_\bo_\bd_\be&>(*this);\n-47 }\n-48\n-49 const _\bN_\bo_\bd_\be& node () const\n-50 {\n-51 return static_cast(*this);\n-52 }\n+_\b4_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n+44 };\n+45\n+46 template\n+_\b4_\b7 struct _\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n+48 {\n+49 template\n+_\b5_\b0 struct _\bm_\ba_\by_\bb_\be { char _\bd_\bu_\bm_\bm_\by[N+1]; };\n+_\b5_\b1 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[2]; };\n+_\b5_\b2 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[1]; };\n 53\n-54 public:\n-55\n-57 template\n-_\b5_\b8 struct _\bC_\bh_\bi_\bl_\bd\n-59 : public ProxiedNode::template _\bC_\bh_\bi_\bl_\bd\n-60 {};\n-61\n-64\n-66\n-69 template::value, int>::type = 0>\n-_\b7_\b1 auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n-72 {\n-73 return node().proxiedNode().template child();\n-74 }\n-75\n-77\n-80 template\n-_\b8_\b1 const auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n-82 {\n-83 return node().proxiedNode().template child();\n-84 }\n-85\n-87\n-90 template::value, int>::type = 0>\n-_\b9_\b2 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n-93 {\n-94 return node().proxiedNode().template childStorage();\n-95 }\n+54 template\n+55 static _\bm_\ba_\by_\bb_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bb_\ba_\bs_\be_\b__\bo_\bf_\b<_\bV_\b,_\b _\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b>>_\b:_\b:_\bv_\ba_\bl_\bu_\be>\n+_\b5_\b6 _\bt_\be_\bs_\bt(_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b> * a);\n+57 template\n+_\b5_\b8 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n+59\n+_\b6_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n+62 };\n+63\n+64 template\n+_\b6_\b5 struct _\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg\n+66 {\n+_\b6_\b7 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[1]; };\n+_\b6_\b8 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[2]; };\n+69\n+70 template\n+_\b7_\b1 static _\by_\be_\bs _\bt_\be_\bs_\bt(_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b> *);\n+72 template\n+_\b7_\b3 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n+74\n+_\b7_\b6 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n+77 };\n+78\n+79 template\n+_\b8_\b0 struct _\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n+81 {\n+82 template\n+_\b8_\b3 struct _\bm_\ba_\by_\bb_\be { char _\bd_\bu_\bm_\bm_\by[N+1]; };\n+_\b8_\b4 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[2]; };\n+_\b8_\b5 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[1]; };\n+86\n+87 template\n+88 static _\bm_\ba_\by_\bb_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bb_\ba_\bs_\be_\b__\bo_\bf_\b<_\bV_\b,_\b _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b>>_\b:_\b:_\bv_\ba_\bl_\bu_\be>\n+_\b8_\b9 _\bt_\be_\bs_\bt(_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b> * a);\n+90 template\n+_\b9_\b1 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n+92\n+_\b9_\b4 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n+95 };\n 96\n-98\n-104 template\n-_\b1_\b0_\b5 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n-106 {\n-107 return node().proxiedNode().template childStorage();\n-108 }\n-109\n-111 template\n-_\b1_\b1_\b2 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (ProxyChild&& _\bc_\bh_\bi_\bl_\bd, typename std::\n-enable_if::value,void*>::type = 0)\n-113 {\n-114 node().proxiedNode().template setChild(std::forward(_\bc_\bh_\bi_\bl_\bd));\n-115 }\n-116\n-_\b1_\b1_\b7 const typename ProxiedNode::NodeStorage& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-118 {\n-119 return node().proxiedNode().nodeStorage();\n-120 }\n-121\n-122 };\n-123\n-125\n-130 template\n-_\b1_\b3_\b1 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-132 : public _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-133 {\n-134\n-135 typedef _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be;\n-136\n-137 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n+97 template\n+_\b9_\b8 struct _\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd\n+99 {\n+_\b1_\b0_\b0 typedef void _\bt_\by_\bp_\be;\n+101 };\n+102\n+103\n+105 template\n+_\b1_\b0_\b6 T* _\bd_\be_\bc_\bl_\bp_\bt_\br();\n+107\n+108\n+109 // Support for lazy evaluation of meta functions. This is required when\n+doing\n+110 // nested tag dispatch without C++11-style typedefs (based on using\n+syntax).\n+111 // The standard struct-based meta functions cause premature evaluation in a\n+112 // context that is not SFINAE-compatible. We thus have to return the meta\n+function\n+113 // without evaluating it, placing that burden on the caller. On the other\n+hand,\n+114 // the lookup will often directly be the target type, so here is some\n+helper code\n+115 // to automatically do the additional evaluation if necessary.\n+116 // Too bad that the new syntax is GCC 4.6+...\n+117\n+118\n+120\n+_\b1_\b2_\b3 struct _\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn {};\n+124\n+126 template\n+_\b1_\b2_\b7 struct _\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n+128 {\n+_\b1_\b2_\b9 typedef typename F::type _\bt_\by_\bp_\be;\n+130 };\n+131\n+133 template\n+_\b1_\b3_\b4 struct _\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n+135 {\n+_\b1_\b3_\b6 typedef F _\bt_\by_\bp_\be;\n+137 };\n 138\n-139 template\n-140 typename std::enable_if::type\n-141 node ()\n+140 template\n+_\b1_\b4_\b1 struct _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n 142 {\n-143 return static_cast<_\bN_\bo_\bd_\be&>(*this);\n-144 }\n-145\n-146 const _\bN_\bo_\bd_\be& node () const\n-147 {\n-148 return static_cast(*this);\n-149 }\n-150\n-151 public:\n-152\n-155\n-157\n-160 template::type = 0>\n-_\b1_\b6_\b2 auto& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n-163 {\n-164 return node().proxiedNode().child(i);\n-165 }\n-166\n+143 typedef typename std::conditional<\n+144 std::is_base_of::value,\n+145 _\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b<_\bF_\b>,\n+146 _\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b<_\bF_\b>\n+_\b1_\b4_\b7 >::type::type _\bt_\by_\bp_\be;\n+148 };\n+149\n+_\b1_\b5_\b0 namespace impl {\n+151\n+152 // Check if type is a or is derived from one of the tree path types\n+153\n+154 // Default overload for types not representing a tree path\n+_\b1_\b5_\b5 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(void*)\n+156 -> std::false_type\n+157 {\n+158 return std::false_type();\n+159 }\n+160\n+161 // Overload for instances of HybridTreePath<...>\n+162 template\n+_\b1_\b6_\b3 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b._\b._\b._\b>*)\n+164 -> std::true_type\n+165 {\n+166 return std::true_type();\n+167 }\n 168\n-_\b1_\b7_\b1 const auto& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n-172 {\n-173 return node().proxiedNode().child(i);\n-174 }\n-175\n-177\n-180 template::type = 0>\n-_\b1_\b8_\b2 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n-183 {\n-184 return node().proxiedNode().childStorage(i);\n-185 }\n-186\n-188\n-_\b1_\b9_\b4 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n+169 }\n+170\n+181 template\n+_\b1_\b8_\b2 struct _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh :\n+183 public decltype(impl::isTreePath((typename std::decay::type*)(nullptr)))\n+184 {};\n+185\n+192 template\n+_\b1_\b9_\b3 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T&)\n+194 -> _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b>\n 195 {\n-196 return node().proxiedNode().childStorage(i);\n+196 return _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b>();\n 197 }\n 198\n-200 template\n-_\b2_\b0_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, ProxyChild&& _\bc_\bh_\bi_\bl_\bd, typename std::\n-enable_if::type = 0)\n-202 {\n-203 node().proxiedNode().setChild(i, std::forward(_\bc_\bh_\bi_\bl_\bd));\n-204 }\n-205\n-206 };\n-207\n-209 template\n-_\b2_\b1_\b0 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be;\n-211\n-213 template\n-_\b2_\b1_\b4 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be\n-215 {\n-216 };\n-217\n-219 template\n-_\b2_\b2_\b0 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n-221 : public _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-222 {\n-_\b2_\b2_\b3 typedef typename Node::ChildTypes _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n-_\b2_\b2_\b4 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-225 };\n-226\n-228 template\n-_\b2_\b2_\b9 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n-230 : public _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-231 {\n-_\b2_\b3_\b2 typedef typename Node::ChildType _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n-_\b2_\b3_\b3 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-234 };\n-235\n-237 template\n-_\b2_\b3_\b8 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n-239 : public _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-240 {\n-_\b2_\b4_\b1 typedef typename Node::ChildType _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n-_\b2_\b4_\b2 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-243 };\n-244\n-246\n-252 template\n-_\b2_\b5_\b3 class _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n-254 : public _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be>\n-255 {\n-256 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n-257\n-258 template \n-259 using HasStaticDegree = index_constant;\n-260\n-261 template \n-_\b2_\b6_\b2 static constexpr bool hasStaticDegree = Std::is_detected::value;\n-263\n-264 // accessor mixins need to be friends for access to proxiedNode()\n-265 friend class _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs;\n-266 friend class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs;\n-267\n-268 public:\n-269\n-_\b2_\b7_\b0 typedef Node _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be;\n-271\n-_\b2_\b7_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-273\n-_\b2_\b7_\b5 static const bool _\bi_\bs_\bL_\be_\ba_\bf = Node::isLeaf;\n-276\n-_\b2_\b7_\b8 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = Node::isPower;\n-279\n-_\b2_\b8_\b1 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = Node::isComposite;\n-282\n-283 template , int> = 0>\n-_\b2_\b8_\b5 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n-286 {\n-287 return N::degree();\n-288 }\n-289\n-290 template , int> = 0>\n-_\b2_\b9_\b2 auto _\bd_\be_\bg_\br_\be_\be () const\n-293 {\n-294 return _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be().degree();\n-295 }\n-296\n-297\n-298 protected:\n-299\n-302\n-304 template\n-305 typename std::enable_if::type\n-_\b3_\b0_\b6 _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be ()\n-307 {\n-308 return *_node;\n-309 }\n-310\n-_\b3_\b1_\b2 const Node& _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be () const\n-313 {\n-314 return *_node;\n-315 }\n-316\n-318 template\n-319 typename std::enable_if >::type\n-_\b3_\b2_\b0 _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be ()\n-321 {\n-322 return _node;\n-323 }\n-324\n-_\b3_\b2_\b6 std::shared_ptr _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-327 {\n-328 return _node;\n-329 }\n-330\n-332\n-335\n-_\b3_\b3_\b6 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be (Node& node)\n-337 : _node(stackobject_to_shared_ptr(node))\n-338 {}\n-339\n-_\b3_\b4_\b0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be (std::shared_ptr node)\n-341 : _node(std::move(node))\n-342 {}\n-343\n-345\n-346 private:\n-347\n-348 std::shared_ptr _node;\n-349 };\n-350\n-352\n-353 } // namespace TypeTree\n-354} //namespace Dune\n-355\n-356#endif // DUNE_TYPETREE_PROXYNODE_HH\n+199\n+200 } // end namespace TypeTree\n+201} // end namespace Dune\n+202\n+203#endif // DUNE_TYPETREE_TYPETRAITS_HH\n+_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n _\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n typename std::decay_t< Node >::NodeTag NodeTag\n Returns the node tag of the given Node.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+typename std::decay_t< T >::ImplementationTag ImplementationTag\n+Returns the implementation tag of the given Node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:74\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a leaf node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node with runtime degree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a composite node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n-Base class for nodes acting as a proxy for an existing node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n-ProxyNode(Node &node)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:336\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Dune::TypeTree::NodeTag< Node > NodeTag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n-static const bool isLeaf\n-Mark this class as non leaf in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Mark this class as a non power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-auto degree() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:292\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n-std::enable_if< enabled, Node & >::type proxiedNode()\n-Returns the proxied node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< const Node > proxiedNodeStorage() const\n-Returns the storage of the proxied node (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n-Node ProxiedNode\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()\n-Returns the storage of the proxied node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static constexpr auto degree()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n-ProxyNode(std::shared_ptr< Node > node)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:340\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n-const Node & proxiedNode() const\n-Returns the proxied node (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:312\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-Mixin class providing methods for child access with compile-time parameter.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-auto & child(index_constant< k >={})\n-Returns the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::\n-value, void * >::type=0)\n-Sets the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-const ProxiedNode::NodeStorage & nodeStorage() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(index_constant< k >={})\n-Returns the storage of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const auto & child(index_constant< k >={}) const\n-Returns the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(index_constant< k >={}) const\n-Returns the storage of the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n-Access to the type and storage type of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n-Mixin class providing methods for child access with run-time parameter.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-auto & child(std::size_t i)\n-Returns the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(std::size_t i) const\n-Returns the storage of the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if<\n-enabled, void * >::type=0)\n-Sets the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const auto & child(std::size_t i) const\n-Returns the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(std::size_t i)\n-Returns the storage of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be\n-Tag-based dispatch to appropriate base class that provides necessary\n-functionality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:210\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-Node::NodeStorage NodeStorage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n-Node::ChildTypes ChildTypes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:223\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-Node::NodeStorage NodeStorage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n-Node::ChildType ChildType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-Node::NodeStorage NodeStorage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n-Node::ChildType ChildType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto isTreePath(const T &) -> IsTreePath< T >\n+Check if given object represents a tree path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bc_\bl_\bp_\bt_\br\n+T * declptr()\n+Helper function for generating a pointer to a value of type T in an unevaluated\n+operand setting.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto isTreePath(void *) -> std::false_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+A hybrid version of TreePath that supports both compile time and run time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b0_\b,_\b _\bT_\b._\b._\b._\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+T0 type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if class T defines a NodeTag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n+static yes test(NodeTag< X > *)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n+static no test(...)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[2]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n+static maybe< std::is_base_of< V, NodeTag< X > >::value > test(NodeTag< X > *a)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if class T defines a NodeTag of type V.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n+static no test(...)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[N+1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[2]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n+static yes test(ImplementationTag< X > *)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n+static no test(...)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if class T defines an ImplementationTag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[2]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n+static maybe< std::is_base_of< V, ImplementationTag< X > >::value > test\n+(ImplementationTag< X > *a)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n+static no test(...)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if class T defines an ImplementationTag of type V.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[N+1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[2]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n+char dummy[1]\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd_\b:_\b:_\bt_\by_\bp_\be\n+void type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Marker tag declaring a meta function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n+Helper meta function to delay evaluation of F.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b:_\b:_\bt_\by_\bp_\be\n+F::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n+Identity function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b:_\b:_\bt_\by_\bp_\be\n+F type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Meta function that evaluates its argument iff it inherits from meta_function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\by_\bp_\be\n+std::conditional< std::is_base_of< meta_function, F >::value, lazy_evaluate< F\n+>, lazy_identity< F > >::type::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+Check if type represents a tree path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:184\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00011.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00011.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: visitor.hh File Reference\n+dune-typetree: nodetags.hh File Reference\n \n \n \n \n \n \n \n@@ -71,109 +71,42 @@\n \n
\n
\n
\n \n-
visitor.hh File Reference
\n+Namespaces
\n+
nodetags.hh File Reference
\n
\n
\n-
#include <dune/typetree/treepath.hh>
\n-#include <dune/common/hybridutilities.hh>
\n-
\n+\n

Go to the source code of this file.

\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

\n Classes

struct  Dune::TypeTree::DefaultVisitor
 Visitor interface and base class for TypeTree visitors. More...
 
struct  Dune::TypeTree::DefaultPairVisitor
 Visitor interface and base class for visitors of pairs of TypeTrees. More...
 
struct  Dune::TypeTree::Experimental::DefaultHybridVisitor
 Hybrid visitor interface and base class for TypeTree hybrid visitors. More...
 
struct  Dune::TypeTree::VisitDirectChildren
 Mixin base class for visitors that only want to visit the direct children of a node. More...
 
struct  Dune::TypeTree::VisitDirectChildren::VisitChild< Node1, Child1, Node2, Child2, TreePath >
 Template struct for determining whether or not to visit a given child. More...
 
struct  Dune::TypeTree::VisitTree
 Mixin base class for visitors that want to visit the complete tree. More...
 
struct  Dune::TypeTree::VisitTree::VisitChild< Node1, Child1, Node2, Child2, TreePath >
 Template struct for determining whether or not to visit a given child. More...
 
struct  Dune::TypeTree::StaticTraversal
 Mixin base class for visitors that require a static TreePath during traversal. More...
struct  Dune::TypeTree::LeafNodeTag
 Tag designating a leaf node. More...
 
struct  Dune::TypeTree::DynamicTraversal
 Mixin base class for visitors that only need a dynamic TreePath during traversal. More...
struct  Dune::TypeTree::PowerNodeTag
 Tag designating a power node. More...
 
struct  Dune::TypeTree::TreeVisitor
 Convenience base class for visiting the entire tree. More...
struct  Dune::TypeTree::DynamicPowerNodeTag
 Tag designating a power node with runtime degree. More...
 
struct  Dune::TypeTree::DirectChildrenVisitor
 Convenience base class for visiting the direct children of a node. More...
 
struct  Dune::TypeTree::TreePairVisitor
 Convenience base class for visiting an entire tree pair. More...
 
struct  Dune::TypeTree::DirectChildrenPairVisitor
 Convenience base class for visiting the direct children of a node pair. More...
 
struct  Dune::TypeTree::Experimental::Info::LeafCounterVisitor
 
struct  Dune::TypeTree::Experimental::Info::NodeCounterVisitor
 
struct  Dune::TypeTree::Experimental::Info::DepthVisitor
struct  Dune::TypeTree::CompositeNodeTag
 Tag designating a composite node. More...
 
\n \n \n \n \n \n-\n-\n-\n-\n-

\n Namespaces

namespace  Dune
 
namespace  Dune::TypeTree
 
namespace  Dune::TypeTree::Experimental
 
namespace  Dune::TypeTree::Experimental::Info
 
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

\n-Functions

template<typename Tree >
auto Dune::TypeTree::Experimental::Info::depth (const Tree &tree)
 The depth of the TypeTree.
 
template<typename Tree >
constexpr auto Dune::TypeTree::Experimental::Info::depth ()
 The depth of the Tree.
 
template<typename Tree >
auto Dune::TypeTree::Experimental::Info::nodeCount (const Tree &tree)
 The total number of nodes in the Tree.
 
template<typename Tree >
auto Dune::TypeTree::Experimental::Info::leafCount (const Tree &tree)
 The number of leaf nodes in the Tree.
 
\n-\n-\n-\n-\n-\n

\n-Variables

template<typename Tree >
constexpr bool Dune::TypeTree::Experimental::Info::isDynamic = std::is_same<std::size_t, decltype(leafCount(std::declval<Tree>()))>{}
 true if any of the nodes in the tree only has dynamic degree.
 
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,106 +1,29 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-visitor.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+nodetags.hh File Reference\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Visitor interface and base class for _\bT_\by_\bp_\be_\bT_\br_\be_\be visitors. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+\u00a0 Tag designating a leaf node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Visitor interface and base class for visitors of pairs of TypeTrees.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+\u00a0 Tag designating a power node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Hybrid visitor interface and base class for _\bT_\by_\bp_\be_\bT_\br_\be_\be hybrid visitors.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+\u00a0 Tag designating a power node with runtime degree. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-\u00a0 Mixin base class for visitors that only want to visit the direct\n- children of a node. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bN_\bo_\bd_\be_\b1_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b1_\b,_\b _\bN_\bo_\bd_\be_\b2_\b,\n- _\bC_\bh_\bi_\bl_\bd_\b2_\b,_\b _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b _\b>\n-\u00a0 Template struct for determining whether or not to visit a given child.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-\u00a0 Mixin base class for visitors that want to visit the complete tree.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bN_\bo_\bd_\be_\b1_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b1_\b,_\b _\bN_\bo_\bd_\be_\b2_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b2_\b,\n- _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b _\b>\n-\u00a0 Template struct for determining whether or not to visit a given child.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-\u00a0 Mixin base class for visitors that require a static TreePath during\n- traversal. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-\u00a0 Mixin base class for visitors that only need a dynamic TreePath during\n- traversal. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Convenience base class for visiting the entire tree. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Convenience base class for visiting the direct children of a node.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Convenience base class for visiting an entire tree pair. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 Convenience base class for visiting the direct children of a node\n- pair. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+\u00a0 Tag designating a composite node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh (const Tree &tree)\n-\u00a0 The depth of the _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n-\u00a0\n-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh ()\n-\u00a0 The depth of the Tree.\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt (const Tree\n- &tree)\n-\u00a0 The total number of nodes in the Tree.\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt (const Tree\n- &tree)\n-\u00a0 The number of leaf nodes in the Tree.\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-template\n-constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc = std::\n- is_same()))>\n- {}\n-\u00a0 true if any of the nodes in the tree only has dynamic degree.\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00011_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00011_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: visitor.hh Source File\n+dune-typetree: nodetags.hh Source File\n \n \n \n \n \n \n \n@@ -74,385 +74,54 @@\n \n
\n \n
\n \n
\n-
visitor.hh
\n+
nodetags.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
\n
5
\n-
6#ifndef DUNE_TYPETREE_VISITOR_HH
\n-
7#define DUNE_TYPETREE_VISITOR_HH
\n+
6#ifndef DUNE_TYPETREE_NODETAGS_HH
\n+
7#define DUNE_TYPETREE_NODETAGS_HH
\n
8
\n-\n-
10#include <dune/common/hybridutilities.hh>
\n+
9namespace Dune {
\n+
10 namespace TypeTree {
\n
11
\n-
12namespace Dune {
\n-
13 namespace TypeTree {
\n-
14
\n-
21
\n-
\n-\n-
49 {
\n-
50
\n-
52
\n-
59 template<typename T, typename TreePath>
\n-
60 void pre(T&&, TreePath) const {}
\n-
61
\n-
63
\n-
71 template<typename T, typename TreePath>
\n-
72 void in(T&&, TreePath) const {}
\n-
73
\n-
75
\n-
82 template<typename T, typename TreePath>
\n-
83 void post(T&&, TreePath) const {}
\n-
84
\n-
86
\n-
92 template<typename T, typename TreePath>
\n-
93 void leaf(T&&, TreePath) const {}
\n-
94
\n-
96
\n-
106 template<typename T, typename Child, typename TreePath, typename ChildIndex>
\n-
107 void beforeChild(T&&, Child&&, TreePath, ChildIndex) const {}
\n-
108
\n-
110
\n-
121 template<typename T, typename Child, typename TreePath, typename ChildIndex>
\n-
122 void afterChild(T&&, Child&&, TreePath, ChildIndex) const {}
\n-
123
\n-
124 };
\n-
\n-
125
\n-
126
\n-
128
\n-
\n-\n-
164 {
\n-
165
\n-
167
\n-
175 template<typename T1, typename T2, typename TreePath>
\n-
176 void pre(T1&&, T2&&, TreePath) const {}
\n-
177
\n-
179
\n-
188 template<typename T1, typename T2, typename TreePath>
\n-
189 void in(T1&&, T2&&, TreePath) const {}
\n-
190
\n-
192
\n-
200 template<typename T1, typename T2, typename TreePath>
\n-
201 void post(T1&&, T2&&, TreePath) const {}
\n-
202
\n-
204
\n-
215 template<typename T1, typename T2, typename TreePath>
\n-
216 void leaf(T1&&, T2&&, TreePath) const {}
\n-
217
\n-
219
\n-
231 template<typename T1, typename Child1, typename T2, typename Child2, typename TreePath, typename ChildIndex>
\n-
232 void beforeChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const {}
\n-
233
\n-
235
\n-
247 template<typename T1, typename Child1, typename T2, typename Child2, typename TreePath, typename ChildIndex>
\n-
248 void afterChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const {}
\n-
249
\n-
250 };
\n-
\n-
251
\n-
252
\n-
253 namespace Experimental {
\n-
254
\n-
\n-\n-
286 {
\n-
287
\n-
295 template<typename T, typename TreePath, typename U>
\n-
296 auto pre(T&&, TreePath, const U& u) const { return u;}
\n-
297
\n-
305 template<typename T, typename TreePath, typename U>
\n-
306 auto in(T&&, TreePath, const U& u) const {return u;}
\n-
307
\n-
315 template<typename T, typename TreePath, typename U>
\n-
316 auto post(T&&, TreePath, const U& u) const {return u;}
\n-
317
\n-
325 template<typename T, typename TreePath, typename U>
\n-
326 auto leaf(T&&, TreePath, const U& u) const { return u;}
\n-
327
\n-
335 template<typename T, typename Child, typename TreePath, typename ChildIndex, typename U>
\n-
336 auto beforeChild(T&&, Child&&, TreePath, ChildIndex, const U& u) const {return u;}
\n-
337
\n-
345 template<typename T, typename Child, typename TreePath, typename ChildIndex, typename U>
\n-
346 auto afterChild(T&&, Child&&, TreePath, ChildIndex, const U& u) const {return u;}
\n-
347
\n-
348 };
\n-
\n-
349 } // namespace Experimental
\n-
350
\n-
352
\n-
\n-\n-
358 {
\n-
359
\n-
360 // the little trick with the default template arguments
\n-
361 // makes the class usable for both single-tree visitors
\n-
362 // and visitors for pairs of trees
\n-
364 template<typename Node1,
\n-
365 typename Child1,
\n-
366 typename Node2,
\n-
367 typename Child2 = void,
\n-
368 typename TreePath = void>
\n-
\n-\n-
370 {
\n-
372 static const bool value = false;
\n-
373 };
\n-
\n-
374
\n-
375 };
\n-
\n-
376
\n-
377
\n-
379
\n-
\n-\n-
384 {
\n-
385
\n-
386 // the little trick with the default template arguments
\n-
387 // makes the class usable for both single-tree visitors
\n-
388 // and visitors for pairs of trees
\n-
390 template<typename Node1,
\n-
391 typename Child1,
\n-
392 typename Node2,
\n-
393 typename Child2 = void,
\n-
394 typename TreePath = void>
\n-
\n-\n-
396 {
\n-
398 static const bool value = true;
\n-
399 };
\n-
\n-
400
\n-
401 };
\n-
\n-
402
\n-
404
\n-
\n-\n-
412 {
\n-\n-
415 };
\n-
\n-
416
\n-
418
\n-
\n-\n-
426 {
\n-\n-
429 };
\n-
\n-
430
\n-
\n-\n-
433 : public DefaultVisitor
\n-
434 , public VisitTree
\n-
435 {};
\n-
\n-
436
\n-
\n-\n-
439 : public DefaultVisitor
\n-
440 , public VisitDirectChildren
\n-
441 {};
\n-
\n-
442
\n-
\n-\n-
445 : public DefaultPairVisitor
\n-
446 , public VisitTree
\n-
447 {};
\n-
\n-
448
\n-
\n-\n-
451 : public DefaultPairVisitor
\n-
452 , public VisitDirectChildren
\n-
453 {};
\n-
\n-
454
\n-
\n-
455 namespace Experimental::Info {
\n-
456
\n-
\n-\n-
458 : public DefaultHybridVisitor
\n-
459 , public StaticTraversal
\n-
460 , public VisitTree
\n-
461 {
\n-
462 template<class Tree, class Child, class TreePath, class ChildIndex, class U>
\n-
\n-
463 auto beforeChild(Tree&&, Child&&, TreePath, ChildIndex, U u) const {
\n-
464 // in this case child index is an integral constant: forward u
\n-
465 return u;
\n-
466 }
\n-
\n-
467
\n-
468 template<class Tree, class Child, class TreePath, class U>
\n-
\n-
469 std::size_t beforeChild(Tree&&, Child&&, TreePath, std::size_t /*childIndex*/, U u) const {
\n-
470 // in this case child index is a run-time index: cast accumulated u to std::size_t
\n-
471 return std::size_t{u};
\n-
472 }
\n-
\n-
473
\n-
474 template<class Tree, class TreePath, class U>
\n-
\n-
475 auto leaf(Tree&&, TreePath, U u) const
\n-
476 {
\n-
477 return Hybrid::plus(u,Dune::Indices::_1);
\n-
478 }
\n-
\n-
479
\n-
480 };
\n-
\n-
481
\n-
\n-\n-
483 : public LeafCounterVisitor
\n-
484 {
\n-
485 template<typename Tree, typename TreePath, typename U>
\n-
\n-
486 auto pre(Tree&&, TreePath, U u) const {
\n-
487 return Hybrid::plus(u,Indices::_1);
\n-
488 }
\n-
\n-
489 };
\n-
\n-
490
\n-
\n-\n-
492 : public DefaultHybridVisitor
\n-
493 , public StaticTraversal
\n-
494 , public VisitTree
\n-
495 {
\n-
496 template<class Tree, class TreePath, class U>
\n-
\n-
497 auto leaf(Tree&&, TreePath, U u) const
\n-
498 {
\n-
499 auto path_size = index_constant<treePathSize(TreePath{})>{};
\n-
500 auto depth = Hybrid::plus(path_size,Indices::_1);
\n-
501 return Hybrid::max(depth,u);
\n-
502 }
\n-
\n-
503 };
\n-
\n-
504
\n-
506 // result is alwayas an integral constant
\n-
507 template<typename Tree>
\n-
\n-
508 auto depth(const Tree& tree)
\n-
509 {
\n-
510 return hybridApplyToTree(tree,DepthVisitor{},Indices::_0);
\n-
511 }
\n-
\n-
512
\n-
514 // return types is std::integral_constant.
\n-
515 template<typename Tree>
\n-
\n-
516 constexpr auto depth()
\n-
517 {
\n-
518 return decltype(hybridApplyToTree(std::declval<Tree>(),DepthVisitor{},Indices::_0)){};
\n-
519 }
\n-
\n-
520
\n-
522 // if Tree is dynamic, return type is std::size_t, otherwise std::integral_constant.
\n-
523 template<typename Tree>
\n-
\n-
524 auto nodeCount(const Tree& tree)
\n-
525 {
\n-
526 return hybridApplyToTree(tree,NodeCounterVisitor{},Indices::_0);
\n-
527 }
\n-
\n-
528
\n-
530 // if Tree is dynamic, return type is std::size_t, otherwise std::integral_constant.
\n-
531 template<typename Tree>
\n-
\n-
532 auto leafCount(const Tree& tree)
\n-
533 {
\n-
534 return hybridApplyToTree(tree,LeafCounterVisitor{},Dune::Indices::_0);
\n-
535 }
\n-
\n-
536
\n-
538 template<typename Tree>
\n-
539 constexpr bool isDynamic = std::is_same<std::size_t, decltype(leafCount(std::declval<Tree>()))>{};
\n-
540
\n-
541 } // namespace Experimental::Info
\n-
\n-
542
\n-
544
\n-
545 } // namespace TypeTree
\n-
546} //namespace Dune
\n-
547
\n-
548#endif // DUNE_TYPETREE_VISITOR_HH
\n-\n-
typename impl::_Child< Node, indices... >::type Child
Template alias for the type of a child node given by a list of child indices.
Definition childextraction.hh:225
\n-
constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
Returns the size (number of components) of the given HybridTreePath.
Definition treepath.hh:334
\n+
18 struct LeafNodeTag {};
\n+
19
\n+
21 struct PowerNodeTag {};
\n+
22
\n+\n+
25
\n+\n+
28
\n+
29#ifndef DOXYGEN
\n+
30
\n+
32 struct StartTag {};
\n+
33
\n+
34
\n+
35
\n+
36#endif // DOXYGEN
\n+
37
\n+
39
\n+
40 } // namespace TypeTree
\n+
41} //namespace Dune
\n+
42
\n+
43#endif // DUNE_TYPETREE_NODETAGS_HH
\n
Definition accumulate_static.hh:16
\n-
auto hybridApplyToTree(Tree &&tree, Visitor &&visitor, Init &&init)
Apply hybrid visitor to TypeTree.
Definition accumulate_static.hh:701
\n-
Type
Definition treepath.hh:106
\n-
@ fullyStatic
Definition treepath.hh:106
\n-
@ dynamic
Definition treepath.hh:106
\n-
constexpr bool isDynamic
true if any of the nodes in the tree only has dynamic degree.
Definition visitor.hh:539
\n-
auto leafCount(const Tree &tree)
The number of leaf nodes in the Tree.
Definition visitor.hh:532
\n-
auto nodeCount(const Tree &tree)
The total number of nodes in the Tree.
Definition visitor.hh:524
\n-
constexpr auto depth()
The depth of the Tree.
Definition visitor.hh:516
\n-
Visitor interface and base class for TypeTree visitors.
Definition visitor.hh:49
\n-
void in(T &&, TreePath) const
Method for infix tree traversal.
Definition visitor.hh:72
\n-
void afterChild(T &&, Child &&, TreePath, ChildIndex) const
Method for child-parent traversal.
Definition visitor.hh:122
\n-
void beforeChild(T &&, Child &&, TreePath, ChildIndex) const
Method for parent-child traversal.
Definition visitor.hh:107
\n-
void post(T &&, TreePath) const
Method for postfix tree traversal.
Definition visitor.hh:83
\n-
void leaf(T &&, TreePath) const
Method for leaf traversal.
Definition visitor.hh:93
\n-
void pre(T &&, TreePath) const
Method for prefix tree traversal.
Definition visitor.hh:60
\n-
Visitor interface and base class for visitors of pairs of TypeTrees.
Definition visitor.hh:164
\n-
void leaf(T1 &&, T2 &&, TreePath) const
Method for leaf traversal.
Definition visitor.hh:216
\n-
void beforeChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
Method for parent-child traversal.
Definition visitor.hh:232
\n-
void pre(T1 &&, T2 &&, TreePath) const
Method for prefix tree traversal.
Definition visitor.hh:176
\n-
void post(T1 &&, T2 &&, TreePath) const
Method for postfix traversal.
Definition visitor.hh:201
\n-
void in(T1 &&, T2 &&, TreePath) const
Method for infix tree traversal.
Definition visitor.hh:189
\n-
void afterChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
Method for child-parent traversal.
Definition visitor.hh:248
\n-
Hybrid visitor interface and base class for TypeTree hybrid visitors.
Definition visitor.hh:286
\n-
auto post(T &&, TreePath, const U &u) const
Method for postfix tree traversal.
Definition visitor.hh:316
\n-
auto pre(T &&, TreePath, const U &u) const
Method for prefix tree traversal.
Definition visitor.hh:296
\n-
auto leaf(T &&, TreePath, const U &u) const
Method for leaf traversal.
Definition visitor.hh:326
\n-
auto afterChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
Method for child-parent traversal.
Definition visitor.hh:346
\n-
auto in(T &&, TreePath, const U &u) const
Method for infix tree traversal.
Definition visitor.hh:306
\n-
auto beforeChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
Method for parent-child traversal.
Definition visitor.hh:336
\n-
Mixin base class for visitors that only want to visit the direct children of a node.
Definition visitor.hh:358
\n-
Template struct for determining whether or not to visit a given child.
Definition visitor.hh:370
\n-
static const bool value
Do not visit any child.
Definition visitor.hh:372
\n-
Mixin base class for visitors that want to visit the complete tree.
Definition visitor.hh:384
\n-
Template struct for determining whether or not to visit a given child.
Definition visitor.hh:396
\n-
static const bool value
Visit any child.
Definition visitor.hh:398
\n-
Mixin base class for visitors that require a static TreePath during traversal.
Definition visitor.hh:412
\n-
static const TreePathType::Type treePathType
Use the static tree traversal algorithm.
Definition visitor.hh:414
\n-
Mixin base class for visitors that only need a dynamic TreePath during traversal.
Definition visitor.hh:426
\n-
static const TreePathType::Type treePathType
Use the dynamic tree traversal algorithm.
Definition visitor.hh:428
\n-
Convenience base class for visiting the entire tree.
Definition visitor.hh:435
\n-
Convenience base class for visiting the direct children of a node.
Definition visitor.hh:441
\n-
Convenience base class for visiting an entire tree pair.
Definition visitor.hh:447
\n-
Convenience base class for visiting the direct children of a node pair.
Definition visitor.hh:453
\n-\n-
auto leaf(Tree &&, TreePath, U u) const
Definition visitor.hh:475
\n-
auto beforeChild(Tree &&, Child &&, TreePath, ChildIndex, U u) const
Definition visitor.hh:463
\n-
std::size_t beforeChild(Tree &&, Child &&, TreePath, std::size_t, U u) const
Definition visitor.hh:469
\n-\n-
auto pre(Tree &&, TreePath, U u) const
Definition visitor.hh:486
\n-\n-
auto leaf(Tree &&, TreePath, U u) const
Definition visitor.hh:497
\n+
Tag designating a leaf node.
Definition nodetags.hh:18
\n+
Tag designating a power node.
Definition nodetags.hh:21
\n+
Tag designating a power node with runtime degree.
Definition nodetags.hh:24
\n+
Tag designating a composite node.
Definition nodetags.hh:27
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,481 +1,58 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-visitor.hh\n+nodetags.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_VISITOR_HH\n-7#define DUNE_TYPETREE_VISITOR_HH\n+6#ifndef DUNE_TYPETREE_NODETAGS_HH\n+7#define DUNE_TYPETREE_NODETAGS_HH\n 8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-10#include \n+9namespace _\bD_\bu_\bn_\be {\n+10 namespace TypeTree {\n 11\n-12namespace _\bD_\bu_\bn_\be {\n-13 namespace TypeTree {\n-14\n-21\n-_\b4_\b8 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-49 {\n-50\n-52\n-59 template\n-_\b6_\b0 void _\bp_\br_\be(T&&, TreePath) const {}\n-61\n-63\n-71 template\n-_\b7_\b2 void _\bi_\bn(T&&, TreePath) const {}\n-73\n-75\n-82 template\n-_\b8_\b3 void _\bp_\bo_\bs_\bt(T&&, TreePath) const {}\n-84\n-86\n-92 template\n-_\b9_\b3 void _\bl_\be_\ba_\bf(T&&, TreePath) const {}\n-94\n-96\n-106 template\n-_\b1_\b0_\b7 void _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex) const {}\n-108\n-110\n-121 template\n-_\b1_\b2_\b2 void _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex) const {}\n-123\n-124 };\n-125\n-126\n-128\n-_\b1_\b6_\b3 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-164 {\n-165\n-167\n-175 template\n-_\b1_\b7_\b6 void _\bp_\br_\be(T1&&, T2&&, TreePath) const {}\n-177\n-179\n-188 template\n-_\b1_\b8_\b9 void _\bi_\bn(T1&&, T2&&, TreePath) const {}\n-190\n-192\n-200 template\n-_\b2_\b0_\b1 void _\bp_\bo_\bs_\bt(T1&&, T2&&, TreePath) const {}\n-202\n-204\n-215 template\n-_\b2_\b1_\b6 void _\bl_\be_\ba_\bf(T1&&, T2&&, TreePath) const {}\n-217\n-219\n-231 template\n-_\b2_\b3_\b2 void _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex)\n-const {}\n-233\n-235\n-247 template\n-_\b2_\b4_\b8 void _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const\n-{}\n-249\n-250 };\n-251\n-252\n-253 namespace Experimental {\n-254\n-_\b2_\b8_\b5 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-286 {\n-287\n-295 template\n-_\b2_\b9_\b6 auto _\bp_\br_\be(T&&, TreePath, const U& u) const { return u;}\n-297\n-305 template\n-_\b3_\b0_\b6 auto _\bi_\bn(T&&, TreePath, const U& u) const {return u;}\n-307\n-315 template\n-_\b3_\b1_\b6 auto _\bp_\bo_\bs_\bt(T&&, TreePath, const U& u) const {return u;}\n-317\n-325 template\n-_\b3_\b2_\b6 auto _\bl_\be_\ba_\bf(T&&, TreePath, const U& u) const { return u;}\n-327\n-335 template\n-_\b3_\b3_\b6 auto _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, const U& u) const\n-{return u;}\n-337\n-345 template\n-_\b3_\b4_\b6 auto _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, const U& u) const\n-{return u;}\n-347\n-348 };\n-349 } // namespace Experimental\n-350\n-352\n-_\b3_\b5_\b7 struct _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-358 {\n-359\n-360 // the little trick with the default template arguments\n-361 // makes the class usable for both single-tree visitors\n-362 // and visitors for pairs of trees\n-364 template\n-_\b3_\b6_\b9 struct _\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n-370 {\n-_\b3_\b7_\b2 static const bool _\bv_\ba_\bl_\bu_\be = false;\n-373 };\n-374\n-375 };\n-376\n-377\n-379\n-_\b3_\b8_\b3 struct _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-384 {\n-385\n-386 // the little trick with the default template arguments\n-387 // makes the class usable for both single-tree visitors\n-388 // and visitors for pairs of trees\n-390 template\n-_\b3_\b9_\b5 struct _\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n-396 {\n-_\b3_\b9_\b8 static const bool _\bv_\ba_\bl_\bu_\be = true;\n-399 };\n-400\n-401 };\n-402\n-404\n-_\b4_\b1_\b1 struct _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-412 {\n-_\b4_\b1_\b4 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc;\n-415 };\n-416\n-418\n-_\b4_\b2_\b5 struct _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-426 {\n-_\b4_\b2_\b8 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc;\n-429 };\n-430\n-_\b4_\b3_\b2 struct _\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-433 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-434 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-435 {};\n-436\n-_\b4_\b3_\b8 struct _\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-439 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-440 , public _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-441 {};\n-442\n-_\b4_\b4_\b4 struct _\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-445 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-446 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-447 {};\n-448\n-_\b4_\b5_\b0 struct _\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-451 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-452 , public _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-453 {};\n-454\n-_\b4_\b5_\b5 namespace Experimental::Info {\n-456\n-_\b4_\b5_\b7 struct _\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-458 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-459 , public _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-460 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-461 {\n-462 template\n-_\b4_\b6_\b3 auto _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(Tree&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, U u) const {\n-464 // in this case child index is an integral constant: forward u\n-465 return u;\n-466 }\n-467\n-468 template\n-_\b4_\b6_\b9 std::size_t _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(Tree&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, std::size_t /\n-*childIndex*/, U u) const {\n-470 // in this case child index is a run-time index: cast accumulated u to\n-std::size_t\n-471 return std::size_t{u};\n-472 }\n-473\n-474 template\n-_\b4_\b7_\b5 auto _\bl_\be_\ba_\bf(Tree&&, TreePath, U u) const\n-476 {\n-477 return Hybrid::plus(u,Dune::Indices::_1);\n-478 }\n-479\n-480 };\n-481\n-_\b4_\b8_\b2 struct _\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-483 : public _\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-484 {\n-485 template\n-_\b4_\b8_\b6 auto _\bp_\br_\be(Tree&&, TreePath, U u) const {\n-487 return Hybrid::plus(u,Indices::_1);\n-488 }\n-489 };\n-490\n-_\b4_\b9_\b1 struct _\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-492 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-493 , public _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-494 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-495 {\n-496 template\n-_\b4_\b9_\b7 auto _\bl_\be_\ba_\bf(Tree&&, TreePath, U u) const\n-498 {\n-499 auto path_size = index_constant<_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(TreePath{})>{};\n-500 auto _\bd_\be_\bp_\bt_\bh = Hybrid::plus(path_size,Indices::_1);\n-501 return Hybrid::max(_\bd_\be_\bp_\bt_\bh,u);\n-502 }\n-503 };\n-504\n-506 // result is alwayas an integral constant\n-507 template\n-_\b5_\b0_\b8 auto _\bd_\be_\bp_\bt_\bh(const Tree& tree)\n-509 {\n-510 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Indices::_0);\n-511 }\n-512\n-514 // return types is std::integral_constant.\n-515 template\n-_\b5_\b1_\b6 constexpr auto _\bd_\be_\bp_\bt_\bh()\n-517 {\n-518 return decltype(_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(std::declval(),_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-{},Indices::_0)){};\n-519 }\n-520\n-522 // if Tree is dynamic, return type is std::size_t, otherwise std::\n-integral_constant.\n-523 template\n-_\b5_\b2_\b4 auto _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt(const Tree& tree)\n-525 {\n-526 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Indices::_0);\n-527 }\n-528\n-530 // if Tree is dynamic, return type is std::size_t, otherwise std::\n-integral_constant.\n-531 template\n-_\b5_\b3_\b2 auto _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt(const Tree& tree)\n-533 {\n-534 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Dune::Indices::_0);\n-535 }\n-536\n-538 template\n-_\b5_\b3_\b9 constexpr bool _\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc = std::is_same()))>{};\n-540\n-541 } // namespace Experimental::Info\n-542\n-544\n-545 } // namespace TypeTree\n-546} //namespace Dune\n-547\n-548#endif // DUNE_TYPETREE_VISITOR_HH\n-_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n-typename impl::_Child< Node, indices... >::type Child\n-Template alias for the type of a child node given by a list of child indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n-constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n-Returns the size (number of components) of the given HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n+_\b1_\b8 struct _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n+19\n+_\b2_\b1 struct _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n+22\n+_\b2_\b4 struct _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n+25\n+_\b2_\b7 struct _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n+28\n+29#ifndef DOXYGEN\n+30\n+32 struct StartTag {};\n+33\n+34\n+35\n+36#endif // DOXYGEN\n+37\n+39\n+40 } // namespace TypeTree\n+41} //namespace Dune\n+42\n+43#endif // DUNE_TYPETREE_NODETAGS_HH\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n-auto hybridApplyToTree(Tree &&tree, Visitor &&visitor, Init &&init)\n-Apply hybrid visitor to TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:701\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n-Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc\n-@ fullyStatic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n-@ dynamic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc\n-constexpr bool isDynamic\n-true if any of the nodes in the tree only has dynamic degree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n-auto leafCount(const Tree &tree)\n-The number of leaf nodes in the Tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:532\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n-auto nodeCount(const Tree &tree)\n-The total number of nodes in the Tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n-constexpr auto depth()\n-The depth of the Tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:516\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Visitor interface and base class for TypeTree visitors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n-void in(T &&, TreePath) const\n-Method for infix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n-void afterChild(T &&, Child &&, TreePath, ChildIndex) const\n-Method for child-parent traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n-void beforeChild(T &&, Child &&, TreePath, ChildIndex) const\n-Method for parent-child traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(T &&, TreePath) const\n-Method for postfix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n-void leaf(T &&, TreePath) const\n-Method for leaf traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n-void pre(T &&, TreePath) const\n-Method for prefix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Visitor interface and base class for visitors of pairs of TypeTrees.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n-void leaf(T1 &&, T2 &&, TreePath) const\n-Method for leaf traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n-void beforeChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex)\n-const\n-Method for parent-child traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n-void pre(T1 &&, T2 &&, TreePath) const\n-Method for prefix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:176\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(T1 &&, T2 &&, TreePath) const\n-Method for postfix traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n-void in(T1 &&, T2 &&, TreePath) const\n-Method for infix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n-void afterChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const\n-Method for child-parent traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Hybrid visitor interface and base class for TypeTree hybrid visitors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-auto post(T &&, TreePath, const U &u) const\n-Method for postfix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n-auto pre(T &&, TreePath, const U &u) const\n-Method for prefix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n-auto leaf(T &&, TreePath, const U &u) const\n-Method for leaf traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n-auto afterChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const\n-Method for child-parent traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:346\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n-auto in(T &&, TreePath, const U &u) const\n-Method for infix tree traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n-auto beforeChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const\n-Method for parent-child traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:336\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-Mixin base class for visitors that only want to visit the direct children of a\n-node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:358\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n-Template struct for determining whether or not to visit a given child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:370\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static const bool value\n-Do not visit any child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:372\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n-Mixin base class for visitors that want to visit the complete tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:384\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n-Template struct for determining whether or not to visit a given child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:396\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static const bool value\n-Visit any child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-Mixin base class for visitors that require a static TreePath during traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:412\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n-static const TreePathType::Type treePathType\n-Use the static tree traversal algorithm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n-Mixin base class for visitors that only need a dynamic TreePath during\n-traversal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:426\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n-static const TreePathType::Type treePathType\n-Use the dynamic tree traversal algorithm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Convenience base class for visiting the entire tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:435\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Convenience base class for visiting the direct children of a node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:441\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Convenience base class for visiting an entire tree pair.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:447\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-Convenience base class for visiting the direct children of a node pair.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:453\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:461\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n-auto leaf(Tree &&, TreePath, U u) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:475\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n-auto beforeChild(Tree &&, Child &&, TreePath, ChildIndex, U u) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:463\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n-std::size_t beforeChild(Tree &&, Child &&, TreePath, std::size_t, U u) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n-auto pre(Tree &&, TreePath, U u) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n-auto leaf(Tree &&, TreePath, U u) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a leaf node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node with runtime degree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a composite node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00014.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00014.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: treecontainer.hh File Reference\n+dune-typetree: childextraction.hh File Reference\n \n \n \n \n \n \n \n@@ -70,75 +70,66 @@\n
\n \n
\n \n
\n \n-
treecontainer.hh File Reference
\n+
childextraction.hh File Reference
\n
\n
\n
#include <type_traits>
\n #include <utility>
\n-#include <functional>
\n-#include <array>
\n-#include <dune/common/indices.hh>
\n-#include <dune/common/hybridutilities.hh>
\n-#include <dune/common/rangeutilities.hh>
\n-#include <dune/common/tuplevector.hh>
\n-#include <dune/typetree/treepath.hh>
\n+#include <dune/common/concept.hh>
\n+#include <dune/common/documentation.hh>
\n+#include <dune/common/typetraits.hh>
\n+#include <dune/common/shared_ptr.hh>
\n+#include <dune/typetree/nodeinterface.hh>
\n+#include <dune/typetree/treepath.hh>
\n
\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-\n-

\n-Classes

class  Dune::TypeTree::Detail::ContainerFactory< LeafToValue >
 
class  Dune::TypeTree::Detail::TreeContainerVectorBackend< Container >
 
struct  Dune::TypeTree::Detail::LeafToDefaultConstructibleValue< LeafToValue >
 
\n \n \n \n \n \n-\n-\n

\n Namespaces

namespace  Dune
 
namespace  Dune::TypeTree
 
namespace  Dune::TypeTree::Detail
 
\n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

\n Typedefs

template<class Value , class Tree >
using Dune::TypeTree::UniformTreeContainer = std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >()))>
 Alias to container type generated by makeTreeContainer for given tree type and uniform value type.
 
template<template< class Node > class LeafToValue, class Tree >
using Dune::TypeTree::TreeContainer = std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))>
 Alias to container type generated by makeTreeContainer for give tree type and when using LeafToValue to create values.
 
template<typename Node , std::size_t... indices>
using Dune::TypeTree::Child = typename impl::_Child< Node, indices... >::type
 Template alias for the type of a child node given by a list of child indices.
 
template<typename Node , typename TreePath >
using Dune::TypeTree::ChildForTreePath = typename impl::_ChildForTreePath< Node, TreePath >::type
 Template alias for the type of a child node given by a TreePath or a HybridTreePath type.
 
template<typename T >
using Dune::TypeTree::is_flat_index = typename impl::_is_flat_index< std::decay_t< T > >::type
 Type trait that determines whether T is a flat index in the context of child extraction.
 
\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

\n Functions

template<class Container >
auto Dune::TypeTree::Detail::makeTreeContainerVectorBackend (Container &&container)
 
template<class Tree , class LeafToValue >
auto Dune::TypeTree::makeTreeContainer (const Tree &tree, LeafToValue &&leafToValue)
 Create container havin the same structure as the given tree.
 
template<class Value , class Tree >
auto Dune::TypeTree::makeTreeContainer (const Tree &tree)
 Create container havin the same structure as the given tree.
 
template<typename Node , typename... Indices>
ImplementationDefined Dune::TypeTree::child (Node &&node, Indices... indices)
 Extracts the child of a node given by a sequence of compile-time and run-time indices.
 
template<typename Node , typename... Indices>
ImplementationDefined Dune::TypeTree::childStorage (Node &&node, Indices... indices)
 
template<typename Node , typename... Indices>
ImplementationDefined Dune::TypeTree::child (Node &&node, HybridTreePath< Indices... > treePath)
 Extracts the child of a node given by a HybridTreePath object.
 
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,62 +1,58 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-treecontainer.hh File Reference\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+childextraction.hh File Reference\n #include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bL_\be_\ba_\bf_\bT_\bo_\bV_\ba_\bl_\bu_\be_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b<_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be_\b<_\b _\bL_\be_\ba_\bf_\bT_\bo_\bV_\ba_\bl_\bu_\be_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n-\u00a0\n T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t< decltype\n- (_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br< Value >(std::declval< const Tree & >()))>\n-\u00a0 Alias to container type generated by makeTreeContainer for given tree\n- type and uniform value type.\n-\u00a0\n-template class LeafToValue, class Tree >\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t< decltype(_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n- (std::declval< const Tree & >(), std::declval< _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:\n- _\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be< LeafToValue > >()))>\n-\u00a0 Alias to container type generated by makeTreeContainer for give tree\n- type and when using LeafToValue to create values.\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd = typename impl::_Child< Node, indices... >::type\n+\u00a0 Template alias for the type of a child node given by a list of child\n+ indices.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = typename impl::_ChildForTreePath<\n+ Node, TreePath >::type\n+\u00a0 Template alias for the type of a child node given by a TreePath or a\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh type.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx = typename impl::_is_flat_index< std::\n+ decay_t< T > >::type\n+\u00a0 Type trait that determines whether T is a flat index in the context of\n+ child extraction.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd (Container\n- &&container)\n-\u00a0\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br (const Tree &tree, LeafToValue\n- &&leafToValue)\n-\u00a0 Create container havin the same structure as the given tree.\n-\u00a0\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br (const Tree &tree)\n-\u00a0 Create container havin the same structure as the given tree.\n+template\n+ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd (Node &&node, Indices... indices)\n+\u00a0 Extracts the child of a node given by a sequence of\n+ compile-time and run-time indices.\n+\u00a0\n+template\n+ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node &&node, Indices...\n+ indices)\n+\u00a0\n+template\n+ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd (Node &&node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n+ Indices... > _\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n+\u00a0 Extracts the child of a node given by a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+ object.\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00014_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00014_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: treecontainer.hh Source File\n+dune-typetree: childextraction.hh Source File\n \n \n \n \n \n \n \n@@ -74,332 +74,289 @@\n \n
\n \n
\n \n
\n-
treecontainer.hh
\n+
childextraction.hh
\n
\n
\n-Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n-
2// vi: set et ts=4 sw=2 sts=2:
\n+Go to the documentation of this file.
1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n+
2// vi: set et ts=8 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
\n
5
\n-
6#ifndef DUNE_TYPETREE_TREECONTAINER_HH
\n-
7#define DUNE_TYPETREE_TREECONTAINER_HH
\n+
6#ifndef DUNE_TYPETREE_CHILDEXTRACTION_HH
\n+
7#define DUNE_TYPETREE_CHILDEXTRACTION_HH
\n
8
\n
9#include <type_traits>
\n
10#include <utility>
\n-
11#include <functional>
\n-
12#include <array>
\n-
13
\n-
14#include <dune/common/indices.hh>
\n-
15#include <dune/common/hybridutilities.hh>
\n-
16#include <dune/common/rangeutilities.hh>
\n-
17#include <dune/common/tuplevector.hh>
\n-
18
\n-\n+
11
\n+
12#include <dune/common/concept.hh>
\n+
13#include <dune/common/documentation.hh>
\n+
14#include <dune/common/typetraits.hh>
\n+
15#include <dune/common/shared_ptr.hh>
\n+
16
\n+\n+\n+
19
\n
20
\n
21namespace Dune {
\n
22 namespace TypeTree {
\n
23
\n-
24 namespace Detail {
\n-
25
\n-
26 /*
\n-
27 * \\brief A factory class creating a hybrid container compatible with a type tree
\n-
28 *
\n-
29 * This class allows to create a nested hybrid container having the same structure
\n-
30 * as a given type tree. Power nodes are represented as std::array's while composite
\n-
31 * nodes are represented as Dune::TupleVector's. The stored values for the leaf nodes
\n-
32 * are creating using a given predicate. Once created, the factory provides an
\n-
33 * operator() creating the container for the tree given as argument.
\n-
34 *
\n-
35 * \\tparam LeafToValue Type of a predicate that determines the stored values at the leafs
\n-
36 */
\n-
37 template<class LeafToValue>
\n-
\n-\n-
39 {
\n-
40 template<class N>
\n-
41 using DynamicDegreeConcept = decltype((std::size_t(std::declval<N>().degree()), true));
\n-
42
\n-
43 template<class N>
\n-
44 using StaticDegreeConcept = decltype((std::integral_constant<std::size_t, N::degree()>{}, true));
\n-
45
\n-
46 template<class N>
\n-
47 using DynamicChildAccessConcept = decltype((std::declval<N>().child(0u), true));
\n+
28
\n+
29#ifndef DOXYGEN
\n+
30
\n+
31 namespace Impl {
\n+
32
\n+
33 // check at run time whether index is a valid child index
\n+
34 template <class Node, class Index>
\n+
35 std::true_type checkChildIndex (Node const& node, Index i)
\n+
36 {
\n+
37 assert(std::size_t(i) < node.degree() && "Child index out of range");
\n+
38 return {};
\n+
39 }
\n+
40
\n+
41 // check at compile time whether index is a valid index
\n+
42 template <class Node, std::size_t i>
\n+
43 std::bool_constant<(i < Node::degree())> checkChildIndex (Node const& node, index_constant<i>)
\n+
44 {
\n+
45 static_assert(i < Node::degree(), "Child index out of range");
\n+
46 return {};
\n+
47 }
\n
48
\n-
49 public:
\n-
50
\n-
\n-
58 ContainerFactory(LeafToValue leafToValue) :
\n-
59 leafToValue_(leafToValue)
\n-
60 {}
\n+
49 // finally return the node itself if no further indices are provided. Break condition
\n+
50 // for the recursion over the node childs.
\n+
51 template<class Node>
\n+
52 decltype(auto) childImpl (Node&& node)
\n+
53 {
\n+
54 return std::forward<Node>(node);
\n+
55 }
\n+
56
\n+
57 template<class NodePtr>
\n+
58 auto childStorageImpl (NodePtr&& nodePtr)
\n+
59 {
\n+
60 return std::forward<NodePtr>(nodePtr);
\n+
61 }
\n+
62
\n+
63 // recursively call `node.child(...)` with the given indices
\n+
64 template<class Node, class I0, class... I>
\n+
65 decltype(auto) childImpl (Node&& node, I0 i0, [[maybe_unused]] I... i)
\n+
66 {
\n+
67 auto valid = checkChildIndex(node,i0);
\n+
68 if constexpr (valid)
\n+
69 return childImpl(node.child(i0),i...);
\n+
70 else
\n+
71 return;
\n+
72 }
\n+
73
\n+
74 // recursively call `node.childStorage(...)` with the given indices
\n+
75 template<class NodePtr, class I0, class... I>
\n+
76 decltype(auto) childStorageImpl (NodePtr&& nodePtr, I0 i0, [[maybe_unused]] I... i)
\n+
77 {
\n+
78 auto valid = checkChildIndex(*nodePtr,i0);
\n+
79 if constexpr (valid)
\n+
80 return childStorageImpl(nodePtr->childStorage(i0),i...);
\n+
81 else
\n+
82 return;
\n+
83 }
\n+
84
\n+
85 // forward to the impl methods by extracting the indices from the treepath
\n+
86 template<class Node, class... Indices, std::size_t... i>
\n+
87 decltype(auto) child (Node&& node, [[maybe_unused]] HybridTreePath<Indices...> tp, std::index_sequence<i...>)
\n+
88 {
\n+
89 return childImpl(std::forward<Node>(node),treePathEntry<i>(tp)...);
\n+
90 }
\n+
91
\n+
92 // forward to the impl methods by extracting the indices from the treepath
\n+
93 template<class NodePtr, class... Indices, std::size_t... i>
\n+
94 decltype(auto) childStorage (NodePtr&& nodePtr, [[maybe_unused]] HybridTreePath<Indices...> tp, std::index_sequence<i...>)
\n+
95 {
\n+
96 return childStorageImpl(std::forward<NodePtr>(nodePtr),treePathEntry<i>(tp)...);
\n+
97 }
\n+
98
\n+
99 } // end namespace Impl
\n+
100
\n+
101#endif // DOXYGEN
\n+
102
\n+
104
\n+
126 template<typename Node, typename... Indices>
\n+
127#ifdef DOXYGEN
\n+
\n+
128 ImplementationDefined child (Node&& node, Indices... indices)
\n+
129#else
\n+
130 decltype(auto) child (Node&& node, Indices... indices)
\n+
131#endif
\n+
132 {
\n+
133 return Impl::childImpl(std::forward<Node>(node),indices...);
\n+
134 }
\n
\n-
61
\n-
62 template<class Node>
\n-
\n-
63 auto operator()(const Node& node)
\n-
64 {
\n-
65 return (*this)(node, Dune::PriorityTag<5>{});
\n-
66 }
\n-
\n-
67
\n-
68 private:
\n-
69
\n-
70 template<class Node,
\n-
71 std::enable_if_t<Node::isLeaf, bool> = true>
\n-
72 auto operator()(const Node& node, Dune::PriorityTag<4>)
\n-
73 {
\n-
74 return leafToValue_(node);
\n-
75 }
\n-
76
\n-
77 template<class Node,
\n-
78 StaticDegreeConcept<Node> = true,
\n-
79 DynamicChildAccessConcept<Node> = true>
\n-
80 auto operator()(const Node& node, Dune::PriorityTag<3>)
\n-
81 {
\n-
82 return Dune::unpackIntegerSequence([&](auto... indices) {
\n-
83 return std::array{(*this)(node.child(indices))...};
\n-
84 }, std::make_index_sequence<std::size_t(Node::degree())>());
\n-
85 }
\n-
86
\n-
87 template<class Node,
\n-
88 DynamicDegreeConcept<Node> = true,
\n-
89 DynamicChildAccessConcept<Node> = true>
\n-
90 auto operator()(const Node& node, Dune::PriorityTag<2>)
\n-
91 {
\n-
92 using TransformedChild = decltype((*this)(node.child(0)));
\n-
93 std::vector<TransformedChild> container;
\n-
94 container.reserve(node.degree());
\n-
95 for (std::size_t i = 0; i < node.degree(); ++i)
\n-
96 container.emplace_back((*this)(node.child(i)));
\n-
97 return container;
\n-
98 }
\n-
99
\n-
100 template<class Node,
\n-
101 StaticDegreeConcept<Node> = true>
\n-
102 auto operator()(const Node& node, Dune::PriorityTag<1>)
\n-
103 {
\n-
104 return Dune::unpackIntegerSequence([&](auto... indices) {
\n-
105 return Dune::makeTupleVector((*this)(node.child(indices))...);
\n-
106 }, std::make_index_sequence<std::size_t(Node::degree())>());
\n-
107 }
\n-
108
\n-
109 private:
\n-
110 LeafToValue leafToValue_;
\n-
111 };
\n-
\n-
112
\n-
113
\n-
114 /*
\n-
115 * \\brief Wrap nested container to provide a VectorBackend
\n-
116 */
\n-
117 template<class Container>
\n-
\n-\n-
119 {
\n-
120 template<class C>
\n-
121 static constexpr decltype(auto) accessByTreePath(C&& container, const HybridTreePath<>& path)
\n-
122 {
\n-
123 return container;
\n-
124 }
\n-
125
\n-
126 template<class C, class... T>
\n-
127 static constexpr decltype(auto) accessByTreePath(C&& container, const HybridTreePath<T...>& path)
\n-
128 {
\n-
129 auto head = path[Dune::Indices::_0];
\n-
130 auto tailPath = Dune::unpackIntegerSequence([&](auto... i){
\n-
131 return treePath(path[Dune::index_constant<i+1>{}]...);
\n-
132 }, std::make_index_sequence<sizeof...(T)-1>());
\n-
133 return accessByTreePath(container[head], tailPath);
\n-
134 }
\n
135
\n-
136 template<class C, class Tree,
\n-
137 std::enable_if_t<Tree::isLeaf, bool> = true>
\n-
138 static void resizeImpl(C& /*container*/, const Tree& /*tree*/, Dune::PriorityTag<2>)
\n-
139 {
\n-
140 /* do nothing */
\n-
141 }
\n-
142
\n-
143 template<class C, class Tree,
\n-
144 class = decltype(std::declval<C>().resize(0u))>
\n-
145 static void resizeImpl(C& container, const Tree& tree, Dune::PriorityTag<1>)
\n-
146 {
\n-
147 container.resize(tree.degree());
\n-
148 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {
\n-
149 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});
\n-
150 });
\n-
151 }
\n-
152
\n-
153 template<class C, class Tree>
\n-
154 static void resizeImpl(C& container, const Tree& tree, Dune::PriorityTag<0>)
\n-
155 {
\n-
156 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {
\n-
157 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});
\n-
158 });
\n-
159 }
\n-
160
\n-
161 template<class T>
\n-
162 using TypeTreeConcept = decltype((
\n-
163 std::declval<T>().degree(),
\n-
164 T::isLeaf,
\n-
165 T::isPower,
\n-
166 T::isComposite,
\n-
167 true));
\n-
168
\n-
169 public:
\n-
\n-
171 TreeContainerVectorBackend(Container&& container) :
\n-
172 container_(std::move(container))
\n-
173 {}
\n-
\n-
174
\n-
176 template <class Tree, TypeTreeConcept<Tree> = true>
\n-
\n-
177 TreeContainerVectorBackend(const Tree& tree) :
\n-\n-
179 {
\n-
180 this->resize(tree);
\n-
181 }
\n-
\n-
182
\n-
184 template <class C = Container,
\n-
185 std::enable_if_t<std::is_default_constructible_v<C>, bool> = true>
\n-
\n-\n-
187 container_()
\n-
188 {}
\n-
\n-
189
\n-
190 template<class... T>
\n-
\n-
191 decltype(auto) operator[](const HybridTreePath<T...>& path) const
\n-
192 {
\n-
193 return accessByTreePath(container_, path);
\n-
194 }
\n-
\n-
195
\n-
196 template<class... T>
\n-
\n-
197 decltype(auto) operator[](const HybridTreePath<T...>& path)
\n-
198 {
\n-
199 return accessByTreePath(container_, path);
\n-
200 }
\n-
\n-
201
\n-
203 template<class Tree, TypeTreeConcept<Tree> = true>
\n-
\n-
204 void resize(const Tree& tree)
\n-
205 {
\n-
206 resizeImpl(container_, tree, Dune::PriorityTag<5>{});
\n-
207 }
\n-
\n-
208
\n-
\n-
209 const Container& data() const
\n-
210 {
\n-
211 return container_;
\n-
212 }
\n-
\n+
136 template<typename Node, typename... Indices>
\n+
137#ifdef DOXYGEN
\n+
\n+
138 ImplementationDefined childStorage (Node&& node, Indices... indices)
\n+
139#else
\n+
140 auto childStorage (Node&& node, Indices... indices)
\n+
141#endif
\n+
142 {
\n+
143 static_assert(sizeof...(Indices) > 0, "childStorage() cannot be called with an empty list of child indices");
\n+
144 return Impl::childStorageImpl(&node,indices...);
\n+
145 }
\n+
\n+
146
\n+
148
\n+
171 template<typename Node, typename... Indices>
\n+
172#ifdef DOXYGEN
\n+
\n+
173 ImplementationDefined child (Node&& node, HybridTreePath<Indices...> treePath)
\n+
174#else
\n+
175 decltype(auto) child (Node&& node, HybridTreePath<Indices...> tp)
\n+
176#endif
\n+
177 {
\n+
178 return Impl::child(std::forward<Node>(node),tp,std::index_sequence_for<Indices...>{});
\n+
179 }
\n+
\n+
180
\n+
181 template<typename Node, typename... Indices>
\n+
182#ifdef DOXYGEN
\n+
183 ImplementationDefined child (Node&& node, HybridTreePath<Indices...> treePath)
\n+
184#else
\n+
185 auto childStorage (Node&& node, HybridTreePath<Indices...> tp)
\n+
186#endif
\n+
187 {
\n+
188 static_assert(sizeof...(Indices) > 0, "childStorage() cannot be called with an empty TreePath");
\n+
189 return Impl::childStorage(&node,tp,std::index_sequence_for<Indices...>{});
\n+
190 }
\n+
191
\n+
192
\n+
193#ifndef DOXYGEN
\n+
194
\n+
195 namespace impl {
\n+
196
\n+
197 template<typename T>
\n+
198 struct filter_void
\n+
199 {
\n+
200 using type = T;
\n+
201 };
\n+
202
\n+
203 template<>
\n+
204 struct filter_void<void>
\n+
205 {};
\n+
206
\n+
207 template<typename Node, std::size_t... indices>
\n+
208 struct _Child
\n+
209 : public filter_void<std::decay_t<decltype(child(std::declval<Node>(),index_constant<indices>{}...))>>
\n+
210 {};
\n+
211
\n+
212 }
\n
213
\n-
\n-
214 Container& data()
\n-
215 {
\n-
216 return container_;
\n-
217 }
\n-
\n-
218
\n-
219 private:
\n-
220 Container container_;
\n-
221 };
\n-
\n-
222
\n-
223 template<class Container>
\n-
\n-
224 auto makeTreeContainerVectorBackend(Container&& container)
\n-
225 {
\n-
226 return TreeContainerVectorBackend<std::decay_t<Container>>(std::forward<Container>(container));
\n-
227 }
\n-
\n-
228
\n-
229 /*
\n-
230 * \\brief A simple lambda for creating default constructible values from a node
\n-
231 *
\n-
232 * This simply returns LeafToValue<Node>{} for a given Node. It's needed
\n-
233 * because using a lambda expression in a using declaration is not allowed
\n-
234 * because it's an unevaluated context.
\n-
235 */
\n-
236 template<template<class Node> class LeafToValue>
\n-
\n-\n-
238 {
\n-
239 template<class Node>
\n-
\n-
240 auto operator()(const Node& node) const
\n-
241 {
\n-
242 return LeafToValue<Node>{};
\n-
243 }
\n-
\n-
244 };
\n-
\n-
245
\n-
246 } // namespace Detail
\n-
247
\n-
267 template<class Tree, class LeafToValue>
\n-
\n-
268 auto makeTreeContainer(const Tree& tree, LeafToValue&& leafToValue)
\n-
269 {
\n-
270 auto f = std::ref(leafToValue);
\n-\n-
272 return Detail::makeTreeContainerVectorBackend(factory(tree));
\n+
214#endif // DOXYGEN
\n+
215
\n+
217
\n+
224 template<typename Node, std::size_t... indices>
\n+
225 using Child = typename impl::_Child<Node,indices...>::type;
\n+
226
\n+
227
\n+
228#ifndef DOXYGEN
\n+
229
\n+
230 namespace impl {
\n+
231
\n+
232 template<typename Node, typename TreePath>
\n+
233 struct _ChildForTreePath
\n+
234 {
\n+
235 using type = typename std::decay<decltype(child(std::declval<Node>(),std::declval<TreePath>()))>::type;
\n+
236 };
\n+
237
\n+
238 }
\n+
239
\n+
240#endif // DOXYGEN
\n+
241
\n+
243
\n+
251 template<typename Node, typename TreePath>
\n+
252 using ChildForTreePath = typename impl::_ChildForTreePath<Node,TreePath>::type;
\n+
253
\n+
254
\n+
255#ifndef DOXYGEN
\n+
256
\n+
257 namespace impl {
\n+
258
\n+
259 // By default, types are flat indices if they are integral
\n+
260 template<typename T>
\n+
261 struct _is_flat_index
\n+
262 {
\n+
263 using type = std::is_integral<T>;
\n+
264 };
\n+
265
\n+
266 // And so is any index_constant
\n+
267 template<std::size_t i>
\n+
268 struct _is_flat_index<index_constant<i>>
\n+
269 {
\n+
270 using type = std::true_type;
\n+
271 };
\n+
272
\n
273 }
\n-
\n
274
\n-
290 template<class Value, class Tree>
\n-
\n-
291 auto makeTreeContainer(const Tree& tree)
\n-
292 {
\n-
293 return makeTreeContainer(tree, [](const auto&) {return Value{};});
\n-
294 }
\n-
\n-
295
\n-
299 template<class Value, class Tree>
\n-
300 using UniformTreeContainer = std::decay_t<decltype(makeTreeContainer<Value>(std::declval<const Tree&>()))>;
\n-
301
\n-
305 template<template<class Node> class LeafToValue, class Tree>
\n-
306 using TreeContainer = std::decay_t<decltype(makeTreeContainer(std::declval<const Tree&>(), std::declval<Detail::LeafToDefaultConstructibleValue<LeafToValue>>()))>;
\n-
307
\n-
309
\n-
310 } // namespace TypeTree
\n-
311} //namespace Dune
\n+
275#endif // DOXYGEN
\n+
276
\n+
278 /*
\n+
279 * This type trait can be used to check whether T is a flat index (i.e. either `std::size_t`
\n+
280 * or `index_constant`). The type trait normalizes T before doing the check, so it will also
\n+
281 * work correctly for references and cv-qualified types.
\n+
282 */
\n+
283 template<typename T>
\n+
284 using is_flat_index = typename impl::_is_flat_index<std::decay_t<T>>::type;
\n+
285
\n+
286#ifndef DOXYGEN
\n+
287
\n+
288 namespace impl {
\n+
289
\n+
290 // helper function for check in member child() functions that tolerates being passed something that
\n+
291 // isn't a TreePath. It will just return 0 in that case
\n+
292
\n+
293 template<typename T>
\n+
294 constexpr typename std::enable_if<
\n+\n+
296 bool
\n+
297 >::type
\n+
298 _non_empty_tree_path (T)
\n+
299 {
\n+
300 return false;
\n+
301 }
\n+
302
\n+
303 template<typename T>
\n+
304 constexpr typename std::enable_if<
\n+\n+
306 bool
\n+
307 >::type
\n+
308 _non_empty_tree_path (T t)
\n+
309 {
\n+
310 return treePathSize(t) > 0;
\n+
311 }
\n
312
\n-
313#endif // DUNE_TYPETREE_TREECONTAINER_HH
\n-\n-
auto makeTreeContainer(const Tree &tree, LeafToValue &&leafToValue)
Create container havin the same structure as the given tree.
Definition treecontainer.hh:268
\n-
std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >()))> UniformTreeContainer
Alias to container type generated by makeTreeContainer for given tree type and uniform value type.
Definition treecontainer.hh:300
\n-
std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))> TreeContainer
Alias to container type generated by makeTreeContainer for give tree type and when using LeafToValue ...
Definition treecontainer.hh:306
\n-
std::size_t degree(const Node &node)
Returns the degree of node as run time information.
Definition nodeinterface.hh:79
\n+
313 }
\n+
314
\n+
315#endif // DOXYGEN
\n+
316
\n+
318
\n+
319 } // namespace TypeTree
\n+
320} //namespace Dune
\n+
321
\n+
322#endif // DUNE_TYPETREE_CHILDEXTRACTION_HH
\n+\n+\n+
typename impl::_is_flat_index< std::decay_t< T > >::type is_flat_index
Type trait that determines whether T is a flat index in the context of child extraction.
Definition childextraction.hh:284
\n+
ImplementationDefined childStorage(Node &&node, Indices... indices)
Definition childextraction.hh:138
\n+
typename impl::_Child< Node, indices... >::type Child
Template alias for the type of a child node given by a list of child indices.
Definition childextraction.hh:225
\n+
ImplementationDefined child(Node &&node, Indices... indices)
Extracts the child of a node given by a sequence of compile-time and run-time indices.
Definition childextraction.hh:128
\n+
typename impl::_ChildForTreePath< Node, TreePath >::type ChildForTreePath
Template alias for the type of a child node given by a TreePath or a HybridTreePath type.
Definition childextraction.hh:252
\n+
constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
Returns the size (number of components) of the given HybridTreePath.
Definition treepath.hh:334
\n
constexpr auto treePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition treepath.hh:326
\n
Definition accumulate_static.hh:16
\n-
auto makeTreeContainerVectorBackend(Container &&container)
Definition treecontainer.hh:224
\n-
Definition treecontainer.hh:39
\n-
auto operator()(const Node &node)
Definition treecontainer.hh:63
\n-
ContainerFactory(LeafToValue leafToValue)
Create ContainerFactory.
Definition treecontainer.hh:58
\n-\n-
void resize(const Tree &tree)
Resize the (nested) container depending on the degree of the tree nodes.
Definition treecontainer.hh:204
\n-
Container & data()
Definition treecontainer.hh:214
\n-
const Container & data() const
Definition treecontainer.hh:209
\n-
TreeContainerVectorBackend(Container &&container)
Move the passed container into the internal storage.
Definition treecontainer.hh:171
\n-
TreeContainerVectorBackend()
Default constructor. The stored container might need to be resized before usage.
Definition treecontainer.hh:186
\n-
TreeContainerVectorBackend(const Tree &tree)
Default construct the container and perform a resize depending on the tree-node degrees.
Definition treecontainer.hh:177
\n-\n-
auto operator()(const Node &node) const
Definition treecontainer.hh:240
\n
A hybrid version of TreePath that supports both compile time and run time indices.
Definition treepath.hh:158
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,367 +1,323 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-treecontainer.hh\n+childextraction.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n+1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=8 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TREECONTAINER_HH\n-7#define DUNE_TYPETREE_TREECONTAINER_HH\n+6#ifndef DUNE_TYPETREE_CHILDEXTRACTION_HH\n+7#define DUNE_TYPETREE_CHILDEXTRACTION_HH\n 8\n 9#include \n 10#include \n-11#include \n-12#include \n-13\n-14#include \n-15#include \n-16#include \n-17#include \n-18\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+11\n+12#include \n+13#include \n+14#include \n+15#include \n+16\n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+19\n 20\n 21namespace _\bD_\bu_\bn_\be {\n 22 namespace TypeTree {\n 23\n-24 namespace Detail {\n-25\n-26 /*\n-27 * \\brief A factory class creating a hybrid container compatible with a type\n-tree\n-28 *\n-29 * This class allows to create a nested hybrid container having the same\n-structure\n-30 * as a given type tree. Power nodes are represented as std::array's while\n-composite\n-31 * nodes are represented as Dune::TupleVector's. The stored values for the\n-leaf nodes\n-32 * are creating using a given predicate. Once created, the factory provides\n-an\n-33 * operator() creating the container for the tree given as argument.\n-34 *\n-35 * \\tparam LeafToValue Type of a predicate that determines the stored values\n-at the leafs\n-36 */\n-37 template\n-_\b3_\b8 class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-39 {\n-40 template\n-41 using DynamicDegreeConcept = decltype((std::size_t(std::declval()._\bd_\be_\bg_\br_\be_\be\n-()), true));\n-42\n-43 template\n-44 using StaticDegreeConcept = decltype((std::integral_constant{}, true));\n-45\n-46 template\n-47 using DynamicChildAccessConcept = decltype((std::declval().child(0u),\n-true));\n+28\n+29#ifndef DOXYGEN\n+30\n+31 namespace Impl {\n+32\n+33 // check at run time whether index is a valid child index\n+34 template \n+35 std::true_type checkChildIndex (Node const& node, Index i)\n+36 {\n+37 assert(std::size_t(i) < node.degree() && \"Child index out of range\");\n+38 return {};\n+39 }\n+40\n+41 // check at compile time whether index is a valid index\n+42 template \n+43 std::bool_constant<(i < Node::degree())> checkChildIndex (Node const& node,\n+index_constant)\n+44 {\n+45 static_assert(i < Node::degree(), \"Child index out of range\");\n+46 return {};\n+47 }\n 48\n-49 public:\n-50\n-_\b5_\b8 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by(LeafToValue leafToValue) :\n-59 leafToValue_(leafToValue)\n-60 {}\n-61\n-62 template\n-_\b6_\b3 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node)\n-64 {\n-65 return (*this)(node, Dune::PriorityTag<5>{});\n-66 }\n-67\n-68 private:\n-69\n-70 template = true>\n-72 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<4>)\n-73 {\n-74 return leafToValue_(node);\n-75 }\n-76\n-77 template = true,\n-79 DynamicChildAccessConcept = true>\n-80 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<3>)\n-81 {\n-82 return Dune::unpackIntegerSequence([&](auto... indices) {\n-83 return std::array{(*this)(node.child(indices))...};\n-84 }, std::make_index_sequence());\n-85 }\n-86\n-87 template = true,\n-89 DynamicChildAccessConcept = true>\n-90 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<2>)\n-91 {\n-92 using TransformedChild = decltype((*this)(node.child(0)));\n-93 std::vector container;\n-94 container.reserve(node.degree());\n-95 for (std::size_t i = 0; i < node.degree(); ++i)\n-96 container.emplace_back((*this)(node.child(i)));\n-97 return container;\n-98 }\n-99\n-100 template = true>\n-102 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<1>)\n-103 {\n-104 return Dune::unpackIntegerSequence([&](auto... indices) {\n-105 return Dune::makeTupleVector((*this)(node.child(indices))...);\n-106 }, std::make_index_sequence());\n-107 }\n-108\n-109 private:\n-110 LeafToValue leafToValue_;\n-111 };\n-112\n-113\n-114 /*\n-115 * \\brief Wrap nested container to provide a VectorBackend\n-116 */\n-117 template\n-_\b1_\b1_\b8 class _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-119 {\n-120 template\n-121 static constexpr decltype(auto) accessByTreePath(C&& container, const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b>& path)\n-122 {\n-123 return container;\n-124 }\n-125\n-126 template\n-127 static constexpr decltype(auto) accessByTreePath(C&& container, const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path)\n-128 {\n-129 auto head = path[Dune::Indices::_0];\n-130 auto tailPath = Dune::unpackIntegerSequence([&](auto... i){\n-131 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(path[Dune::index_constant{}]...);\n-132 }, std::make_index_sequence());\n-133 return accessByTreePath(container[head], tailPath);\n+49 // finally return the node itself if no further indices are provided. Break\n+condition\n+50 // for the recursion over the node childs.\n+51 template\n+52 decltype(auto) childImpl (Node&& node)\n+53 {\n+54 return std::forward(node);\n+55 }\n+56\n+57 template\n+58 auto childStorageImpl (NodePtr&& nodePtr)\n+59 {\n+60 return std::forward(nodePtr);\n+61 }\n+62\n+63 // recursively call `node.child(...)` with the given indices\n+64 template\n+65 decltype(auto) childImpl (Node&& node, I0 i0, [[maybe_unused]] I... i)\n+66 {\n+67 auto valid = checkChildIndex(node,i0);\n+68 if constexpr (valid)\n+69 return childImpl(node.child(i0),i...);\n+70 else\n+71 return;\n+72 }\n+73\n+74 // recursively call `node.childStorage(...)` with the given indices\n+75 template\n+76 decltype(auto) childStorageImpl (NodePtr&& nodePtr, I0 i0, [[maybe_unused]]\n+I... i)\n+77 {\n+78 auto valid = checkChildIndex(*nodePtr,i0);\n+79 if constexpr (valid)\n+80 return childStorageImpl(nodePtr->childStorage(i0),i...);\n+81 else\n+82 return;\n+83 }\n+84\n+85 // forward to the impl methods by extracting the indices from the treepath\n+86 template\n+87 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, [[maybe_unused]]\n+HybridTreePath tp, std::index_sequence)\n+88 {\n+89 return childImpl(std::forward(node),treePathEntry(tp)...);\n+90 }\n+91\n+92 // forward to the impl methods by extracting the indices from the treepath\n+93 template\n+94 decltype(auto) _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (NodePtr&& nodePtr, [[maybe_unused]]\n+HybridTreePath tp, std::index_sequence)\n+95 {\n+96 return childStorageImpl(std::forward(nodePtr),treePathEntry\n+(tp)...);\n+97 }\n+98\n+99 } // end namespace Impl\n+100\n+101#endif // DOXYGEN\n+102\n+104\n+126 template\n+127#ifdef DOXYGEN\n+_\b1_\b2_\b8 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, Indices... indices)\n+129#else\n+130 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, Indices... indices)\n+131#endif\n+132 {\n+133 return Impl::childImpl(std::forward(node),indices...);\n 134 }\n 135\n-136 template = true>\n-138 static void resizeImpl(C& /*container*/, const Tree& /*tree*/, Dune::\n-PriorityTag<2>)\n-139 {\n-140 /* do nothing */\n-141 }\n-142\n-143 template().resize(0u))>\n-145 static void resizeImpl(C& container, const Tree& tree, Dune::\n-PriorityTag<1>)\n-146 {\n-147 container.resize(tree.degree());\n-148 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {\n-149 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});\n-150 });\n-151 }\n-152\n-153 template\n-154 static void resizeImpl(C& container, const Tree& tree, Dune::\n-PriorityTag<0>)\n-155 {\n-156 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {\n-157 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});\n-158 });\n-159 }\n-160\n-161 template\n-162 using TypeTreeConcept = decltype((\n-163 std::declval().degree(),\n-164 T::isLeaf,\n-165 T::isPower,\n-166 T::isComposite,\n-167 true));\n-168\n-169 public:\n-_\b1_\b7_\b1 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(Container&& container) :\n-172 container_(std::move(container))\n-173 {}\n-174\n-176 template = true>\n-_\b1_\b7_\b7 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(const Tree& tree) :\n-178 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd()\n-179 {\n-180 this->resize(tree);\n-181 }\n-182\n-184 template , bool> = true>\n-_\b1_\b8_\b6 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd() :\n-187 container_()\n-188 {}\n-189\n-190 template\n-_\b1_\b9_\b1 decltype(auto) operator[](const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path) const\n-192 {\n-193 return accessByTreePath(container_, path);\n-194 }\n-195\n-196 template\n-_\b1_\b9_\b7 decltype(auto) operator[](const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path)\n-198 {\n-199 return accessByTreePath(container_, path);\n-200 }\n-201\n-203 template = true>\n-_\b2_\b0_\b4 void _\br_\be_\bs_\bi_\bz_\be(const Tree& tree)\n-205 {\n-206 resizeImpl(container_, tree, Dune::PriorityTag<5>{});\n-207 }\n-208\n-_\b2_\b0_\b9 const Container& _\bd_\ba_\bt_\ba() const\n-210 {\n-211 return container_;\n+136 template\n+137#ifdef DOXYGEN\n+_\b1_\b3_\b8 ImplementationDefined _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, Indices... indices)\n+139#else\n+140 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, Indices... indices)\n+141#endif\n+142 {\n+143 static_assert(sizeof...(Indices) > 0, \"childStorage() cannot be called with\n+an empty list of child indices\");\n+144 return Impl::childStorageImpl(&node,indices...);\n+145 }\n+146\n+148\n+171 template\n+172#ifdef DOXYGEN\n+_\b1_\b7_\b3 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b._\b._\b._\b>\n+_\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n+174#else\n+175 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b._\b._\b._\b> tp)\n+176#endif\n+177 {\n+178 return Impl::child(std::forward(node),tp,std::\n+index_sequence_for{});\n+179 }\n+180\n+181 template\n+182#ifdef DOXYGEN\n+183 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, HybridTreePath\n+_\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n+184#else\n+185 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, HybridTreePath tp)\n+186#endif\n+187 {\n+188 static_assert(sizeof...(Indices) > 0, \"childStorage() cannot be called with\n+an empty TreePath\");\n+189 return Impl::childStorage(&node,tp,std::index_sequence_for{});\n+190 }\n+191\n+192\n+193#ifndef DOXYGEN\n+194\n+195 namespace impl {\n+196\n+197 template\n+198 struct filter_void\n+199 {\n+200 using type = T;\n+201 };\n+202\n+203 template<>\n+204 struct filter_void\n+205 {};\n+206\n+207 template\n+208 struct _Child\n+209 : public filter_void\n+(),index_constant{}...))>>\n+210 {};\n+211\n 212 }\n 213\n-_\b2_\b1_\b4 Container& _\bd_\ba_\bt_\ba()\n-215 {\n-216 return container_;\n-217 }\n-218\n-219 private:\n-220 Container container_;\n-221 };\n-222\n-223 template\n-_\b2_\b2_\b4 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(Container&& container)\n-225 {\n-226 return _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>>(std::\n-forward(container));\n-227 }\n-228\n-229 /*\n-230 * \\brief A simple lambda for creating default constructible values from a\n-node\n-231 *\n-232 * This simply returns LeafToValue{} for a given Node. It's needed\n-233 * because using a lambda expression in a using declaration is not allowed\n-234 * because it's an unevaluated context.\n-235 */\n-236 template class LeafToValue>\n-_\b2_\b3_\b7 struct _\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be\n-238 {\n-239 template\n-_\b2_\b4_\b0 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node) const\n-241 {\n-242 return LeafToValue{};\n-243 }\n-244 };\n-245\n-246 } // namespace Detail\n-247\n-267 template\n-_\b2_\b6_\b8 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(const Tree& tree, LeafToValue&& leafToValue)\n+214#endif // DOXYGEN\n+215\n+217\n+224 template\n+_\b2_\b2_\b5 using _\bC_\bh_\bi_\bl_\bd = typename impl::_Child::type;\n+226\n+227\n+228#ifndef DOXYGEN\n+229\n+230 namespace impl {\n+231\n+232 template\n+233 struct _ChildForTreePath\n+234 {\n+235 using type = typename std::decay(),std::\n+declval()))>::type;\n+236 };\n+237\n+238 }\n+239\n+240#endif // DOXYGEN\n+241\n+243\n+251 template\n+_\b2_\b5_\b2 using _\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = typename impl::_ChildForTreePath::\n+type;\n+253\n+254\n+255#ifndef DOXYGEN\n+256\n+257 namespace impl {\n+258\n+259 // By default, types are flat indices if they are integral\n+260 template\n+261 struct _is_flat_index\n+262 {\n+263 using type = std::is_integral;\n+264 };\n+265\n+266 // And so is any index_constant\n+267 template\n+268 struct _is_flat_index>\n 269 {\n-270 auto f = std::ref(leafToValue);\n-271 auto factory = _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bf_\b)_\b>(f);\n-272 return Detail::makeTreeContainerVectorBackend(factory(tree));\n+270 using type = std::true_type;\n+271 };\n+272\n 273 }\n 274\n-290 template\n-_\b2_\b9_\b1 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(const Tree& tree)\n-292 {\n-293 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(tree, [](const auto&) {return Value{};});\n-294 }\n-295\n-299 template\n-_\b3_\b0_\b0 using _\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t\n-(std::declval()))>;\n-301\n-305 template class LeafToValue, class Tree>\n-_\b3_\b0_\b6 using _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t(), std::declval>()))>;\n-307\n-309\n-310 } // namespace TypeTree\n-311} //namespace Dune\n+275#endif // DOXYGEN\n+276\n+278 /*\n+279 * This type trait can be used to check whether T is a flat index (i.e.\n+either `std::size_t`\n+280 * or `index_constant`). The type trait normalizes T before doing the check,\n+so it will also\n+281 * work correctly for references and cv-qualified types.\n+282 */\n+283 template\n+_\b2_\b8_\b4 using _\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx = typename impl::_is_flat_index>::type;\n+285\n+286#ifndef DOXYGEN\n+287\n+288 namespace impl {\n+289\n+290 // helper function for check in member child() functions that tolerates\n+being passed something that\n+291 // isn't a TreePath. It will just return 0 in that case\n+292\n+293 template\n+294 constexpr typename std::enable_if<\n+295 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,\n+296 bool\n+297 >::type\n+298 _non_empty_tree_path (T)\n+299 {\n+300 return false;\n+301 }\n+302\n+303 template\n+304 constexpr typename std::enable_if<\n+305 !_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,\n+306 bool\n+307 >::type\n+308 _non_empty_tree_path (T t)\n+309 {\n+310 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(t) > 0;\n+311 }\n 312\n-313#endif // DUNE_TYPETREE_TREECONTAINER_HH\n+313 }\n+314\n+315#endif // DOXYGEN\n+316\n+318\n+319 } // namespace TypeTree\n+320} //namespace Dune\n+321\n+322#endif // DUNE_TYPETREE_CHILDEXTRACTION_HH\n _\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-auto makeTreeContainer(const Tree &tree, LeafToValue &&leafToValue)\n-Create container havin the same structure as the given tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >\n-()))> UniformTreeContainer\n-Alias to container type generated by makeTreeContainer for given tree type and\n-uniform value type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::\n-declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))>\n-TreeContainer\n-Alias to container type generated by makeTreeContainer for give tree type and\n-when using LeafToValue ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-std::size_t degree(const Node &node)\n-Returns the degree of node as run time information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:79\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx\n+typename impl::_is_flat_index< std::decay_t< T > >::type is_flat_index\n+Type trait that determines whether T is a flat index in the context of child\n+extraction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+ImplementationDefined childStorage(Node &&node, Indices... indices)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+typename impl::_Child< Node, indices... >::type Child\n+Template alias for the type of a child node given by a list of child indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ImplementationDefined child(Node &&node, Indices... indices)\n+Extracts the child of a node given by a sequence of compile-time and run-time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+typename impl::_ChildForTreePath< Node, TreePath >::type ChildForTreePath\n+Template alias for the type of a child node given by a TreePath or a\n+HybridTreePath type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:252\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n+constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n+Returns the size (number of components) of the given HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto treePath(const T &... t)\n Constructs a new HybridTreePath from the given indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-auto makeTreeContainerVectorBackend(Container &&container)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-auto operator()(const Node &node)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-ContainerFactory(LeafToValue leafToValue)\n-Create ContainerFactory.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(const Tree &tree)\n-Resize the (nested) container depending on the degree of the tree nodes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:204\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bd_\ba_\bt_\ba\n-Container & data()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bd_\ba_\bt_\ba\n-const Container & data() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-TreeContainerVectorBackend(Container &&container)\n-Move the passed container into the internal storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-TreeContainerVectorBackend()\n-Default constructor. The stored container might need to be resized before\n-usage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n-TreeContainerVectorBackend(const Tree &tree)\n-Default construct the container and perform a resize depending on the tree-node\n-degrees.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-auto operator()(const Node &node) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:240\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n A hybrid version of TreePath that supports both compile time and run time\n indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00017.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00017.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: powercompositenodetransformationtemplates.hh File Reference\n+dune-typetree: leafnode.hh File Reference\n \n \n \n \n \n \n \n@@ -72,35 +72,27 @@\n
  • dune
  • typetree
  • \n
    \n
    \n
    \n \n-
    powercompositenodetransformationtemplates.hh File Reference
    \n+
    leafnode.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n+
    #include <dune/typetree/nodetags.hh>
    \n+#include <cstddef>
    \n+#include <type_traits>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
    class  Dune::TypeTree::LeafNode
     Base class for leaf nodes in a dune-typetree. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,22 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-powercompositenodetransformationtemplates.hh File Reference\n+leafnode.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n+\u00a0 Base class for leaf nodes in a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00017_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00017_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: powercompositenodetransformationtemplates.hh Source File\n+dune-typetree: leafnode.hh Source File\n \n \n \n \n \n \n \n@@ -74,91 +74,75 @@\n \n
    \n \n
    \n \n
    \n-
    powercompositenodetransformationtemplates.hh
    \n+
    leafnode.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n-
    7#define DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n+
    6#ifndef DUNE_TYPETREE_LEAFNODE_HH
    \n+
    7#define DUNE_TYPETREE_LEAFNODE_HH
    \n
    8
    \n-
    9#include <cstddef>
    \n-
    10
    \n-\n+\n+
    10#include <cstddef>
    \n+
    11#include <type_traits>
    \n
    12
    \n
    13namespace Dune {
    \n
    14 namespace TypeTree {
    \n
    15
    \n-
    21 template<typename SourceNode, typename Transformation, template<typename,typename,std::size_t> class TransformedNode>
    \n-
    \n-\n-
    23 {
    \n-
    24 template<typename TC>
    \n-
    \n-
    25 struct result
    \n-
    26 {
    \n-
    27 typedef TransformedNode<SourceNode,TC,StaticDegree<SourceNode>::value> type;
    \n-
    28 };
    \n-
    \n-
    29 };
    \n-
    \n-
    30
    \n+
    \n+\n+
    28 {
    \n+
    29
    \n+
    30 public:
    \n
    31
    \n-
    32 template<typename SourceNode, typename Transformation, template<typename,typename> class TransformedNode>
    \n-
    \n-\n-
    34 {
    \n-
    35 template<typename TC>
    \n-
    \n-
    36 struct result
    \n-
    37 {
    \n-
    38 typedef TransformedNode<SourceNode,TC> type;
    \n-
    39 };
    \n-
    \n-
    40 };
    \n-
    \n-
    41
    \n-
    42 template<typename SourceNode, typename Transformation, template<typename,typename...> class TransformedNode>
    \n-
    \n-\n-
    44 {
    \n-
    45 template<typename... TC>
    \n-
    \n-
    46 struct result
    \n-
    47 {
    \n-
    48 typedef TransformedNode<SourceNode,TC...> type;
    \n-
    49 };
    \n-
    \n-
    50 };
    \n-
    \n-
    51
    \n-
    53
    \n-
    54 } // namespace TypeTree
    \n-
    55} //namespace Dune
    \n-
    56
    \n-
    57#endif // DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n-\n+
    33 static const bool isLeaf = true;
    \n+
    34
    \n+
    36 static const bool isPower = false;
    \n+
    37
    \n+
    39 static const bool isComposite = false;
    \n+
    40
    \n+\n+
    43
    \n+
    \n+
    44 static constexpr auto degree()
    \n+
    45 {
    \n+
    46 return std::integral_constant<std::size_t,0>{};
    \n+
    47 }
    \n+
    \n+
    48
    \n+
    49 protected:
    \n+
    50
    \n+
    52
    \n+\n+
    58 };
    \n+
    \n+
    59
    \n+
    61
    \n+
    62 } // namespace TypeTree
    \n+
    63} //namespace Dune
    \n+
    64
    \n+
    65#endif // DUNE_TYPETREE_POWERNODE_HH
    \n+\n
    Definition accumulate_static.hh:16
    \n-
    Definition powercompositenodetransformationtemplates.hh:23
    \n-
    Definition powercompositenodetransformationtemplates.hh:26
    \n-
    TransformedNode< SourceNode, TC, StaticDegree< SourceNode >::value > type
    Definition powercompositenodetransformationtemplates.hh:27
    \n-
    Definition powercompositenodetransformationtemplates.hh:34
    \n-
    Definition powercompositenodetransformationtemplates.hh:37
    \n-
    TransformedNode< SourceNode, TC > type
    Definition powercompositenodetransformationtemplates.hh:38
    \n-
    Definition powercompositenodetransformationtemplates.hh:44
    \n-
    Definition powercompositenodetransformationtemplates.hh:47
    \n-
    TransformedNode< SourceNode, TC... > type
    Definition powercompositenodetransformationtemplates.hh:48
    \n+
    Base class for leaf nodes in a dune-typetree.
    Definition leafnode.hh:28
    \n+
    LeafNodeTag NodeTag
    The type tag that describes a LeafNode.
    Definition leafnode.hh:42
    \n+
    static const bool isLeaf
    Mark this class as a leaf in a dune-typetree.
    Definition leafnode.hh:33
    \n+
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition leafnode.hh:36
    \n+
    LeafNode()
    Default constructor.
    Definition leafnode.hh:57
    \n+
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition leafnode.hh:39
    \n+
    static constexpr auto degree()
    Definition leafnode.hh:44
    \n+
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,90 +1,88 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-powercompositenodetransformationtemplates.hh\n+leafnode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n-7#define DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n+6#ifndef DUNE_TYPETREE_LEAFNODE_HH\n+7#define DUNE_TYPETREE_LEAFNODE_HH\n 8\n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+10#include \n+11#include \n 12\n 13namespace _\bD_\bu_\bn_\be {\n 14 namespace TypeTree {\n 15\n-21 template class TransformedNode>\n-_\b2_\b2 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-23 {\n-24 template\n-_\b2_\b5 struct _\br_\be_\bs_\bu_\bl_\bt\n-26 {\n-_\b2_\b7 typedef TransformedNode::value> _\bt_\by_\bp_\be;\n-28 };\n-29 };\n-30\n+_\b2_\b7 class _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n+28 {\n+29\n+30 public:\n 31\n-32 template class TransformedNode>\n-_\b3_\b3 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-34 {\n-35 template\n-_\b3_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n-37 {\n-_\b3_\b8 typedef TransformedNode _\bt_\by_\bp_\be;\n-39 };\n-40 };\n-41\n-42 template class TransformedNode>\n-_\b4_\b3 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-44 {\n-45 template\n-_\b4_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n-47 {\n-_\b4_\b8 typedef TransformedNode _\bt_\by_\bp_\be;\n-49 };\n-50 };\n-51\n-53\n-54 } // namespace TypeTree\n-55} //namespace Dune\n-56\n-57#endif // DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\b3_\b3 static const bool _\bi_\bs_\bL_\be_\ba_\bf = true;\n+34\n+_\b3_\b6 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n+37\n+_\b3_\b9 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n+40\n+_\b4_\b2 typedef _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+43\n+_\b4_\b4 static constexpr auto _\bd_\be_\bg_\br_\be_\be()\n+45 {\n+46 return std::integral_constant{};\n+47 }\n+48\n+49 protected:\n+50\n+52\n+_\b5_\b7 _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be() {}\n+58 };\n+59\n+61\n+62 } // namespace TypeTree\n+63} //namespace Dune\n+64\n+65#endif // DUNE_TYPETREE_POWERNODE_HH\n+_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< SourceNode, TC, StaticDegree< SourceNode >::value > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< SourceNode, TC > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< SourceNode, TC... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n+Base class for leaf nodes in a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+LeafNodeTag NodeTag\n+The type tag that describes a LeafNode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+static const bool isLeaf\n+Mark this class as a leaf in a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Mark this class as a non power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n+LeafNode()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a non composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static constexpr auto degree()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a leaf node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00020.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00020.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: transformation.hh File Reference\n+dune-typetree: utility.hh File Reference\n \n \n \n \n \n \n \n@@ -71,52 +71,42 @@\n \n \n \n
    \n \n-
    transformation.hh File Reference
    \n+Namespaces
    \n+
    utility.hh File Reference
    \n \n
    \n-
    #include <array>
    \n+
    #include <memory>
    \n #include <tuple>
    \n-#include <memory>
    \n+#include <type_traits>
    \n #include <utility>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/typetree/typetraits.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/utility.hh>
    \n+#include <algorithm>
    \n+#include <dune/common/shared_ptr.hh>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n \n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::TransformTree< SourceTree, Transformation, Tag, recursive >
     Transform a TypeTree. More...
    struct  Dune::TypeTree::TreeInfo< Tree, Tag >
     Struct for obtaining some basic structural information about a TypeTree. More...
     
    \n \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n-\n-\n-\n-\n-\n

    \n-Functions

    template<typename SourceNode , typename Transformation , typename Tag >
    void Dune::TypeTree::registerNodeTransformation (SourceNode *, Transformation *, Tag *)
     Register transformation descriptor to transform SourceNode with Transformation.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,39 +1,30 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-transformation.hh File Reference\n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+utility.hh File Reference\n #include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\ba_\bg_\b,\n- _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b _\b>\n-\u00a0 Transform a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bT_\ba_\bg_\b _\b>\n+\u00a0 Struct for obtaining some basic structural information about a\n+ _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn (SourceNode *, Transformation\n- *, Tag *)\n-\u00a0 Register transformation descriptor to transform SourceNode with\n- Transformation.\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00020_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00020_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: transformation.hh Source File\n+dune-typetree: utility.hh Source File\n \n \n \n \n \n \n \n@@ -74,512 +74,236 @@\n \n
    \n \n
    \n
    \n
    \n-
    transformation.hh
    \n+
    utility.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_TRANSFORMATION_HH
    \n-
    7#define DUNE_TYPETREE_TRANSFORMATION_HH
    \n+
    6#ifndef DUNE_TYPETREE_UTILITY_HH
    \n+
    7#define DUNE_TYPETREE_UTILITY_HH
    \n
    8
    \n-
    9#include <array>
    \n+
    9#include <memory>
    \n
    10#include <tuple>
    \n-
    11#include <memory>
    \n+
    11#include <type_traits>
    \n
    12#include <utility>
    \n-
    13
    \n-
    14#include <dune/common/hybridutilities.hh>
    \n-
    15#include <dune/common/exceptions.hh>
    \n-
    16#include <dune/common/typetraits.hh>
    \n-\n-\n-\n-\n-
    21
    \n+
    13#include <algorithm>
    \n+
    14
    \n+
    15#include <dune/common/shared_ptr.hh>
    \n+
    16#include <dune/common/indices.hh>
    \n+\n+\n+
    19
    \n+
    20namespace Dune {
    \n+
    21 namespace TypeTree {
    \n
    22
    \n-
    23namespace Dune {
    \n-
    24 namespace TypeTree {
    \n-
    25
    \n-
    31#ifdef DOXYGEN
    \n-
    32
    \n+
    27#ifndef DOXYGEN
    \n+
    28
    \n+
    29 template<typename T>
    \n+
    30 std::shared_ptr<T> convert_arg(const T& t)
    \n+
    31 {
    \n+
    32 return std::make_shared<T>(t);
    \n+
    33 }
    \n
    34
    \n-
    53 template<typename SourceNode, typename Transformation, typename Tag>
    \n-
    54 void registerNodeTransformation(SourceNode*, Transformation*, Tag*);
    \n-
    55
    \n-
    56#else // DOXYGEN
    \n+
    35 template<typename T>
    \n+
    36 std::shared_ptr<T> convert_arg(T& t)
    \n+
    37 {
    \n+
    38 return stackobject_to_shared_ptr(t);
    \n+
    39 }
    \n+
    40
    \n+
    41 template<typename BaseType, typename T>
    \n+
    42 T& assertGridViewType(T& t)
    \n+
    43 {
    \n+
    44 static_assert((std::is_same<typename BaseType::Traits::GridViewType,
    \n+
    45 typename T::Traits::GridViewType>::value),
    \n+
    46 "GridViewType must be equal in all components of composite type");
    \n+
    47 return t;
    \n+
    48 }
    \n+
    49
    \n+
    50 // only bind to real rvalues
    \n+
    51 template<typename T>
    \n+
    52 typename std::enable_if<!std::is_lvalue_reference<T>::value,std::shared_ptr<T> >::type convert_arg(T&& t)
    \n+
    53 {
    \n+
    54 return std::make_shared<T>(std::forward<T>(t));
    \n+
    55 }
    \n+
    56
    \n
    57
    \n-
    68 template<typename S, typename T, typename Tag>
    \n-
    69 struct LookupNodeTransformation
    \n-
    70 {
    \n-
    71
    \n-
    72 typedef decltype(registerNodeTransformation(declptr<S>(),declptr<T>(),declptr<Tag>())) lookup_type;
    \n-
    73
    \n-
    74 typedef typename evaluate_if_meta_function<
    \n-
    75 lookup_type
    \n-
    76 >::type type;
    \n-
    77
    \n-
    78 static_assert((!std::is_same<type,void>::value), "Unable to find valid transformation descriptor");
    \n-
    79 };
    \n-
    80
    \n-
    81#endif // DOXYGEN
    \n-
    82
    \n-
    83
    \n-
    85
    \n-
    94 template<typename SourceTree, typename Transformation, typename Tag = StartTag, bool recursive = true>
    \n-
    \n-\n-
    96 {
    \n-
    97
    \n-
    98#ifndef DOXYGEN
    \n-
    99
    \n-
    100 typedef typename LookupNodeTransformation<SourceTree,Transformation,typename SourceTree::ImplementationTag>::type NodeTransformation;
    \n-
    101
    \n-
    102 // the type of the new tree that will result from this transformation
    \n-
    103 typedef typename TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transformed_type transformed_type;
    \n-
    104
    \n-
    105 // the storage type of the new tree that will result from this transformation
    \n-
    106 typedef typename TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transformed_storage_type transformed_storage_type;
    \n+
    58 namespace Experimental {
    \n+
    59
    \n+
    68 template<class BinaryOp, class Arg>
    \n+
    69 constexpr decltype(auto)
    \n+
    70 left_fold(const BinaryOp& binary_op, Arg&& arg)
    \n+
    71 {
    \n+
    72 return std::forward<Arg>(arg);
    \n+
    73 }
    \n+
    74
    \n+
    96 template<class BinaryOp, class Init, class Arg0, class... Args>
    \n+
    97 constexpr decltype(auto)
    \n+
    98 left_fold(const BinaryOp& binary_op, Init&& init, Arg0&& arg_0, Args&&... args)
    \n+
    99 {
    \n+
    100 return left_fold(
    \n+
    101 binary_op,
    \n+
    102 binary_op(std::forward<Init>(init), std::forward<Arg0>(arg_0)),
    \n+
    103 std::forward<Args>(args)...);
    \n+
    104 }
    \n+
    105
    \n+
    106 } // namespace Experimental
    \n
    107
    \n-
    108#endif // DOXYGEN
    \n-
    109
    \n-
    111 typedef transformed_type type;
    \n+
    108
    \n+
    109#endif // DOXYGEN
    \n+
    110
    \n
    112
    \n-
    113 typedef type Type;
    \n-
    114
    \n-
    \n-
    116 static transformed_type transform(const SourceTree& s, const Transformation& t = Transformation())
    \n-
    117 {
    \n-
    118 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(s,t);
    \n-
    119 }
    \n-
    \n-
    120
    \n-
    \n-
    122 static transformed_type transform(const SourceTree& s, Transformation& t)
    \n-
    123 {
    \n-
    124 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(s,t);
    \n-
    125 }
    \n-
    \n+
    119 template<typename Tree, typename Tag = StartTag>
    \n+
    \n+
    120 struct TreeInfo
    \n+
    121 {
    \n+
    122
    \n+
    123 private:
    \n+
    124 // Start the tree traversal
    \n+\n
    126
    \n-
    \n-
    128 static transformed_type transform(std::shared_ptr<const SourceTree> sp, const Transformation& t = Transformation())
    \n-
    129 {
    \n-
    130 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(sp,t);
    \n-
    131 }
    \n-
    \n-
    132
    \n-
    \n-
    134 static transformed_type transform(std::shared_ptr<const SourceTree> sp, Transformation& t)
    \n-
    135 {
    \n-
    136 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(sp,t);
    \n-
    137 }
    \n-
    \n-
    138
    \n-
    \n-
    141 static transformed_storage_type transform_storage(std::shared_ptr<const SourceTree> sp, const Transformation& t = Transformation())
    \n-
    142 {
    \n-\n-
    144 }
    \n-
    \n-
    145
    \n-
    \n-
    148 static transformed_storage_type transform_storage(std::shared_ptr<const SourceTree> sp, Transformation& t)
    \n-
    149 {
    \n-\n-
    151 }
    \n-
    \n+
    127 public:
    \n+
    128
    \n+
    130 static const std::size_t depth = NodeInfo::depth;
    \n+
    131
    \n+
    133 static const std::size_t nodeCount = NodeInfo::nodeCount;
    \n+
    134
    \n+
    136 static const std::size_t leafCount = NodeInfo::leafCount;
    \n+
    137
    \n+
    138 };
    \n+
    \n+
    139
    \n+
    140
    \n+
    141#ifndef DOXYGEN
    \n+
    142
    \n+
    143 // ********************************************************************************
    \n+
    144 // TreeInfo specializations for the different node types
    \n+
    145 // ********************************************************************************
    \n+
    146
    \n+
    147
    \n+
    148 // leaf node
    \n+
    149 template<typename Node>
    \n+
    150 struct TreeInfo<Node,LeafNodeTag>
    \n+
    151 {
    \n
    152
    \n-
    153
    \n-
    154 };
    \n-
    \n-
    155
    \n-
    156#ifndef DOXYGEN // internal per-node implementations of the transformation algorithm
    \n-
    157
    \n-
    158 // handle a leaf node - this is easy
    \n-
    159 template<typename S, typename T, bool recursive>
    \n-
    160 struct TransformTree<S,T,LeafNodeTag,recursive>
    \n-
    161 {
    \n-
    162 // get transformed type from specification
    \n-
    163 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>::type NodeTransformation;
    \n-
    164
    \n-
    165 typedef typename NodeTransformation::transformed_type transformed_type;
    \n-
    166 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
    \n-
    167
    \n-
    168 // delegate instance transformation to per-node specification
    \n-
    169 static transformed_type transform(const S& s, T& t)
    \n-
    170 {
    \n-
    171 return NodeTransformation::transform(s,t);
    \n-
    172 }
    \n-
    173
    \n-
    174 // delegate instance transformation to per-node specification
    \n-
    175 static transformed_type transform(const S& s, const T& t)
    \n-
    176 {
    \n-
    177 return NodeTransformation::transform(s,t);
    \n-
    178 }
    \n+
    153 static const std::size_t depth = 1;
    \n+
    154
    \n+
    155 static const std::size_t nodeCount = 1;
    \n+
    156
    \n+
    157 static const std::size_t leafCount = 1;
    \n+
    158
    \n+
    159 };
    \n+
    160
    \n+
    161
    \n+
    162 // power node - exploit the fact that all children are identical
    \n+
    163 template<typename Node>
    \n+
    164 struct TreeInfo<Node,PowerNodeTag>
    \n+
    165 {
    \n+
    166
    \n+
    167 typedef TreeInfo<typename Node::ChildType,NodeTag<typename Node::ChildType>> ChildInfo;
    \n+
    168
    \n+
    169 static const std::size_t depth = 1 + ChildInfo::depth;
    \n+
    170
    \n+
    171 static const std::size_t nodeCount = 1 + StaticDegree<Node>::value * ChildInfo::nodeCount;
    \n+
    172
    \n+
    173 static const std::size_t leafCount = StaticDegree<Node>::value * ChildInfo::leafCount;
    \n+
    174
    \n+
    175 };
    \n+
    176
    \n+
    177
    \n+
    178 namespace {
    \n
    179
    \n-
    180 // delegate instance transformation to per-node specification
    \n-
    181 static transformed_type transform(std::shared_ptr<const S> sp, T& t)
    \n-
    182 {
    \n-
    183 return NodeTransformation::transform(sp,t);
    \n-
    184 }
    \n+
    180 // TMP for iterating over the children of a composite node
    \n+
    181 // identical for both composite node implementations
    \n+
    182 template<typename Node, std::size_t k, std::size_t n>
    \n+
    183 struct generic_compositenode_children_info
    \n+
    184 {
    \n
    185
    \n-
    186 // delegate instance transformation to per-node specification
    \n-
    187 static transformed_type transform(std::shared_ptr<const S> sp, const T& t)
    \n-
    188 {
    \n-
    189 return NodeTransformation::transform(sp,t);
    \n-
    190 }
    \n-
    191
    \n-
    192 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n-
    193 {
    \n-
    194 return NodeTransformation::transform_storage(sp,t);
    \n-
    195 }
    \n-
    196
    \n-
    197 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n-
    198 {
    \n-
    199 return NodeTransformation::transform_storage(sp,t);
    \n-
    200 }
    \n+
    186 typedef generic_compositenode_children_info<Node,k+1,n> NextChild;
    \n+
    187
    \n+
    188 // extract child info
    \n+
    189 typedef typename Node::template Child<k>::Type Child;
    \n+
    190 typedef NodeTag<Child> ChildTag;
    \n+
    191 typedef TreeInfo<Child,ChildTag> ChildInfo;
    \n+
    192
    \n+
    193 // combine information of current child with info about following children
    \n+
    194 static const std::size_t maxDepth = ChildInfo::depth > NextChild::maxDepth ? ChildInfo::depth : NextChild::maxDepth;
    \n+
    195
    \n+
    196 static const std::size_t nodeCount = ChildInfo::nodeCount + NextChild::nodeCount;
    \n+
    197
    \n+
    198 static const std::size_t leafCount = ChildInfo::leafCount + NextChild::leafCount;
    \n+
    199
    \n+
    200 };
    \n
    201
    \n-
    202 };
    \n-
    203
    \n-
    204
    \n-
    205 // common implementation for non-recursive transformation of non-leaf nodes
    \n-
    206 template<typename S, typename T>
    \n-
    207 struct TransformTreeNonRecursive
    \n-
    208 {
    \n-
    209 // get transformed type from specification
    \n-
    210 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>::type NodeTransformation;
    \n-
    211
    \n-
    212 typedef typename NodeTransformation::transformed_type transformed_type;
    \n-
    213 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
    \n+
    202 // End of recursion
    \n+
    203 template<typename Node, std::size_t n>
    \n+
    204 struct generic_compositenode_children_info<Node,n,n>
    \n+
    205 {
    \n+
    206 static const std::size_t maxDepth = 0;
    \n+
    207
    \n+
    208 static const std::size_t nodeCount = 0;
    \n+
    209
    \n+
    210 static const std::size_t leafCount = 0;
    \n+
    211 };
    \n+
    212
    \n+
    213 } // anonymous namespace
    \n
    214
    \n-
    215 // delegate instance transformation to per-node specification
    \n-
    216 static transformed_type transform(const S& s, T& t)
    \n-
    217 {
    \n-
    218 return NodeTransformation::transform(s,t);
    \n-
    219 }
    \n+
    215
    \n+
    216 // Struct for building information about composite node
    \n+
    217 template<typename Node>
    \n+
    218 struct GenericCompositeNodeInfo
    \n+
    219 {
    \n
    220
    \n-
    221 // delegate instance transformation to per-node specification
    \n-
    222 static transformed_type transform(const S& s, const T& t)
    \n-
    223 {
    \n-
    224 return NodeTransformation::transform(s,t);
    \n-
    225 }
    \n+
    221 typedef generic_compositenode_children_info<Node,0,StaticDegree<Node>::value> Children;
    \n+
    222
    \n+
    223 static const std::size_t depth = 1 + Children::maxDepth;
    \n+
    224
    \n+
    225 static const std::size_t nodeCount = 1 + Children::nodeCount;
    \n
    226
    \n-
    227 // delegate instance transformation to per-node specification
    \n-
    228 static transformed_type transform(std::shared_ptr<const S> sp, T& t)
    \n-
    229 {
    \n-
    230 return NodeTransformation::transform(sp,t);
    \n-
    231 }
    \n-
    232
    \n-
    233 // delegate instance transformation to per-node specification
    \n-
    234 static transformed_type transform(std::shared_ptr<const S> sp, const T& t)
    \n-
    235 {
    \n-
    236 return NodeTransformation::transform(sp,t);
    \n-
    237 }
    \n+
    227 static const std::size_t leafCount = Children::leafCount;
    \n+
    228
    \n+
    229 };
    \n+
    230
    \n+
    231
    \n+
    232 // CompositeNode: delegate to GenericCompositeNodeInfo
    \n+
    233 template<typename Node>
    \n+
    234 struct TreeInfo<Node,CompositeNodeTag>
    \n+
    235 : public GenericCompositeNodeInfo<Node>
    \n+
    236 {};
    \n+
    237
    \n
    238
    \n-
    239 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n-
    240 {
    \n-
    241 return NodeTransformation::transform_storage(sp,t);
    \n-
    242 }
    \n-
    243
    \n-
    244 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n-
    245 {
    \n-
    246 return NodeTransformation::transform_storage(sp,t);
    \n-
    247 }
    \n-
    248
    \n-
    249 };
    \n-
    250
    \n-
    251
    \n-
    252 namespace Impl {
    \n-
    253
    \n-
    254 // Helper class to handle recursive power nodes
    \n-
    255 template<class Source, class Transformation, class Tag>
    \n-
    256 class RecursivePowerTransformTree
    \n-
    257 {
    \n-
    258 // We only know two types of tags!
    \n-
    259 static_assert(std::is_same_v<Tag,PowerNodeTag> or std::is_same_v<Tag,DynamicPowerNodeTag>);
    \n-
    260
    \n-
    261 using ChildType = typename Source::ChildType;
    \n-
    262
    \n-
    263 // in case degree is dynamic, provid a vector correctly initialized
    \n-
    264 template<class NodeStorage>
    \n-
    265 static auto node_storage_provider(const std::size_t& degree)
    \n-
    266 {
    \n-
    267 return std::vector<NodeStorage>(degree);
    \n-
    268 }
    \n-
    269
    \n-
    270 // in case degree is static, provid an array
    \n-
    271 template<class NodeStorage, class StaticIndex>
    \n-
    272 static auto node_storage_provider(StaticIndex)
    \n-
    273 {
    \n-
    274 return std::array<NodeStorage,std::size_t(StaticIndex{})>();
    \n-
    275 }
    \n-
    276
    \n-
    277 public:
    \n-
    278 // get transformed type from specification
    \n-
    279 // Handling this transformation in a way that makes the per-node specification easy to write
    \n-
    280 // is a little involved:
    \n-
    281 // The problem is that the transformed power node must be parameterized on the transformed child
    \n-
    282 // type. So we need to transform the child type and pass the transformed child type to an inner
    \n-
    283 // template of the node transformation struct called result (see example of such a specification
    \n-
    284 // further down).
    \n-
    285 using NodeTransformation = typename LookupNodeTransformation<Source,Transformation,ImplementationTag<Source>>::type;
    \n-
    286 using ChildNodeTransformation = typename LookupNodeTransformation<ChildType,Transformation,ImplementationTag<ChildType>>::type;
    \n-
    287
    \n-
    288 private:
    \n-
    289 // Since every child is same type, is enough to get transformation once
    \n-
    290 using ChildTreeTransformation = TransformTree<ChildType,
    \n-
    291 Transformation,
    \n-
    292 NodeTag<ChildType>,
    \n-
    293 ChildNodeTransformation::recursive>;
    \n-
    294
    \n-
    295 // Get transformed type of children
    \n-
    296 using transformed_child_type = typename ChildTreeTransformation::transformed_type;
    \n-
    297 using transformed_child_storage_type = typename ChildTreeTransformation::transformed_storage_type;
    \n-
    298 public:
    \n-
    299 // Apply transformation from children to current node
    \n-
    300 using transformed_type = typename NodeTransformation::template result<transformed_child_type>::type;
    \n-
    301 using transformed_storage_type = typename NodeTransformation::template result<transformed_child_type>::storage_type;
    \n-
    302
    \n-
    303 // Transform an instance of source tree.
    \n-
    304 static transformed_type transform(const Source& source, Transformation& transformation)
    \n-
    305 {
    \n-
    306 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
    \n-
    307 for (std::size_t k = 0; k < source.degree(); ++k) {
    \n-
    308 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
    \n-
    309 }
    \n-
    310 return NodeTransformation::transform(source,transformation,children_storage);
    \n-
    311 }
    \n-
    312
    \n-
    313 // Transform an instance of source tree.
    \n-
    314 static transformed_type transform(const Source& source, const Transformation& transformation)
    \n-
    315 {
    \n-
    316 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
    \n-
    317 for (std::size_t k = 0; k < source.degree(); ++k) {
    \n-
    318 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
    \n-
    319 }
    \n-
    320 return NodeTransformation::transform(source,transformation,children_storage);
    \n-
    321 }
    \n-
    322
    \n-
    323 // Transform an instance of source tree.
    \n-
    324 static transformed_type transform(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
    \n-
    325 {
    \n-
    326 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
    \n-
    327 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n-
    328 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n-
    329 }
    \n-
    330 return NodeTransformation::transform(source_ptr,transformation,children_storage);
    \n-
    331 }
    \n-
    332
    \n-
    333 // Transform an instance of source tree.
    \n-
    334 static transformed_type transform(std::shared_ptr<const Source> source_ptr, const Transformation& transformation)
    \n-
    335 {
    \n-
    336 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
    \n-
    337 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n-
    338 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n-
    339 }
    \n-
    340 return NodeTransformation::transform(source_ptr,transformation,children_storage);
    \n-
    341 }
    \n-
    342
    \n-
    343 // Transform an instance of source tree ptr.
    \n-
    344 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
    \n-
    345 {
    \n-
    346 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
    \n-
    347 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n-
    348 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n-
    349 }
    \n-
    350 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
    \n-
    351 }
    \n-
    352
    \n-
    353 // Transform an instance of source tree ptr.
    \n-
    354 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr, const Transformation& transformation)
    \n-
    355 {
    \n-
    356 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
    \n-
    357 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n-
    358 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n-
    359 }
    \n-
    360 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
    \n-
    361 }
    \n-
    362
    \n-
    363 };
    \n-
    364 } // namespace Impl
    \n-
    365
    \n-
    366 // Recursive version of the PowerNode transformation for static nodes.
    \n-
    367 template<typename Source, typename Transformation>
    \n-
    368 struct TransformTree<Source,Transformation,PowerNodeTag,true>
    \n-
    369 : public Impl::RecursivePowerTransformTree<Source,Transformation,PowerNodeTag>
    \n-
    370 {};
    \n-
    371
    \n-
    372 // Recursive version of the DynamicPowerNode transformation for static nodes.
    \n-
    373 template<typename Source, typename Transformation>
    \n-
    374 struct TransformTree<Source,Transformation,DynamicPowerNodeTag,true>
    \n-
    375 : public Impl::RecursivePowerTransformTree<Source,Transformation,DynamicPowerNodeTag>
    \n-
    376 {};
    \n-
    377
    \n-
    378 // non-recursive version of the PowerNode transformation.
    \n-
    379 template<typename S, typename T>
    \n-
    380 struct TransformTree<S,T,PowerNodeTag,false>
    \n-
    381 : public TransformTreeNonRecursive<S,T>
    \n-
    382 {};
    \n-
    383
    \n-
    384 // non-recursive version of the DynamicPowerNodeTag transformation.
    \n-
    385 template<typename S, typename T>
    \n-
    386 struct TransformTree<S,T,DynamicPowerNodeTag,false>
    \n-
    387 : public TransformTreeNonRecursive<S,T>
    \n-
    388 {};
    \n-
    389
    \n-
    390 // helper struct that does the actual transformation for a composite node. We need this additional struct
    \n-
    391 // to extract the template argument list with the types of all children from the node, which we cannot do
    \n-
    392 // directly in the transformation<> template, as the type passed to transformation<> will usually be a
    \n-
    393 // derived type and will normally have more template arguments than just the children. This declaration
    \n-
    394 // just introduces the type of the helper struct, we always instantiate the specialization defined below;
    \n-
    395 template<typename S, typename Children, typename T>
    \n-
    396 struct transform_composite_node;
    \n-
    397
    \n-
    398 // specialized version of the helper struct which extracts the template argument list with the children from
    \n-
    399 // its second template parameter, which has to be CompositeNode::ChildTypes. Apart from that, the struct is
    \n-
    400 // similar to the one for a PowerNode, but it obviously delegates transformation of the children to the TMP.
    \n-
    401 template<typename S, typename T, typename... C>
    \n-
    402 struct transform_composite_node<S,std::tuple<C...>,T>
    \n-
    403 {
    \n-
    404
    \n-
    405 // transformed type, using the same nested struct trick as the PowerNode
    \n-
    406 typedef ImplementationTag<S> Tag;
    \n-
    407 typedef typename LookupNodeTransformation<S,T,Tag>::type NodeTransformation;
    \n-
    408 typedef typename NodeTransformation::template result<typename TransformTree<C,
    \n-
    409 T,
    \n-
    410 NodeTag<C>,
    \n-
    411 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
    \n-
    412 >::transformed_type...
    \n-
    413 >::type transformed_type;
    \n-
    414
    \n-
    415 typedef typename NodeTransformation::template result<typename TransformTree<C,
    \n-
    416 T,
    \n-
    417 NodeTag<C>,
    \n-
    418 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
    \n-
    419 >::transformed_type...
    \n-
    420 >::storage_type transformed_storage_type;
    \n-
    421
    \n-
    422 // Retrieve the transformation descriptor for the child with index i.
    \n-
    423 // This little helper improves really improves the readability of the
    \n-
    424 // transformation functions.
    \n-
    425 template<std::size_t i>
    \n-
    426 struct ChildTransformation
    \n-
    427 : public TransformTree<typename S::template Child<i>::Type,
    \n-
    428 T,
    \n-
    429 NodeTag<typename S::template Child<i>::Type>,
    \n-
    430 LookupNodeTransformation<
    \n-
    431 typename S::template Child<i>::Type,
    \n-
    432 T,
    \n-
    433 ImplementationTag<typename S::template Child<i>::Type>
    \n-
    434 >::type::recursive
    \n-
    435 >
    \n-
    436 {};
    \n-
    437
    \n-
    438 template<std::size_t i, typename Tuple, typename Value>
    \n-
    439 static void setElement(Tuple& tuple, Value&& value)
    \n-
    440 {
    \n-
    441 std::get<i>(tuple) = std::forward<Value>(value);
    \n-
    442 }
    \n-
    443
    \n-
    444 template<typename Trafo, std::size_t... i>
    \n-
    445 static transformed_type transform(const S& s, Trafo&& t, std::index_sequence<i...> indices)
    \n-
    446 {
    \n-
    447 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
    \n-
    448 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(s.template childStorage<i>(), std::forward<Trafo>(t))),0)...});
    \n-
    449 return NodeTransformation::transform(s, std::forward<Trafo>(t), std::get<i>(storage)...);
    \n-
    450 }
    \n-
    451
    \n-
    452 template<typename Trafo, std::size_t... i>
    \n-
    453 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, Trafo&& t, std::index_sequence<i...> indices)
    \n-
    454 {
    \n-
    455 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
    \n-
    456 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(sp->template childStorage<i>(), std::forward<Trafo>(t))),0)...});
    \n-
    457 return NodeTransformation::transform_storage(sp, std::forward<Trafo>(t), std::get<i>(storage)...);
    \n-
    458 }
    \n-
    459 };
    \n-
    460
    \n-
    461
    \n-
    462 // the specialization of transformation<> for the CompositeNode. This just extracts the
    \n-
    463 // CompositeNode::ChildTypes member and forwards to the helper struct
    \n-
    464 template<typename S, typename T>
    \n-
    465 struct TransformTree<S,T,CompositeNodeTag,true>
    \n-
    466 {
    \n-
    467
    \n-
    468 private:
    \n-
    469
    \n-
    470 typedef typename S::ChildTypes ChildTypes;
    \n-
    471
    \n-
    472 static auto child_indices()
    \n-
    473 {
    \n-
    474 return std::make_index_sequence<S::degree()>();
    \n-
    475 }
    \n-
    476
    \n-
    477 public:
    \n-
    478
    \n-
    479 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_type transformed_type;
    \n-
    480 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_storage_type transformed_storage_type;
    \n-
    481
    \n-
    482 static transformed_type transform(const S& s, T& t)
    \n-
    483 {
    \n-
    484 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
    \n-
    485 }
    \n-
    486
    \n-
    487 static transformed_type transform(const S& s, const T& t)
    \n-
    488 {
    \n-
    489 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
    \n-
    490 }
    \n-
    491
    \n-
    492 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n-
    493 {
    \n-
    494 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
    \n-
    495 }
    \n-
    496
    \n-
    497 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n-
    498 {
    \n-
    499 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
    \n-
    500 }
    \n-
    501
    \n-
    502 };
    \n-
    503
    \n-
    504 // non-recursive version of the CompositeNode transformation.
    \n-
    505 template<typename S, typename T>
    \n-
    506 struct TransformTree<S,T,CompositeNodeTag,false>
    \n-
    507 : public TransformTreeNonRecursive<S,T>
    \n-
    508 {};
    \n-
    509
    \n-
    510#endif // DOXYGEN
    \n-
    511
    \n-
    513
    \n-
    514 } // namespace TypeTree
    \n-
    515} //namespace Dune
    \n-
    516
    \n-
    517#endif // DUNE_TYPETREE_TRANSFORMATION_HH
    \n-\n-
    static const result_type result
    Definition accumulate_static.hh:113
    \n-\n-\n-\n-
    void registerNodeTransformation(SourceNode *, Transformation *, Tag *)
    Register transformation descriptor to transform SourceNode with Transformation.
    \n+
    239#endif // DOXYGEN
    \n+
    240
    \n+
    241
    \n+
    242 using Dune::index_constant;
    \n+
    243 namespace Indices = Dune::Indices;
    \n+
    244
    \n+
    246
    \n+
    247 } // namespace TypeTree
    \n+
    248} //namespace Dune
    \n+
    249
    \n+
    250#endif // DUNE_TYPETREE_UTILITY_HH
    \n+\n+\n
    Definition accumulate_static.hh:16
    \n-
    Transform a TypeTree.
    Definition transformation.hh:96
    \n-
    type Type
    Definition transformation.hh:113
    \n-
    static transformed_type transform(std::shared_ptr< const SourceTree > sp, Transformation &t)
    Apply transformation to an existing tree s.
    Definition transformation.hh:134
    \n-
    static transformed_type transform(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
    Apply transformation to an existing tree s.
    Definition transformation.hh:128
    \n-
    static transformed_type transform(const SourceTree &s, Transformation &t)
    Apply transformation to an existing tree s.
    Definition transformation.hh:122
    \n-
    transformed_type type
    The type of the transformed tree.
    Definition transformation.hh:111
    \n-
    static transformed_type transform(const SourceTree &s, const Transformation &t=Transformation())
    Apply transformation to an existing tree s.
    Definition transformation.hh:116
    \n-
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
    Definition transformation.hh:141
    \n-
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, Transformation &t)
    Definition transformation.hh:148
    \n-
    Meta function that evaluates its argument iff it inherits from meta_function.
    Definition typetraits.hh:142
    \n+
    auto leafCount(const Tree &tree)
    The number of leaf nodes in the Tree.
    Definition visitor.hh:532
    \n+
    auto nodeCount(const Tree &tree)
    The total number of nodes in the Tree.
    Definition visitor.hh:524
    \n+
    auto depth(const Tree &tree)
    The depth of the TypeTree.
    Definition visitor.hh:508
    \n+
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n+
    Struct for obtaining some basic structural information about a TypeTree.
    Definition utility.hh:121
    \n+
    static const std::size_t leafCount
    The number of leaf nodes in the TypeTree.
    Definition utility.hh:136
    \n+
    static const std::size_t depth
    The depth of the TypeTree.
    Definition utility.hh:130
    \n+
    static const std::size_t nodeCount
    The total number of nodes in the TypeTree.
    Definition utility.hh:133
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,634 +1,265 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-transformation.hh\n+utility.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TRANSFORMATION_HH\n-7#define DUNE_TYPETREE_TRANSFORMATION_HH\n+6#ifndef DUNE_TYPETREE_UTILITY_HH\n+7#define DUNE_TYPETREE_UTILITY_HH\n 8\n-9#include \n+9#include \n 10#include \n-11#include \n+11#include \n 12#include \n-13\n-14#include \n-15#include \n-16#include \n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-21\n+13#include \n+14\n+15#include \n+16#include \n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+19\n+20namespace _\bD_\bu_\bn_\be {\n+21 namespace TypeTree {\n 22\n-23namespace _\bD_\bu_\bn_\be {\n-24 namespace TypeTree {\n-25\n-31#ifdef DOXYGEN\n-32\n+27#ifndef DOXYGEN\n+28\n+29 template\n+30 std::shared_ptr convert_arg(const T& t)\n+31 {\n+32 return std::make_shared(t);\n+33 }\n 34\n-53 template\n-_\b5_\b4 void _\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(SourceNode*, Transformation*, Tag*);\n-55\n-56#else // DOXYGEN\n+35 template\n+36 std::shared_ptr convert_arg(T& t)\n+37 {\n+38 return stackobject_to_shared_ptr(t);\n+39 }\n+40\n+41 template\n+42 T& assertGridViewType(T& t)\n+43 {\n+44 static_assert((std::is_same::value),\n+46 \"GridViewType must be equal in all components of composite type\");\n+47 return t;\n+48 }\n+49\n+50 // only bind to real rvalues\n+51 template\n+52 typename std::enable_if::value,std::\n+shared_ptr >::type convert_arg(T&& t)\n+53 {\n+54 return std::make_shared(std::forward(t));\n+55 }\n+56\n 57\n-68 template\n-69 struct LookupNodeTransformation\n-70 {\n-71\n-72 typedef decltype(_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(declptr(),declptr\n-(),declptr())) lookup_type;\n-73\n-74 typedef typename _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn<\n-75 lookup_type\n-76 >::type type;\n-77\n-78 static_assert((!std::is_same::value), \"Unable to find valid\n-transformation descriptor\");\n-79 };\n-80\n-81#endif // DOXYGEN\n-82\n-83\n-85\n-94 template\n-_\b9_\b5 struct _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be\n-96 {\n-97\n-98#ifndef DOXYGEN\n-99\n-100 typedef typename\n-LookupNodeTransformation::type NodeTransformation;\n-101\n-102 // the type of the new tree that will result from this transformation\n-103 typedef typename\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>::transformed_type transformed_type;\n-104\n-105 // the storage type of the new tree that will result from this\n-transformation\n-106 typedef typename\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>::transformed_storage_type transformed_storage_type;\n+58 namespace Experimental {\n+59\n+68 template\n+69 constexpr decltype(auto)\n+70 left_fold(const BinaryOp& binary_op, Arg&& arg)\n+71 {\n+72 return std::forward(arg);\n+73 }\n+74\n+96 template\n+97 constexpr decltype(auto)\n+98 left_fold(const BinaryOp& binary_op, Init&& init, Arg0&& arg_0, Args&&...\n+args)\n+99 {\n+100 return left_fold(\n+101 binary_op,\n+102 binary_op(std::forward(init), std::forward(arg_0)),\n+103 std::forward(args)...);\n+104 }\n+105\n+106 } // namespace Experimental\n 107\n-108#endif // DOXYGEN\n-109\n-_\b1_\b1_\b1 typedef transformed_type _\bt_\by_\bp_\be;\n+108\n+109#endif // DOXYGEN\n+110\n 112\n-_\b1_\b1_\b3 typedef _\bt_\by_\bp_\be _\bT_\by_\bp_\be;\n-114\n-_\b1_\b1_\b6 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceTree& s, const\n-Transformation& t = Transformation())\n-117 {\n-118 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(s,t);\n-119 }\n-120\n-_\b1_\b2_\b2 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceTree& s, Transformation& t)\n-123 {\n-124 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(s,t);\n-125 }\n+119 template\n+_\b1_\b2_\b0 struct _\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n+121 {\n+122\n+123 private:\n+124 // Start the tree traversal\n+125 typedef _\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b<_\bT_\br_\be_\be_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>> _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo;\n 126\n-_\b1_\b2_\b8 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp,\n-const Transformation& t = Transformation())\n-129 {\n-130 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(sp,t);\n-131 }\n-132\n-_\b1_\b3_\b4 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp,\n-Transformation& t)\n-135 {\n-136 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(sp,t);\n-137 }\n-138\n-_\b1_\b4_\b1 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr sp, const Transformation& t = Transformation())\n-142 {\n-143 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(sp,t);\n-144 }\n-145\n-_\b1_\b4_\b8 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr sp, Transformation& t)\n-149 {\n-150 return\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n-recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(sp,t);\n-151 }\n+127 public:\n+128\n+_\b1_\b3_\b0 static const std::size_t _\bd_\be_\bp_\bt_\bh = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh;\n+131\n+_\b1_\b3_\b3 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt;\n+134\n+_\b1_\b3_\b6 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt;\n+137\n+138 };\n+139\n+140\n+141#ifndef DOXYGEN\n+142\n+143 /\n+/\n+********************************************************************************\n+144 // TreeInfo specializations for the different node types\n+145 /\n+/\n+********************************************************************************\n+146\n+147\n+148 // leaf node\n+149 template\n+150 struct _\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n+151 {\n 152\n-153\n-154 };\n-155\n-156#ifndef DOXYGEN // internal per-node implementations of the transformation\n-algorithm\n-157\n-158 // handle a leaf node - this is easy\n-159 template\n-160 struct TransformTree\n-161 {\n-162 // get transformed type from specification\n-163 typedef typename LookupNodeTransformation>_\b:_\b:_\bt_\by_\bp_\be\n-NodeTransformation;\n-164\n-165 typedef typename NodeTransformation::transformed_type transformed_type;\n-166 typedef typename NodeTransformation::transformed_storage_type\n-transformed_storage_type;\n-167\n-168 // delegate instance transformation to per-node specification\n-169 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, T& t)\n-170 {\n-171 return NodeTransformation::transform(s,t);\n-172 }\n-173\n-174 // delegate instance transformation to per-node specification\n-175 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, const T& t)\n-176 {\n-177 return NodeTransformation::transform(s,t);\n-178 }\n+153 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1;\n+154\n+155 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1;\n+156\n+157 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = 1;\n+158\n+159 };\n+160\n+161\n+162 // power node - exploit the fact that all children are identical\n+163 template\n+164 struct TreeInfo\n+165 {\n+166\n+167 typedef TreeInfo> ChildInfo;\n+168\n+169 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1 + ChildInfo::depth;\n+170\n+171 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1 + StaticDegree::value *\n+ChildInfo::nodeCount;\n+172\n+173 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = StaticDegree::value *\n+ChildInfo::leafCount;\n+174\n+175 };\n+176\n+177\n+178 namespace {\n 179\n-180 // delegate instance transformation to per-node specification\n-181 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp, T& t)\n-182 {\n-183 return NodeTransformation::transform(sp,t);\n-184 }\n+180 // TMP for iterating over the children of a composite node\n+181 // identical for both composite node implementations\n+182 template\n+183 struct generic_compositenode_children_info\n+184 {\n 185\n-186 // delegate instance transformation to per-node specification\n-187 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp, const T& t)\n-188 {\n-189 return NodeTransformation::transform(sp,t);\n-190 }\n-191\n-192 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n-sp, T& t)\n-193 {\n-194 return NodeTransformation::transform_storage(sp,t);\n-195 }\n-196\n-197 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n-sp, const T& t)\n-198 {\n-199 return NodeTransformation::transform_storage(sp,t);\n-200 }\n+186 typedef generic_compositenode_children_info NextChild;\n+187\n+188 // extract child info\n+189 typedef typename Node::template Child::Type Child;\n+190 typedef NodeTag ChildTag;\n+191 typedef TreeInfo ChildInfo;\n+192\n+193 // combine information of current child with info about following children\n+194 static const std::size_t maxDepth = ChildInfo::depth > NextChild::maxDepth\n+? ChildInfo::depth : NextChild::maxDepth;\n+195\n+196 static const std::size_t nodeCount = ChildInfo::nodeCount + NextChild::\n+nodeCount;\n+197\n+198 static const std::size_t leafCount = ChildInfo::leafCount + NextChild::\n+leafCount;\n+199\n+200 };\n 201\n-202 };\n-203\n-204\n-205 // common implementation for non-recursive transformation of non-leaf nodes\n-206 template\n-207 struct TransformTreeNonRecursive\n-208 {\n-209 // get transformed type from specification\n-210 typedef typename LookupNodeTransformation>::type\n-NodeTransformation;\n-211\n-212 typedef typename NodeTransformation::transformed_type transformed_type;\n-213 typedef typename NodeTransformation::transformed_storage_type\n-transformed_storage_type;\n+202 // End of recursion\n+203 template\n+204 struct generic_compositenode_children_info\n+205 {\n+206 static const std::size_t maxDepth = 0;\n+207\n+208 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 0;\n+209\n+210 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = 0;\n+211 };\n+212\n+213 } // anonymous namespace\n 214\n-215 // delegate instance transformation to per-node specification\n-216 static transformed_type transform(const S& s, T& t)\n-217 {\n-218 return NodeTransformation::transform(s,t);\n-219 }\n+215\n+216 // Struct for building information about composite node\n+217 template\n+218 struct GenericCompositeNodeInfo\n+219 {\n 220\n-221 // delegate instance transformation to per-node specification\n-222 static transformed_type transform(const S& s, const T& t)\n-223 {\n-224 return NodeTransformation::transform(s,t);\n-225 }\n+221 typedef generic_compositenode_children_info::\n+value> Children;\n+222\n+223 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1 + Children::maxDepth;\n+224\n+225 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1 + Children::nodeCount;\n 226\n-227 // delegate instance transformation to per-node specification\n-228 static transformed_type transform(std::shared_ptr sp, T& t)\n-229 {\n-230 return NodeTransformation::transform(sp,t);\n-231 }\n-232\n-233 // delegate instance transformation to per-node specification\n-234 static transformed_type transform(std::shared_ptr sp, const T& t)\n-235 {\n-236 return NodeTransformation::transform(sp,t);\n-237 }\n+227 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = Children::leafCount;\n+228\n+229 };\n+230\n+231\n+232 // CompositeNode: delegate to GenericCompositeNodeInfo\n+233 template\n+234 struct TreeInfo\n+235 : public GenericCompositeNodeInfo\n+236 {};\n+237\n 238\n-239 static transformed_storage_type transform_storage(std::shared_ptr\n-sp, T& t)\n-240 {\n-241 return NodeTransformation::transform_storage(sp,t);\n-242 }\n-243\n-244 static transformed_storage_type transform_storage(std::shared_ptr\n-sp, const T& t)\n-245 {\n-246 return NodeTransformation::transform_storage(sp,t);\n-247 }\n-248\n-249 };\n-250\n-251\n-252 namespace Impl {\n-253\n-254 // Helper class to handle recursive power nodes\n-255 template\n-256 class RecursivePowerTransformTree\n-257 {\n-258 // We only know two types of tags!\n-259 static_assert(std::is_same_v or std::\n-is_same_v);\n-260\n-261 using ChildType = typename Source::ChildType;\n-262\n-263 // in case degree is dynamic, provid a vector correctly initialized\n-264 template\n-265 static auto node_storage_provider(const std::size_t& degree)\n-266 {\n-267 return std::vector(degree);\n-268 }\n-269\n-270 // in case degree is static, provid an array\n-271 template\n-272 static auto node_storage_provider(StaticIndex)\n-273 {\n-274 return std::array();\n-275 }\n-276\n-277 public:\n-278 // get transformed type from specification\n-279 // Handling this transformation in a way that makes the per-node\n-specification easy to write\n-280 // is a little involved:\n-281 // The problem is that the transformed power node must be parameterized on\n-the transformed child\n-282 // type. So we need to transform the child type and pass the transformed\n-child type to an inner\n-283 // template of the node transformation struct called result (see example of\n-such a specification\n-284 // further down).\n-285 using NodeTransformation = typename\n-LookupNodeTransformation>::\n-type;\n-286 using ChildNodeTransformation = typename\n-LookupNodeTransformation>::\n-type;\n-287\n-288 private:\n-289 // Since every child is same type, is enough to get transformation once\n-290 using ChildTreeTransformation = TransformTree,\n-293 ChildNodeTransformation::recursive>;\n-294\n-295 // Get transformed type of children\n-296 using transformed_child_type = typename ChildTreeTransformation::\n-transformed_type;\n-297 using transformed_child_storage_type = typename ChildTreeTransformation::\n-transformed_storage_type;\n-298 public:\n-299 // Apply transformation from children to current node\n-300 using transformed_type = typename NodeTransformation::template\n-result::type;\n-301 using transformed_storage_type = typename NodeTransformation::template\n-result::storage_type;\n-302\n-303 // Transform an instance of source tree.\n-304 static transformed_type transform(const Source& source, Transformation&\n-transformation)\n-305 {\n-306 auto children_storage = node_storage_provider>(source.degree());\n-307 for (std::size_t k = 0; k < source.degree(); ++k) {\n-308 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source.childStorage(k),transformation);\n-309 }\n-310 return NodeTransformation::transform\n-(source,transformation,children_storage);\n-311 }\n-312\n-313 // Transform an instance of source tree.\n-314 static transformed_type transform(const Source& source, const\n-Transformation& transformation)\n-315 {\n-316 auto children_storage = node_storage_provider>(source.degree());\n-317 for (std::size_t k = 0; k < source.degree(); ++k) {\n-318 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source.childStorage(k),transformation);\n-319 }\n-320 return NodeTransformation::transform\n-(source,transformation,children_storage);\n-321 }\n-322\n-323 // Transform an instance of source tree.\n-324 static transformed_type transform(std::shared_ptr source_ptr,\n-Transformation& transformation)\n-325 {\n-326 auto children_storage = node_storage_provider>(source_ptr->degree());\n-327 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n-328 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source_ptr->childStorage(k),transformation);\n-329 }\n-330 return NodeTransformation::transform\n-(source_ptr,transformation,children_storage);\n-331 }\n-332\n-333 // Transform an instance of source tree.\n-334 static transformed_type transform(std::shared_ptr source_ptr,\n-const Transformation& transformation)\n-335 {\n-336 auto children_storage = node_storage_provider>(source_ptr->degree());\n-337 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n-338 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source_ptr->childStorage(k),transformation);\n-339 }\n-340 return NodeTransformation::transform\n-(source_ptr,transformation,children_storage);\n-341 }\n-342\n-343 // Transform an instance of source tree ptr.\n-344 static transformed_storage_type transform_storage(std::shared_ptr source_ptr, Transformation& transformation)\n-345 {\n-346 auto children_storage =\n-node_storage_provider(source_ptr->degree());\n-347 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n-348 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source_ptr->childStorage(k),transformation);\n-349 }\n-350 return NodeTransformation::transform_storage\n-(source_ptr,transformation,children_storage);\n-351 }\n-352\n-353 // Transform an instance of source tree ptr.\n-354 static transformed_storage_type transform_storage(std::shared_ptr source_ptr, const Transformation& transformation)\n-355 {\n-356 auto children_storage =\n-node_storage_provider(source_ptr->degree());\n-357 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n-358 children_storage[k] = ChildTreeTransformation::transform_storage\n-(source_ptr->childStorage(k),transformation);\n-359 }\n-360 return NodeTransformation::transform_storage\n-(source_ptr,transformation,children_storage);\n-361 }\n-362\n-363 };\n-364 } // namespace Impl\n-365\n-366 // Recursive version of the PowerNode transformation for static nodes.\n-367 template\n-368 struct TransformTree\n-369 : public Impl::\n-RecursivePowerTransformTree\n-370 {};\n-371\n-372 // Recursive version of the DynamicPowerNode transformation for static\n-nodes.\n-373 template\n-374 struct TransformTree\n-375 : public Impl::\n-RecursivePowerTransformTree\n-376 {};\n-377\n-378 // non-recursive version of the PowerNode transformation.\n-379 template\n-380 struct TransformTree\n-381 : public TransformTreeNonRecursive\n-382 {};\n-383\n-384 // non-recursive version of the DynamicPowerNodeTag transformation.\n-385 template\n-386 struct TransformTree\n-387 : public TransformTreeNonRecursive\n-388 {};\n-389\n-390 // helper struct that does the actual transformation for a composite node.\n-We need this additional struct\n-391 // to extract the template argument list with the types of all children\n-from the node, which we cannot do\n-392 // directly in the transformation<> template, as the type passed to\n-transformation<> will usually be a\n-393 // derived type and will normally have more template arguments than just\n-the children. This declaration\n-394 // just introduces the type of the helper struct, we always instantiate the\n-specialization defined below;\n-395 template\n-396 struct transform_composite_node;\n-397\n-398 // specialized version of the helper struct which extracts the template\n-argument list with the children from\n-399 // its second template parameter, which has to be CompositeNode::\n-ChildTypes. Apart from that, the struct is\n-400 // similar to the one for a PowerNode, but it obviously delegates\n-transformation of the children to the TMP.\n-401 template\n-402 struct transform_composite_node,T>\n-403 {\n-404\n-405 // transformed type, using the same nested struct trick as the PowerNode\n-406 typedef ImplementationTag Tag;\n-407 typedef typename LookupNodeTransformation::type\n-NodeTransformation;\n-408 typedef typename NodeTransformation::template _\br_\be_\bs_\bu_\bl_\bt,\n-411 LookupNodeTransformation>::type::recursive\n-412 >::transformed_type...\n-413 >::type transformed_type;\n-414\n-415 typedef typename NodeTransformation::template _\br_\be_\bs_\bu_\bl_\bt,\n-418 LookupNodeTransformation>::type::recursive\n-419 >::transformed_type...\n-420 >::storage_type transformed_storage_type;\n-421\n-422 // Retrieve the transformation descriptor for the child with index i.\n-423 // This little helper improves really improves the readability of the\n-424 // transformation functions.\n-425 template\n-426 struct ChildTransformation\n-427 : public TransformTree::Type,\n-428 T,\n-429 NodeTag::Type>,\n-430 LookupNodeTransformation<\n-431 typename S::template Child::Type,\n-432 T,\n-433 ImplementationTag::Type>\n-434 >::type::recursive\n-435 >\n-436 {};\n-437\n-438 template\n-439 static void setElement(Tuple& tuple, Value&& value)\n-440 {\n-441 std::get(tuple) = std::forward(value);\n-442 }\n-443\n-444 template\n-445 static transformed_type transform(const S& s, Trafo&& t, std::\n-index_sequence indices)\n-446 {\n-447 std::tuple::transformed_storage_type...>\n-storage;\n-448 Dune::Hybrid::Impl::evaluateFoldExpression({(setElement(storage,\n-ChildTransformation::transform_storage(s.template childStorage(), std::\n-forward(t))),0)...});\n-449 return NodeTransformation::transform(s, std::forward(t), std::get\n-(storage)...);\n-450 }\n-451\n-452 template\n-453 static transformed_storage_type transform_storage(std::shared_ptr\n-sp, Trafo&& t, std::index_sequence indices)\n-454 {\n-455 std::tuple::transformed_storage_type...>\n-storage;\n-456 Dune::Hybrid::Impl::evaluateFoldExpression({(setElement(storage,\n-ChildTransformation::transform_storage(sp->template childStorage(), std::\n-forward(t))),0)...});\n-457 return NodeTransformation::transform_storage(sp, std::forward(t),\n-std::get(storage)...);\n-458 }\n-459 };\n-460\n-461\n-462 // the specialization of transformation<> for the CompositeNode. This just\n-extracts the\n-463 // CompositeNode::ChildTypes member and forwards to the helper struct\n-464 template\n-465 struct TransformTree\n-466 {\n-467\n-468 private:\n-469\n-470 typedef typename S::ChildTypes ChildTypes;\n-471\n-472 static auto child_indices()\n-473 {\n-474 return std::make_index_sequence();\n-475 }\n-476\n-477 public:\n-478\n-479 typedef typename transform_composite_node::transformed_type\n-transformed_type;\n-480 typedef typename transform_composite_node::\n-transformed_storage_type transformed_storage_type;\n-481\n-482 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, T& t)\n-483 {\n-484 return transform_composite_node::transform\n-(s,t,child_indices());\n-485 }\n-486\n-487 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, const T& t)\n-488 {\n-489 return transform_composite_node::transform\n-(s,t,child_indices());\n-490 }\n-491\n-492 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n-sp, T& t)\n-493 {\n-494 return transform_composite_node::transform_storage\n-(sp,t,child_indices());\n-495 }\n-496\n-497 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n-sp, const T& t)\n-498 {\n-499 return transform_composite_node::transform_storage\n-(sp,t,child_indices());\n-500 }\n-501\n-502 };\n-503\n-504 // non-recursive version of the CompositeNode transformation.\n-505 template\n-506 struct TransformTree\n-507 : public TransformTreeNonRecursive\n-508 {};\n-509\n-510#endif // DOXYGEN\n-511\n-513\n-514 } // namespace TypeTree\n-515} //namespace Dune\n-516\n-517#endif // DUNE_TYPETREE_TRANSFORMATION_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+239#endif // DOXYGEN\n+240\n+241\n+242 using Dune::index_constant;\n+243 namespace Indices = Dune::Indices;\n+244\n+246\n+247 } // namespace TypeTree\n+248} //namespace Dune\n+249\n+250#endif // DUNE_TYPETREE_UTILITY_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-void registerNodeTransformation(SourceNode *, Transformation *, Tag *)\n-Register transformation descriptor to transform SourceNode with Transformation.\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be\n-Transform a TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be\n-type Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(std::shared_ptr< const SourceTree > sp,\n-Transformation &t)\n-Apply transformation to an existing tree s.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:134\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(std::shared_ptr< const SourceTree > sp, const\n-Transformation &t=Transformation())\n-Apply transformation to an existing tree s.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(const SourceTree &s, Transformation &t)\n-Apply transformation to an existing tree s.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\by_\bp_\be\n-transformed_type type\n-The type of the transformed tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(const SourceTree &s, const Transformation\n-&t=Transformation())\n-Apply transformation to an existing tree s.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static transformed_storage_type transform_storage(std::shared_ptr< const\n-SourceTree > sp, const Transformation &t=Transformation())\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static transformed_storage_type transform_storage(std::shared_ptr< const\n-SourceTree > sp, Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Meta function that evaluates its argument iff it inherits from meta_function.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n+auto leafCount(const Tree &tree)\n+The number of leaf nodes in the Tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:532\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n+auto nodeCount(const Tree &tree)\n+The total number of nodes in the Tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n+auto depth(const Tree &tree)\n+The depth of the TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a leaf node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n+Struct for obtaining some basic structural information about a TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n+static const std::size_t leafCount\n+The number of leaf nodes in the TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n+static const std::size_t depth\n+The depth of the TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n+static const std::size_t nodeCount\n+The total number of nodes in the TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:133\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00023.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00023.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: fixedcapacitystack.hh File Reference\n+dune-typetree: proxynode.hh File Reference\n \n \n \n \n \n \n \n@@ -72,27 +72,51 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    fixedcapacitystack.hh File Reference
    \n+
    proxynode.hh File Reference
    \n
    \n
    \n-
    #include <array>
    \n-#include <cassert>
    \n+
    #include <type_traits>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/common/shared_ptr.hh>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::TypeTree::FixedCapacityStackView< T >
    class  Dune::TypeTree::StaticChildAccessors< ProxiedNode >
     Mixin class providing methods for child access with compile-time parameter. More...
     
    class  Dune::TypeTree::FixedCapacityStack< T, capacity >
    struct  Dune::TypeTree::StaticChildAccessors< ProxiedNode >::Child< k >
     Access to the type and storage type of the i-th child. More...
     
    class  Dune::TypeTree::DynamicChildAccessors< ProxiedNode >
     Mixin class providing methods for child access with run-time parameter. More...
     
    struct  Dune::TypeTree::ProxyNodeBase< Node, LeafNodeTag >
     ProxyNode base class for LeafNode. More...
     
    struct  Dune::TypeTree::ProxyNodeBase< Node, CompositeNodeTag >
     ProxyNode base class for CompositeNode. More...
     
    struct  Dune::TypeTree::ProxyNodeBase< Node, PowerNodeTag >
     ProxyNode base class for PowerNode. More...
     
    struct  Dune::TypeTree::ProxyNodeBase< Node, DynamicPowerNodeTag >
     ProxyNode base class for DynamicPowerNode. More...
     
    class  Dune::TypeTree::ProxyNode< Node >
     Base class for nodes acting as a proxy for an existing node. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,22 +1,48 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-fixedcapacitystack.hh File Reference\n-#include \n-#include \n+proxynode.hh File Reference\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b<_\b _\bT_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0 Mixin class providing methods for child access with compile-time\n+ parameter. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\b<_\b _\bT_\b,_\b _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n+\u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b<_\b _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0 Mixin class providing methods for child access with run-time\n+ parameter. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n+\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n+\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n+\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>\n+\u00a0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be base class for _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n+\u00a0 Base class for nodes acting as a proxy for an existing node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00023_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00023_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: fixedcapacitystack.hh Source File\n+dune-typetree: proxynode.hh Source File\n \n \n \n \n \n \n \n@@ -74,215 +74,397 @@\n \n
    \n \n
    \n \n
    \n-
    fixedcapacitystack.hh
    \n+
    proxynode.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=8 sw=2 sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n-
    7#define DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n+
    6#ifndef DUNE_TYPETREE_PROXYNODE_HH
    \n+
    7#define DUNE_TYPETREE_PROXYNODE_HH
    \n
    8
    \n-
    9#include <array>
    \n-
    10#include <cassert>
    \n-
    11
    \n-
    12namespace Dune {
    \n-
    13 namespace TypeTree {
    \n-
    14
    \n+
    9#include <type_traits>
    \n+\n+\n+
    12#include <dune/common/shared_ptr.hh>
    \n+
    13#include <dune/common/indices.hh>
    \n+
    14#include <dune/common/std/type_traits.hh>
    \n
    15
    \n-
    19
    \n-
    20 template<typename T>
    \n-
    \n-\n-
    22 {
    \n-
    23
    \n-
    24 public:
    \n-
    25
    \n-
    26 struct Impl
    \n-
    27 {
    \n-
    28
    \n-
    29 Impl(T* data, std::size_t capacity)
    \n-
    30 : _data(data)
    \n-
    31 , _size(0)
    \n-
    32 , _capacity(capacity)
    \n-
    33 {}
    \n-
    34
    \n-
    35 T * const _data;
    \n-
    36 std::size_t _size;
    \n-
    37 const std::size_t _capacity;
    \n+
    16namespace Dune {
    \n+
    17 namespace TypeTree {
    \n+
    18
    \n+
    24 template<typename Node>
    \n+
    25 class ProxyNode;
    \n+
    26
    \n+
    28 template<typename ProxiedNode>
    \n+
    \n+\n+
    30 {
    \n+
    31
    \n+
    32 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
    \n+
    33
    \n+
    34 template<std::size_t k>
    \n+
    35 struct lazy_enabled
    \n+
    36 {
    \n+
    37 static const bool value = !proxiedNodeIsConst;
    \n
    38 };
    \n
    39
    \n-
    \n-\n-
    41 : _impl(impl)
    \n-
    42 {}
    \n-
    \n-
    43
    \n-
    44 public:
    \n-
    45
    \n-
    \n-
    46 std::size_t size() const
    \n-
    47 {
    \n-
    48 return _impl._size;
    \n-
    49 }
    \n-
    \n-
    50
    \n-
    \n-
    51 std::size_t capacity() const
    \n-
    52 {
    \n-
    53 return _impl._capacity;
    \n-
    54 }
    \n-
    \n+\n+
    41
    \n+
    42 template<bool enabled = !proxiedNodeIsConst>
    \n+
    43 typename std::enable_if<enabled,Node&>::type
    \n+
    44 node ()
    \n+
    45 {
    \n+
    46 return static_cast<Node&>(*this);
    \n+
    47 }
    \n+
    48
    \n+
    49 const Node& node () const
    \n+
    50 {
    \n+
    51 return static_cast<const Node&>(*this);
    \n+
    52 }
    \n+
    53
    \n+
    54 public:
    \n
    55
    \n-
    \n-
    56 bool empty() const
    \n-
    57 {
    \n-
    58 return _impl._size == 0;
    \n-
    59 }
    \n-
    \n-
    60
    \n-
    \n-
    61 bool full() const
    \n-
    62 {
    \n-
    63 return _impl._size == _impl._capacity;
    \n-
    64 }
    \n-
    \n-
    65
    \n-
    \n-
    66 void push_back(const T& t)
    \n-
    67 {
    \n-
    68 assert(!full());
    \n-
    69 _impl._data[_impl._size++] = t;
    \n-
    70 }
    \n-
    \n-
    71
    \n-
    \n-
    72 void pop_back()
    \n-
    73 {
    \n-
    74 assert(!empty());
    \n-
    75 --_impl._size;
    \n-
    76 }
    \n+
    57 template<std::size_t k>
    \n+
    \n+
    58 struct Child
    \n+
    59 : public ProxiedNode::template Child<k>
    \n+
    60 {};
    \n+
    \n+
    61
    \n+
    64
    \n+
    66
    \n+
    69 template<std::size_t k,
    \n+
    70 typename std::enable_if<lazy_enabled<k>::value, int>::type = 0>
    \n+
    \n+
    71 auto& child (index_constant<k> = {})
    \n+
    72 {
    \n+
    73 return node().proxiedNode().template child<k>();
    \n+
    74 }
    \n
    \n+
    75
    \n
    77
    \n-
    \n-
    78 T& back()
    \n-
    79 {
    \n-
    80 assert(!empty());
    \n-
    81 return _impl._data[_impl._size-1];
    \n-
    82 }
    \n-
    \n-
    83
    \n-
    \n-
    84 const T& back() const
    \n-
    85 {
    \n-
    86 assert(!empty());
    \n-
    87 return _impl._data[_impl._size-1];
    \n-
    88 }
    \n-
    \n-
    89
    \n-
    \n-
    90 T& front()
    \n-
    91 {
    \n-
    92 assert(!empty());
    \n-
    93 return _impl._data[0];
    \n-
    94 }
    \n-
    \n-
    95
    \n-
    \n-
    96 const T& front() const
    \n-
    97 {
    \n-
    98 assert(!empty());
    \n-
    99 return _impl._data[0];
    \n-
    100 }
    \n-
    \n-
    101
    \n-
    \n-
    102 T& operator[](std::size_t k)
    \n-
    103 {
    \n-
    104 assert(k < _impl._size);
    \n-
    105 return _impl._data[k];
    \n-
    106 }
    \n-
    \n-
    107
    \n-
    \n-
    108 const T& operator[](std::size_t k) const
    \n-
    109 {
    \n-
    110 assert(k < _impl._size);
    \n-
    111 return _impl._data[k];
    \n-
    112 }
    \n-
    \n-
    113
    \n-
    114 private:
    \n-
    115 Impl& _impl;
    \n-
    116
    \n-
    117 };
    \n+
    80 template<std::size_t k>
    \n+
    \n+
    81 const auto& child (index_constant<k> = {}) const
    \n+
    82 {
    \n+
    83 return node().proxiedNode().template child<k>();
    \n+
    84 }
    \n+
    \n+
    85
    \n+
    87
    \n+
    90 template<std::size_t k,
    \n+
    91 typename std::enable_if<lazy_enabled<k>::value, int>::type = 0>
    \n+
    \n+
    92 auto childStorage (index_constant<k> = {})
    \n+
    93 {
    \n+
    94 return node().proxiedNode().template childStorage<k>();
    \n+
    95 }
    \n+
    \n+
    96
    \n+
    98
    \n+
    104 template<std::size_t k>
    \n+
    \n+
    105 auto childStorage (index_constant<k> = {}) const
    \n+
    106 {
    \n+
    107 return node().proxiedNode().template childStorage<k>();
    \n+
    108 }
    \n+
    \n+
    109
    \n+
    111 template<std::size_t k, class ProxyChild>
    \n+
    \n+
    112 void setChild (ProxyChild&& child, typename std::enable_if<lazy_enabled<k>::value,void*>::type = 0)
    \n+
    113 {
    \n+
    114 node().proxiedNode().template setChild<k>(std::forward<ProxyChild>(child));
    \n+
    115 }
    \n
    \n-
    118
    \n-
    119
    \n-
    120 template<typename T, std::size_t capacity>
    \n-
    \n-\n-
    122 : private std::array<T,capacity>
    \n-
    123 , private FixedCapacityStackView<T>::Impl
    \n-
    124 , public FixedCapacityStackView<T>
    \n-
    125 {
    \n-
    126
    \n-\n-
    128
    \n-
    129 public:
    \n-
    130
    \n-
    131 using view_base::back;
    \n-
    132 using view_base::front;
    \n-
    133 using view_base::size;
    \n-
    134 using view_base::operator[];
    \n-
    135
    \n-
    \n-\n-
    137 : FixedCapacityStackView<T>::Impl(&(static_cast<std::array<T,capacity>&>(*this)[0]),capacity)
    \n-
    138 , FixedCapacityStackView<T>(static_cast<typename FixedCapacityStackView<T>::Impl&>(*this))
    \n-
    139 {}
    \n-
    \n-
    140
    \n-
    141 private:
    \n-
    142
    \n-
    143 //FixedCapacityStack(const FixedCapacityStack&);
    \n-
    144 FixedCapacityStack& operator=(const FixedCapacityStack&);
    \n+
    116
    \n+
    \n+
    117 const typename ProxiedNode::NodeStorage& nodeStorage () const
    \n+
    118 {
    \n+
    119 return node().proxiedNode().nodeStorage();
    \n+
    120 }
    \n+
    \n+
    121
    \n+
    122 };
    \n+
    \n+
    123
    \n+
    125
    \n+
    130 template<typename ProxiedNode>
    \n+
    \n+\n+
    132 : public StaticChildAccessors<ProxiedNode>
    \n+
    133 {
    \n+
    134
    \n+\n+
    136
    \n+
    137 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
    \n+
    138
    \n+
    139 template<bool enabled = !proxiedNodeIsConst>
    \n+
    140 typename std::enable_if<enabled,Node&>::type
    \n+
    141 node ()
    \n+
    142 {
    \n+
    143 return static_cast<Node&>(*this);
    \n+
    144 }
    \n
    145
    \n-
    146 };
    \n-
    \n-
    147
    \n-
    149
    \n-
    150 } // namespace TypeTree
    \n-
    151} //namespace Dune
    \n+
    146 const Node& node () const
    \n+
    147 {
    \n+
    148 return static_cast<const Node&>(*this);
    \n+
    149 }
    \n+
    150
    \n+
    151 public:
    \n
    152
    \n-
    153#endif // DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n+
    155
    \n+
    157
    \n+
    160 template<bool enabled = !proxiedNodeIsConst,
    \n+
    161 typename std::enable_if<enabled, int>::type = 0>
    \n+
    \n+
    162 auto& child (std::size_t i)
    \n+
    163 {
    \n+
    164 return node().proxiedNode().child(i);
    \n+
    165 }
    \n+
    \n+
    166
    \n+
    168
    \n+
    \n+
    171 const auto& child (std::size_t i) const
    \n+
    172 {
    \n+
    173 return node().proxiedNode().child(i);
    \n+
    174 }
    \n+
    \n+
    175
    \n+
    177
    \n+
    180 template<bool enabled = !proxiedNodeIsConst,
    \n+
    181 typename std::enable_if<enabled, int>::type = 0>
    \n+
    \n+
    182 auto childStorage (std::size_t i)
    \n+
    183 {
    \n+
    184 return node().proxiedNode().childStorage(i);
    \n+
    185 }
    \n+
    \n+
    186
    \n+
    188
    \n+
    \n+
    194 auto childStorage (std::size_t i) const
    \n+
    195 {
    \n+
    196 return node().proxiedNode().childStorage(i);
    \n+
    197 }
    \n+
    \n+
    198
    \n+
    200 template<class ProxyChild, bool enabled = !proxiedNodeIsConst>
    \n+
    \n+
    201 void setChild (std::size_t i, ProxyChild&& child, typename std::enable_if<enabled,void*>::type = 0)
    \n+
    202 {
    \n+
    203 node().proxiedNode().setChild(i, std::forward<ProxyChild>(child));
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    206 };
    \n+
    \n+
    207
    \n+
    209 template<typename Node, typename NodeTag>
    \n+\n+
    211
    \n+
    213 template<typename Node>
    \n+
    \n+\n+
    215 {
    \n+
    216 };
    \n+
    \n+
    217
    \n+
    219 template<typename Node>
    \n+
    \n+\n+
    221 : public StaticChildAccessors<Node>
    \n+
    222 {
    \n+
    223 typedef typename Node::ChildTypes ChildTypes;
    \n+
    224 typedef typename Node::NodeStorage NodeStorage;
    \n+
    225 };
    \n+
    \n+
    226
    \n+
    228 template<typename Node>
    \n+
    \n+\n+
    230 : public DynamicChildAccessors<Node>
    \n+
    231 {
    \n+
    232 typedef typename Node::ChildType ChildType;
    \n+
    233 typedef typename Node::NodeStorage NodeStorage;
    \n+
    234 };
    \n+
    \n+
    235
    \n+
    237 template<typename Node>
    \n+
    \n+\n+
    239 : public DynamicChildAccessors<Node>
    \n+
    240 {
    \n+
    241 typedef typename Node::ChildType ChildType;
    \n+
    242 typedef typename Node::NodeStorage NodeStorage;
    \n+
    243 };
    \n+
    \n+
    244
    \n+
    246
    \n+
    252 template<typename Node>
    \n+
    \n+\n+
    254 : public ProxyNodeBase<Node,NodeTag<Node>>
    \n+
    255 {
    \n+
    256 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
    \n+
    257
    \n+
    258 template <class N>
    \n+
    259 using HasStaticDegree = index_constant<N::degree()>;
    \n+
    260
    \n+
    261 template <class N>
    \n+
    262 static constexpr bool hasStaticDegree = Std::is_detected<HasStaticDegree, N>::value;
    \n+
    263
    \n+
    264 // accessor mixins need to be friends for access to proxiedNode()
    \n+
    265 friend class StaticChildAccessors<Node>;
    \n+
    266 friend class DynamicChildAccessors<Node>;
    \n+
    267
    \n+
    268 public:
    \n+
    269
    \n+
    270 typedef Node ProxiedNode;
    \n+
    271
    \n+\n+
    273
    \n+
    275 static const bool isLeaf = Node::isLeaf;
    \n+
    276
    \n+
    278 static const bool isPower = Node::isPower;
    \n+
    279
    \n+
    281 static const bool isComposite = Node::isComposite;
    \n+
    282
    \n+
    283 template <class N = Node,
    \n+
    284 std::enable_if_t<hasStaticDegree<N>, int> = 0>
    \n+
    \n+
    285 static constexpr auto degree ()
    \n+
    286 {
    \n+
    287 return N::degree();
    \n+
    288 }
    \n+
    \n+
    289
    \n+
    290 template <class N = Node,
    \n+
    291 std::enable_if_t<not hasStaticDegree<N>, int> = 0>
    \n+
    \n+
    292 auto degree () const
    \n+
    293 {
    \n+
    294 return proxiedNode().degree();
    \n+
    295 }
    \n+
    \n+
    296
    \n+
    297
    \n+
    298 protected:
    \n+
    299
    \n+
    302
    \n+
    304 template<bool enabled = !proxiedNodeIsConst>
    \n+
    305 typename std::enable_if<enabled,Node&>::type
    \n+
    \n+\n+
    307 {
    \n+
    308 return *_node;
    \n+
    309 }
    \n+
    \n+
    310
    \n+
    \n+
    312 const Node& proxiedNode () const
    \n+
    313 {
    \n+
    314 return *_node;
    \n+
    315 }
    \n+
    \n+
    316
    \n+
    318 template<bool enabled = !proxiedNodeIsConst>
    \n+
    319 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
    \n+
    \n+\n+
    321 {
    \n+
    322 return _node;
    \n+
    323 }
    \n+
    \n+
    324
    \n+
    \n+
    326 std::shared_ptr<const Node> proxiedNodeStorage () const
    \n+
    327 {
    \n+
    328 return _node;
    \n+
    329 }
    \n+
    \n+
    330
    \n+
    332
    \n+
    335
    \n+
    \n+
    336 ProxyNode (Node& node)
    \n+
    337 : _node(stackobject_to_shared_ptr(node))
    \n+
    338 {}
    \n+
    \n+
    339
    \n+
    \n+
    340 ProxyNode (std::shared_ptr<Node> node)
    \n+
    341 : _node(std::move(node))
    \n+
    342 {}
    \n+
    \n+
    343
    \n+
    345
    \n+
    346 private:
    \n+
    347
    \n+
    348 std::shared_ptr<Node> _node;
    \n+
    349 };
    \n+
    \n+
    350
    \n+
    352
    \n+
    353 } // namespace TypeTree
    \n+
    354} //namespace Dune
    \n+
    355
    \n+
    356#endif // DUNE_TYPETREE_PROXYNODE_HH
    \n+\n+\n+
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n
    Definition accumulate_static.hh:16
    \n-
    Definition fixedcapacitystack.hh:22
    \n-
    bool empty() const
    Definition fixedcapacitystack.hh:56
    \n-
    bool full() const
    Definition fixedcapacitystack.hh:61
    \n-
    T & operator[](std::size_t k)
    Definition fixedcapacitystack.hh:102
    \n-
    void pop_back()
    Definition fixedcapacitystack.hh:72
    \n-
    T & back()
    Definition fixedcapacitystack.hh:78
    \n-
    std::size_t capacity() const
    Definition fixedcapacitystack.hh:51
    \n-
    T & front()
    Definition fixedcapacitystack.hh:90
    \n-
    const T & front() const
    Definition fixedcapacitystack.hh:96
    \n-
    const T & operator[](std::size_t k) const
    Definition fixedcapacitystack.hh:108
    \n-
    void push_back(const T &t)
    Definition fixedcapacitystack.hh:66
    \n-
    const T & back() const
    Definition fixedcapacitystack.hh:84
    \n-
    std::size_t size() const
    Definition fixedcapacitystack.hh:46
    \n-
    FixedCapacityStackView(Impl &impl)
    Definition fixedcapacitystack.hh:40
    \n-
    Definition fixedcapacitystack.hh:125
    \n-
    FixedCapacityStack()
    Definition fixedcapacitystack.hh:136
    \n+
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n+
    Tag designating a power node.
    Definition nodetags.hh:21
    \n+
    Tag designating a power node with runtime degree.
    Definition nodetags.hh:24
    \n+
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n+
    Base class for nodes acting as a proxy for an existing node.
    Definition proxynode.hh:255
    \n+
    ProxyNode(Node &node)
    Definition proxynode.hh:336
    \n+
    Dune::TypeTree::NodeTag< Node > NodeTag
    Definition proxynode.hh:272
    \n+
    static const bool isComposite
    Mark this class as a composite in the dune-typetree.
    Definition proxynode.hh:281
    \n+
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition proxynode.hh:275
    \n+
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition proxynode.hh:278
    \n+
    auto degree() const
    Definition proxynode.hh:292
    \n+
    std::enable_if< enabled, Node & >::type proxiedNode()
    Returns the proxied node.
    Definition proxynode.hh:306
    \n+
    std::shared_ptr< const Node > proxiedNodeStorage() const
    Returns the storage of the proxied node (const version).
    Definition proxynode.hh:326
    \n+
    Node ProxiedNode
    Definition proxynode.hh:270
    \n+
    std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()
    Returns the storage of the proxied node.
    Definition proxynode.hh:320
    \n+
    static constexpr auto degree()
    Definition proxynode.hh:285
    \n+
    ProxyNode(std::shared_ptr< Node > node)
    Definition proxynode.hh:340
    \n+
    const Node & proxiedNode() const
    Returns the proxied node (const version).
    Definition proxynode.hh:312
    \n+
    Mixin class providing methods for child access with compile-time parameter.
    Definition proxynode.hh:30
    \n+
    auto & child(index_constant< k >={})
    Returns the i-th child.
    Definition proxynode.hh:71
    \n+
    void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::value, void * >::type=0)
    Sets the i-th child to the passed-in value.
    Definition proxynode.hh:112
    \n+
    const ProxiedNode::NodeStorage & nodeStorage() const
    Definition proxynode.hh:117
    \n+
    auto childStorage(index_constant< k >={})
    Returns the storage of the i-th child.
    Definition proxynode.hh:92
    \n+
    const auto & child(index_constant< k >={}) const
    Returns the i-th child (const version).
    Definition proxynode.hh:81
    \n+
    auto childStorage(index_constant< k >={}) const
    Returns the storage of the i-th child (const version).
    Definition proxynode.hh:105
    \n+
    Access to the type and storage type of the i-th child.
    Definition proxynode.hh:60
    \n+
    Mixin class providing methods for child access with run-time parameter.
    Definition proxynode.hh:133
    \n+
    auto & child(std::size_t i)
    Returns the i-th child.
    Definition proxynode.hh:162
    \n+
    auto childStorage(std::size_t i) const
    Returns the storage of the i-th child (const version).
    Definition proxynode.hh:194
    \n+
    void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if< enabled, void * >::type=0)
    Sets the i-th child to the passed-in value.
    Definition proxynode.hh:201
    \n+
    const auto & child(std::size_t i) const
    Returns the i-th child (const version).
    Definition proxynode.hh:171
    \n+
    auto childStorage(std::size_t i)
    Returns the storage of the i-th child.
    Definition proxynode.hh:182
    \n+
    Tag-based dispatch to appropriate base class that provides necessary functionality.
    Definition proxynode.hh:210
    \n+
    Node::NodeStorage NodeStorage
    Definition proxynode.hh:224
    \n+
    Node::ChildTypes ChildTypes
    Definition proxynode.hh:223
    \n+
    Node::NodeStorage NodeStorage
    Definition proxynode.hh:233
    \n+
    Node::ChildType ChildType
    Definition proxynode.hh:232
    \n+
    Node::NodeStorage NodeStorage
    Definition proxynode.hh:242
    \n+
    Node::ChildType ChildType
    Definition proxynode.hh:241
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,211 +1,446 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-fixedcapacitystack.hh\n+proxynode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=8 sw=2 sts=2:\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n-7#define DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n+6#ifndef DUNE_TYPETREE_PROXYNODE_HH\n+7#define DUNE_TYPETREE_PROXYNODE_HH\n 8\n-9#include \n-10#include \n-11\n-12namespace _\bD_\bu_\bn_\be {\n-13 namespace TypeTree {\n-14\n+9#include \n+10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+12#include \n+13#include \n+14#include \n 15\n-19\n-20 template\n-_\b2_\b1 class _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n-22 {\n-23\n-24 public:\n-25\n-26 struct Impl\n-27 {\n-28\n-29 Impl(T* data, std::size_t _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n-30 : _data(data)\n-31 , _size(0)\n-32 , _capacity(_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n-33 {}\n-34\n-35 T * const _data;\n-36 std::size_t _size;\n-37 const std::size_t _capacity;\n+16namespace _\bD_\bu_\bn_\be {\n+17 namespace TypeTree {\n+18\n+24 template\n+25 class ProxyNode;\n+26\n+28 template\n+_\b2_\b9 class _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+30 {\n+31\n+32 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n+33\n+34 template\n+35 struct lazy_enabled\n+36 {\n+37 static const bool value = !proxiedNodeIsConst;\n 38 };\n 39\n-_\b4_\b0 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw(Impl& impl)\n-41 : _impl(impl)\n-42 {}\n-43\n-44 public:\n-45\n-_\b4_\b6 std::size_t _\bs_\bi_\bz_\be() const\n-47 {\n-48 return _impl._size;\n-49 }\n-50\n-_\b5_\b1 std::size_t _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by() const\n-52 {\n-53 return _impl._capacity;\n-54 }\n+40 typedef _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be;\n+41\n+42 template\n+43 typename std::enable_if::type\n+44 node ()\n+45 {\n+46 return static_cast<_\bN_\bo_\bd_\be&>(*this);\n+47 }\n+48\n+49 const _\bN_\bo_\bd_\be& node () const\n+50 {\n+51 return static_cast(*this);\n+52 }\n+53\n+54 public:\n 55\n-_\b5_\b6 bool _\be_\bm_\bp_\bt_\by() const\n-57 {\n-58 return _impl._size == 0;\n-59 }\n-60\n-_\b6_\b1 bool _\bf_\bu_\bl_\bl() const\n-62 {\n-63 return _impl._size == _impl._capacity;\n-64 }\n-65\n-_\b6_\b6 void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const T& t)\n-67 {\n-68 assert(!_\bf_\bu_\bl_\bl());\n-69 _impl._data[_impl._size++] = t;\n-70 }\n-71\n-_\b7_\b2 void _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk()\n-73 {\n-74 assert(!_\be_\bm_\bp_\bt_\by());\n-75 --_impl._size;\n-76 }\n+57 template\n+_\b5_\b8 struct _\bC_\bh_\bi_\bl_\bd\n+59 : public ProxiedNode::template _\bC_\bh_\bi_\bl_\bd\n+60 {};\n+61\n+64\n+66\n+69 template::value, int>::type = 0>\n+_\b7_\b1 auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n+72 {\n+73 return node().proxiedNode().template child();\n+74 }\n+75\n 77\n-_\b7_\b8 T& _\bb_\ba_\bc_\bk()\n-79 {\n-80 assert(!_\be_\bm_\bp_\bt_\by());\n-81 return _impl._data[_impl._size-1];\n-82 }\n-83\n-_\b8_\b4 const T& _\bb_\ba_\bc_\bk() const\n-85 {\n-86 assert(!_\be_\bm_\bp_\bt_\by());\n-87 return _impl._data[_impl._size-1];\n-88 }\n-89\n-_\b9_\b0 T& _\bf_\br_\bo_\bn_\bt()\n-91 {\n-92 assert(!_\be_\bm_\bp_\bt_\by());\n-93 return _impl._data[0];\n-94 }\n-95\n-_\b9_\b6 const T& _\bf_\br_\bo_\bn_\bt() const\n-97 {\n-98 assert(!_\be_\bm_\bp_\bt_\by());\n-99 return _impl._data[0];\n-100 }\n-101\n-_\b1_\b0_\b2 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t k)\n-103 {\n-104 assert(k < _impl._size);\n-105 return _impl._data[k];\n-106 }\n-107\n-_\b1_\b0_\b8 const T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t k) const\n-109 {\n-110 assert(k < _impl._size);\n-111 return _impl._data[k];\n-112 }\n-113\n-114 private:\n-115 Impl& _impl;\n+80 template\n+_\b8_\b1 const auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n+82 {\n+83 return node().proxiedNode().template child();\n+84 }\n+85\n+87\n+90 template::value, int>::type = 0>\n+_\b9_\b2 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n+93 {\n+94 return node().proxiedNode().template childStorage();\n+95 }\n+96\n+98\n+104 template\n+_\b1_\b0_\b5 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n+106 {\n+107 return node().proxiedNode().template childStorage();\n+108 }\n+109\n+111 template\n+_\b1_\b1_\b2 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (ProxyChild&& _\bc_\bh_\bi_\bl_\bd, typename std::\n+enable_if::value,void*>::type = 0)\n+113 {\n+114 node().proxiedNode().template setChild(std::forward(_\bc_\bh_\bi_\bl_\bd));\n+115 }\n 116\n-117 };\n-118\n-119\n-120 template\n-_\b1_\b2_\b1 class _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n-122 : private std::array\n-123 , private _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw::Impl\n-124 , public _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n-125 {\n-126\n-127 typedef _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b<_\bT_\b> _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be;\n-128\n-129 public:\n-130\n-131 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bb_\ba_\bc_\bk;\n-132 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt;\n-133 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be;\n-134 using view_base::operator[];\n-135\n-_\b1_\b3_\b6 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk()\n-137 : _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw::Impl(&(static_cast&>\n-(*this)[0]),_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n-138 , _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw(static_cast::Impl&>(*this))\n-139 {}\n-140\n-141 private:\n-142\n-143 //FixedCapacityStack(const FixedCapacityStack&);\n-144 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk& operator=(const _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk&);\n+_\b1_\b1_\b7 const typename ProxiedNode::NodeStorage& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+118 {\n+119 return node().proxiedNode().nodeStorage();\n+120 }\n+121\n+122 };\n+123\n+125\n+130 template\n+_\b1_\b3_\b1 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+132 : public _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+133 {\n+134\n+135 typedef _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b<_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be;\n+136\n+137 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n+138\n+139 template\n+140 typename std::enable_if::type\n+141 node ()\n+142 {\n+143 return static_cast<_\bN_\bo_\bd_\be&>(*this);\n+144 }\n 145\n-146 };\n-147\n-149\n-150 } // namespace TypeTree\n-151} //namespace Dune\n+146 const _\bN_\bo_\bd_\be& node () const\n+147 {\n+148 return static_cast(*this);\n+149 }\n+150\n+151 public:\n 152\n-153#endif // DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n+155\n+157\n+160 template::type = 0>\n+_\b1_\b6_\b2 auto& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n+163 {\n+164 return node().proxiedNode().child(i);\n+165 }\n+166\n+168\n+_\b1_\b7_\b1 const auto& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n+172 {\n+173 return node().proxiedNode().child(i);\n+174 }\n+175\n+177\n+180 template::type = 0>\n+_\b1_\b8_\b2 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n+183 {\n+184 return node().proxiedNode().childStorage(i);\n+185 }\n+186\n+188\n+_\b1_\b9_\b4 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n+195 {\n+196 return node().proxiedNode().childStorage(i);\n+197 }\n+198\n+200 template\n+_\b2_\b0_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, ProxyChild&& _\bc_\bh_\bi_\bl_\bd, typename std::\n+enable_if::type = 0)\n+202 {\n+203 node().proxiedNode().setChild(i, std::forward(_\bc_\bh_\bi_\bl_\bd));\n+204 }\n+205\n+206 };\n+207\n+209 template\n+_\b2_\b1_\b0 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be;\n+211\n+213 template\n+_\b2_\b1_\b4 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be\n+215 {\n+216 };\n+217\n+219 template\n+_\b2_\b2_\b0 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n+221 : public _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+222 {\n+_\b2_\b2_\b3 typedef typename Node::ChildTypes _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n+_\b2_\b2_\b4 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+225 };\n+226\n+228 template\n+_\b2_\b2_\b9 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n+230 : public _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+231 {\n+_\b2_\b3_\b2 typedef typename Node::ChildType _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n+_\b2_\b3_\b3 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+234 };\n+235\n+237 template\n+_\b2_\b3_\b8 struct _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be<_\bN_\bo_\bd_\be,_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg>\n+239 : public _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+240 {\n+_\b2_\b4_\b1 typedef typename Node::ChildType _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n+_\b2_\b4_\b2 typedef typename Node::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+243 };\n+244\n+246\n+252 template\n+_\b2_\b5_\b3 class _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n+254 : public _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be>\n+255 {\n+256 static const bool proxiedNodeIsConst = std::is_const::type>::value;\n+257\n+258 template \n+259 using HasStaticDegree = index_constant;\n+260\n+261 template \n+_\b2_\b6_\b2 static constexpr bool hasStaticDegree = Std::is_detected::value;\n+263\n+264 // accessor mixins need to be friends for access to proxiedNode()\n+265 friend class _\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs;\n+266 friend class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs;\n+267\n+268 public:\n+269\n+_\b2_\b7_\b0 typedef Node _\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be;\n+271\n+_\b2_\b7_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bN_\bo_\bd_\be_\b> _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+273\n+_\b2_\b7_\b5 static const bool _\bi_\bs_\bL_\be_\ba_\bf = Node::isLeaf;\n+276\n+_\b2_\b7_\b8 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = Node::isPower;\n+279\n+_\b2_\b8_\b1 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = Node::isComposite;\n+282\n+283 template , int> = 0>\n+_\b2_\b8_\b5 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+286 {\n+287 return N::degree();\n+288 }\n+289\n+290 template , int> = 0>\n+_\b2_\b9_\b2 auto _\bd_\be_\bg_\br_\be_\be () const\n+293 {\n+294 return _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be().degree();\n+295 }\n+296\n+297\n+298 protected:\n+299\n+302\n+304 template\n+305 typename std::enable_if::type\n+_\b3_\b0_\b6 _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be ()\n+307 {\n+308 return *_node;\n+309 }\n+310\n+_\b3_\b1_\b2 const Node& _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be () const\n+313 {\n+314 return *_node;\n+315 }\n+316\n+318 template\n+319 typename std::enable_if >::type\n+_\b3_\b2_\b0 _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be ()\n+321 {\n+322 return _node;\n+323 }\n+324\n+_\b3_\b2_\b6 std::shared_ptr _\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+327 {\n+328 return _node;\n+329 }\n+330\n+332\n+335\n+_\b3_\b3_\b6 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be (Node& node)\n+337 : _node(stackobject_to_shared_ptr(node))\n+338 {}\n+339\n+_\b3_\b4_\b0 _\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be (std::shared_ptr node)\n+341 : _node(std::move(node))\n+342 {}\n+343\n+345\n+346 private:\n+347\n+348 std::shared_ptr _node;\n+349 };\n+350\n+352\n+353 } // namespace TypeTree\n+354} //namespace Dune\n+355\n+356#endif // DUNE_TYPETREE_PROXYNODE_HH\n+_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+typename std::decay_t< Node >::NodeTag NodeTag\n+Returns the node tag of the given Node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\be_\bm_\bp_\bt_\by\n-bool empty() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\bu_\bl_\bl\n-bool full() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-T & operator[](std::size_t k)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n-void pop_back()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bb_\ba_\bc_\bk\n-T & back()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by\n-std::size_t capacity() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-T & front()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-const T & front() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const T & operator[](std::size_t k) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-void push_back(const T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bb_\ba_\bc_\bk\n-const T & back() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bs_\bi_\bz_\be\n-std::size_t size() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n-FixedCapacityStackView(Impl &impl)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n-FixedCapacityStack()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a leaf node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node with runtime degree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a composite node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n+Base class for nodes acting as a proxy for an existing node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n+ProxyNode(Node &node)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:336\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Dune::TypeTree::NodeTag< Node > NodeTag\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:272\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+static const bool isLeaf\n+Mark this class as non leaf in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Mark this class as a non power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+auto degree() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:292\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n+std::enable_if< enabled, Node & >::type proxiedNode()\n+Returns the proxied node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< const Node > proxiedNodeStorage() const\n+Returns the storage of the proxied node (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n+Node ProxiedNode\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()\n+Returns the storage of the proxied node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static constexpr auto degree()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be\n+ProxyNode(std::shared_ptr< Node > node)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:340\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\b:_\b:_\bp_\br_\bo_\bx_\bi_\be_\bd_\bN_\bo_\bd_\be\n+const Node & proxiedNode() const\n+Returns the proxied node (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+Mixin class providing methods for child access with compile-time parameter.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+auto & child(index_constant< k >={})\n+Returns the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::\n+value, void * >::type=0)\n+Sets the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+const ProxiedNode::NodeStorage & nodeStorage() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(index_constant< k >={})\n+Returns the storage of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const auto & child(index_constant< k >={}) const\n+Returns the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(index_constant< k >={}) const\n+Returns the storage of the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+Access to the type and storage type of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs\n+Mixin class providing methods for child access with run-time parameter.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+auto & child(std::size_t i)\n+Returns the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(std::size_t i) const\n+Returns the storage of the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if<\n+enabled, void * >::type=0)\n+Sets the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const auto & child(std::size_t i) const\n+Returns the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bC_\bh_\bi_\bl_\bd_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bs_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(std::size_t i)\n+Returns the storage of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be\n+Tag-based dispatch to appropriate base class that provides necessary\n+functionality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:210\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+Node::NodeStorage NodeStorage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n+Node::ChildTypes ChildTypes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:223\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+Node::NodeStorage NodeStorage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n+Node::ChildType ChildType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+Node::NodeStorage NodeStorage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\br_\bo_\bx_\by_\bN_\bo_\bd_\be_\bB_\ba_\bs_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n+Node::ChildType ChildType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn proxynode.hh:241\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00026.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00026.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: compositenode.hh File Reference\n+dune-typetree: powernode.hh File Reference\n \n \n \n \n \n \n \n@@ -72,33 +72,37 @@\n
  • dune
  • typetree
  • \n
    \n
    \n
    \n \n-
    compositenode.hh File Reference
    \n+
    powernode.hh File Reference
    \n
    \n
    \n-
    #include <tuple>
    \n+
    #include <cassert>
    \n+#include <array>
    \n #include <memory>
    \n #include <type_traits>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/childextraction.hh>
    \n-#include <dune/typetree/typetraits.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/utility.hh>
    \n+#include <dune/typetree/childextraction.hh>
    \n+#include <dune/typetree/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::TypeTree::CompositeNode< Children >
     Base class for composite nodes based on variadic templates. More...
    class  Dune::TypeTree::PowerNode< T, k >
     Collect k instances of type T within a dune-typetree. More...
     
    struct  Dune::TypeTree::CompositeNode< Children >::Child< k >
     Access to the type and storage type of the i-th child. More...
    struct  Dune::TypeTree::PowerNode< T, k >::Child< i >
     Access to the type and storage type of the i-th child. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,31 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-compositenode.hh File Reference\n-#include \n+powernode.hh File Reference\n+#include \n+#include \n #include \n #include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n-\u00a0 Base class for composite nodes based on variadic templates. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b,_\b _\bk_\b _\b>\n+\u00a0 Collect k instances of type T within a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b,_\b _\bk_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bi_\b _\b>\n \u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00026_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00026_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: compositenode.hh Source File\n+dune-typetree: powernode.hh Source File\n \n \n \n \n \n \n \n@@ -74,267 +74,400 @@\n \n
    \n \n
    \n \n
    \n-
    compositenode.hh
    \n+
    powernode.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_COMPOSITENODE_HH
    \n-
    7#define DUNE_TYPETREE_COMPOSITENODE_HH
    \n+
    6#ifndef DUNE_TYPETREE_POWERNODE_HH
    \n+
    7#define DUNE_TYPETREE_POWERNODE_HH
    \n
    8
    \n-
    9#include <tuple>
    \n-
    10#include <memory>
    \n-
    11#include <type_traits>
    \n-
    12
    \n-\n-\n-\n+
    9#include <cassert>
    \n+
    10#include <array>
    \n+
    11#include <memory>
    \n+
    12#include <type_traits>
    \n+
    13
    \n+
    14#include <dune/common/typetraits.hh>
    \n+
    15#include <dune/common/std/type_traits.hh>
    \n
    16
    \n-
    17namespace Dune {
    \n-
    18 namespace TypeTree {
    \n-
    19
    \n-
    26 template<typename... Children>
    \n-
    \n-\n-
    28 {
    \n-
    29
    \n-
    30 public:
    \n-
    31
    \n-\n-
    34
    \n-
    36 typedef std::tuple<std::shared_ptr<Children>... > NodeStorage;
    \n-
    37
    \n-
    39 typedef std::tuple<Children...> ChildTypes;
    \n-
    40
    \n-
    42 static const bool isLeaf = false;
    \n-
    43
    \n-
    45 static const bool isPower = false;
    \n-
    46
    \n-
    48 static const bool isComposite = true;
    \n-
    49
    \n-
    \n-
    50 static constexpr auto degree ()
    \n-
    51 {
    \n-
    52 return std::integral_constant<std::size_t,sizeof...(Children)>{};
    \n-
    53 }
    \n-
    \n-
    54
    \n-
    56 template<std::size_t k>
    \n-
    \n-
    57 struct Child {
    \n+\n+\n+\n+\n+
    21
    \n+
    22namespace Dune {
    \n+
    23 namespace TypeTree {
    \n+
    24
    \n+
    31#ifndef DOXYGEN
    \n+
    32
    \n+
    34 template<typename PowerNode, typename T, std::size_t k>
    \n+
    35 struct AssertPowerNodeChildCount
    \n+
    36 : public std::enable_if<std::is_same<
    \n+
    37 typename PowerNode::ChildType,
    \n+
    38 T>::value &&
    \n+
    39 PowerNode::degree() == k,
    \n+
    40 T>
    \n+
    41 {};
    \n+
    42
    \n+
    43#endif
    \n+
    44
    \n+
    50 template<typename T, std::size_t k>
    \n+
    \n+\n+
    52 {
    \n+
    53
    \n+
    54 public:
    \n+
    55
    \n+
    57 static const bool isLeaf = false;
    \n
    58
    \n-
    59 static_assert((k < degree()), "child index out of range");
    \n-
    60
    \n-
    62 typedef typename std::tuple_element<k,ChildTypes>::type Type;
    \n-
    63
    \n-
    65 typedef typename std::tuple_element<k,ChildTypes>::type type;
    \n-
    66 };
    \n+
    60 static const bool isPower = true;
    \n+
    61
    \n+
    63 static const bool isComposite = false;
    \n+
    64
    \n+
    \n+
    65 static constexpr auto degree ()
    \n+
    66 {
    \n+
    67 return std::integral_constant<std::size_t,k>{};
    \n+
    68 }
    \n
    \n-
    67
    \n-
    70
    \n+
    69
    \n+\n
    72
    \n-
    75 template<std::size_t k>
    \n-
    \n-
    76 typename Child<k>::Type& child (index_constant<k> = {})
    \n-
    77 {
    \n-
    78 return *std::get<k>(_children);
    \n-
    79 }
    \n-
    \n-
    80
    \n-
    82
    \n-
    85 template<std::size_t k>
    \n-
    \n-
    86 const typename Child<k>::Type& child (index_constant<k> = {}) const
    \n-
    87 {
    \n-
    88 return *std::get<k>(_children);
    \n-
    89 }
    \n-
    \n-
    90
    \n-
    92
    \n-
    95 template<std::size_t k>
    \n-
    \n-
    96 std::shared_ptr<typename Child<k>::Type> childStorage (index_constant<k> = {})
    \n-
    97 {
    \n-
    98 return std::get<k>(_children);
    \n-
    99 }
    \n-
    \n-
    100
    \n-
    102
    \n-
    105 template<std::size_t k>
    \n-
    \n-
    106 std::shared_ptr<const typename Child<k>::Type> childStorage (index_constant<k> = {}) const
    \n-
    107 {
    \n-
    108 return std::get<k>(_children);
    \n-
    109 }
    \n-
    \n-
    110
    \n-
    112 template<std::size_t k>
    \n+
    74 typedef T ChildType;
    \n+
    75
    \n+
    77 typedef std::array<std::shared_ptr<T>,k> NodeStorage;
    \n+
    78
    \n+
    79
    \n+
    81 template<std::size_t i>
    \n+
    \n+
    82 struct Child
    \n+
    83 {
    \n+
    84
    \n+
    85 static_assert((i < degree()), "child index out of range");
    \n+
    86
    \n+
    88 typedef T Type;
    \n+
    89
    \n+
    91 typedef T type;
    \n+
    92 };
    \n+
    \n+
    93
    \n+
    96
    \n+
    98
    \n+
    101 template<std::size_t i>
    \n+
    \n+
    102 T& child (index_constant<i> = {})
    \n+
    103 {
    \n+
    104 static_assert((i < degree()), "child index out of range");
    \n+
    105 return *_children[i];
    \n+
    106 }
    \n+
    \n+
    107
    \n+
    109
    \n+
    112 template<std::size_t i>
    \n
    \n-
    113 void setChild (typename Child<k>::Type& child, index_constant<k> = {})
    \n+
    113 const T& child (index_constant<i> = {}) const
    \n
    114 {
    \n-
    115 std::get<k>(_children) = stackobject_to_shared_ptr(child);
    \n-
    116 }
    \n-
    \n-
    117
    \n-
    119 template<std::size_t k>
    \n-
    \n-
    120 void setChild (typename Child<k>::Type&& child, index_constant<k> = {})
    \n-
    121 {
    \n-
    122 std::get<k>(_children) = convert_arg(std::move(child));
    \n-
    123 }
    \n-
    \n-
    124
    \n-
    126 template<std::size_t k>
    \n-
    \n-
    127 void setChild (std::shared_ptr<typename Child<k>::Type> child, index_constant<k> = {})
    \n-
    128 {
    \n-
    129 std::get<k>(_children) = std::move(child);
    \n-
    130 }
    \n+
    115 static_assert((i < degree()), "child index out of range");
    \n+
    116 return *_children[i];
    \n+
    117 }
    \n+
    \n+
    118
    \n+
    120
    \n+
    123 template<std::size_t i>
    \n+
    \n+
    124 std::shared_ptr<T> childStorage (index_constant<i> = {})
    \n+
    125 {
    \n+
    126 static_assert((i < degree()), "child index out of range");
    \n+
    127 return _children[i];
    \n+
    128 }
    \n
    \n+
    129
    \n
    131
    \n-
    \n-
    132 const NodeStorage& nodeStorage () const
    \n-
    133 {
    \n-
    134 return _children;
    \n-
    135 }
    \n-
    \n-
    136
    \n-
    138
    \n-
    141
    \n-
    142 // The following two methods require a little bit of SFINAE trickery to work correctly:
    \n-
    143 // We have to make sure that they don't shadow the methods for direct child access because
    \n-
    144 // those get called by the generic child() machinery. If that machinery picks up the methods
    \n-
    145 // defined below, we have an infinite recursion.
    \n-
    146 // So the methods make sure that either
    \n-
    147 //
    \n-
    148 // * there are more than one argument. In that case, we got multiple indices and can forward
    \n-
    149 // to the general machine.
    \n-
    150 //
    \n-
    151 // * the first argument is not a valid flat index, i.e. either a std::size_t or an index_constant.
    \n-
    152 // The argument thus has to be some kind of TreePath instance that we can also pass to the
    \n-
    153 // generic machine.
    \n-
    154 //
    \n-
    155 // The above SFINAE logic works, but there is still a problem with the return type deduction.
    \n-
    156 // We have to do a lazy lookup of the return type after SFINAE has succeeded, otherwise the return
    \n-
    157 // type deduction will trigger the infinite recursion.
    \n-
    158
    \n-
    160
    \n-
    164#ifdef DOXYGEN
    \n-
    165 template<typename... Indices>
    \n-
    \n-
    166 ImplementationDefined& child (Indices... indices)
    \n-
    167#else
    \n-
    168 template<typename I0, typename... I,
    \n-
    169 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n-
    170 decltype(auto) child (I0 i0, I... i)
    \n-
    171#endif
    \n-
    172 {
    \n-
    173 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n-
    174 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n-
    175 );
    \n-
    176 return Dune::TypeTree::child(*this,i0,i...);
    \n-
    177 }
    \n+
    134 template<std::size_t i>
    \n+
    \n+
    135 std::shared_ptr<const T> childStorage (index_constant<i> = {}) const
    \n+
    136 {
    \n+
    137 static_assert((i < degree()), "child index out of range");
    \n+
    138 return _children[i];
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    142 template<std::size_t i>
    \n+
    \n+
    143 void setChild (T& t, index_constant<i> = {})
    \n+
    144 {
    \n+
    145 static_assert((i < degree()), "child index out of range");
    \n+
    146 _children[i] = stackobject_to_shared_ptr(t);
    \n+
    147 }
    \n+
    \n+
    148
    \n+
    150 template<std::size_t i>
    \n+
    \n+
    151 void setChild (T&& t, index_constant<i> = {})
    \n+
    152 {
    \n+
    153 static_assert((i < degree()), "child index out of range");
    \n+
    154 _children[i] = convert_arg(std::move(t));
    \n+
    155 }
    \n+
    \n+
    156
    \n+
    158 template<std::size_t i>
    \n+
    \n+
    159 void setChild (std::shared_ptr<T> st, index_constant<i> = {})
    \n+
    160 {
    \n+
    161 static_assert((i < degree()), "child index out of range");
    \n+
    162 _children[i] = std::move(st);
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    166
    \n+
    167
    \n+
    170
    \n+
    172
    \n+
    \n+
    175 T& child (std::size_t i)
    \n+
    176 {
    \n+
    177 assert(i < degree() && "child index out of range");
    \n+
    178 return *_children[i];
    \n+
    179 }
    \n
    \n-
    178
    \n
    180
    \n-
    184#ifdef DOXYGEN
    \n-
    185 template<typename... Indices>
    \n-
    \n-
    186 const ImplementationDefined& child (Indices... indices)
    \n-
    187#else
    \n-
    188 template<typename I0, typename... I,
    \n-
    189 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n-
    190 decltype(auto) child (I0 i0, I... i) const
    \n-
    191#endif
    \n-
    192 {
    \n-
    193 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n-
    194 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n-
    195 );
    \n-
    196 return Dune::TypeTree::child(*this,i0,i...);
    \n-
    197 }
    \n+
    182
    \n+
    \n+
    185 const T& child (std::size_t i) const
    \n+
    186 {
    \n+
    187 assert(i < degree() && "child index out of range");
    \n+
    188 return *_children[i];
    \n+
    189 }
    \n+
    \n+
    190
    \n+
    192
    \n+
    \n+
    195 std::shared_ptr<T> childStorage (std::size_t i)
    \n+
    196 {
    \n+
    197 assert(i < degree() && "child index out of range");
    \n+
    198 return _children[i];
    \n+
    199 }
    \n
    \n-
    198
    \n
    200
    \n-
    201 protected:
    \n
    202
    \n-
    205
    \n-
    207
    \n-
    \n-\n-
    215 {}
    \n+
    \n+
    205 std::shared_ptr<const T> childStorage (std::size_t i) const
    \n+
    206 {
    \n+
    207 assert(i < degree() && "child index out of range");
    \n+
    208 return _children[i];
    \n+
    209 }
    \n+
    \n+
    210
    \n+
    \n+
    212 void setChild (std::size_t i, T& t)
    \n+
    213 {
    \n+
    214 assert(i < degree() && "child index out of range");
    \n+
    215 _children[i] = stackobject_to_shared_ptr(t);
    \n+
    216 }
    \n
    \n-
    216
    \n-
    218 template<typename... Args, typename = typename std::enable_if<(sizeof...(Args) == degree())>::type>
    \n+
    217
    \n
    \n-
    219 CompositeNode (Args&&... args)
    \n-
    220 : _children(convert_arg(std::forward<Args>(args))...)
    \n-
    221 {}
    \n-
    \n-
    222
    \n-
    \n-
    224 CompositeNode (std::shared_ptr<Children>... children)
    \n-
    225 : _children(std::move(children)...)
    \n-
    226 {}
    \n-
    \n-
    227
    \n-
    \n-
    229 CompositeNode (const NodeStorage& children)
    \n-
    230 : _children(children)
    \n-
    231 {}
    \n-
    \n-
    232
    \n-
    234
    \n-
    235 private:
    \n-
    236 NodeStorage _children;
    \n-
    237 };
    \n+
    219 void setChild (std::size_t i, T&& t)
    \n+
    220 {
    \n+
    221 assert(i < degree() && "child index out of range");
    \n+
    222 _children[i] = convert_arg(std::move(t));
    \n+
    223 }
    \n+
    \n+
    224
    \n+
    \n+
    226 void setChild (std::size_t i, std::shared_ptr<T> st)
    \n+
    227 {
    \n+
    228 assert(i < degree() && "child index out of range");
    \n+
    229 _children[i] = std::move(st);
    \n+
    230 }
    \n+
    \n+
    231
    \n+
    \n+
    232 const NodeStorage& nodeStorage () const
    \n+
    233 {
    \n+
    234 return _children;
    \n+
    235 }
    \n
    \n+
    236
    \n
    238
    \n-
    240
    \n-
    241 } // namespace TypeTree
    \n-
    242} //namespace Dune
    \n-
    243
    \n-
    244#endif // DUNE_TYPETREE_COMPOSITENODE_HH
    \n-\n-\n-\n+
    241
    \n+
    242 // The following two methods require a little bit of SFINAE trickery to work correctly:
    \n+
    243 // We have to make sure that they don't shadow the methods for direct child access because
    \n+
    244 // those get called by the generic child() machinery. If that machinery picks up the methods
    \n+
    245 // defined below, we have an infinite recursion.
    \n+
    246 // So the methods make sure that either
    \n+
    247 //
    \n+
    248 // * there are more than one argument. In that case, we got multiple indices and can forward
    \n+
    249 // to the general machine.
    \n+
    250 //
    \n+
    251 // * the first argument is not a valid flat index, i.e. either a std::size_t or an index_constant.
    \n+
    252 // The argument thus has to be some kind of TreePath instance that we can also pass to the
    \n+
    253 // generic machine.
    \n+
    254 //
    \n+
    255 // The above SFINAE logic works, but there is still a problem with the return type deduction.
    \n+
    256 // We have to do a lazy lookup of the return type after SFINAE has succeeded, otherwise the return
    \n+
    257 // type deduction will trigger the infinite recursion.
    \n+
    258
    \n+
    260
    \n+
    264#ifdef DOXYGEN
    \n+
    265 template<typename... Indices>
    \n+
    \n+
    266 ImplementationDefined& child (Indices... indices)
    \n+
    267#else
    \n+
    268 template<typename I0, typename... I,
    \n+
    269 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n+
    270 decltype(auto) child (I0 i0, I... i)
    \n+
    271#endif
    \n+
    272 {
    \n+
    273 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n+
    274 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n+
    275 );
    \n+
    276 return Dune::TypeTree::child(*this,i0,i...);
    \n+
    277 }
    \n+
    \n+
    278
    \n+
    280
    \n+
    284#ifdef DOXYGEN
    \n+
    285 template<typename... Indices>
    \n+
    \n+
    286 const ImplementationDefined& child (Indices... indices)
    \n+
    287#else
    \n+
    288 template<typename I0, typename... I,
    \n+
    289 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n+
    290 decltype(auto) child (I0 i0, I... i) const
    \n+
    291#endif
    \n+
    292 {
    \n+
    293 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n+
    294 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n+
    295 );
    \n+
    296 return Dune::TypeTree::child(*this,i0,i...);
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    300
    \n+
    303
    \n+
    304 protected:
    \n+
    305
    \n+
    307
    \n+
    \n+\n+
    316 {}
    \n+
    \n+
    317
    \n+
    \n+
    319 explicit PowerNode (const NodeStorage& children)
    \n+
    320 : _children(children)
    \n+
    321 {}
    \n+
    \n+
    322
    \n+
    \n+
    324 explicit PowerNode (T& t, bool distinct_objects = true)
    \n+
    325 {
    \n+
    326 if (distinct_objects)
    \n+
    327 {
    \n+
    328 for (typename NodeStorage::iterator it = _children.begin(); it != _children.end(); ++it)
    \n+
    329 *it = std::make_shared<T>(t);
    \n+
    330 }
    \n+
    331 else
    \n+
    332 {
    \n+
    333 std::shared_ptr<T> sp = stackobject_to_shared_ptr(t);
    \n+
    334 std::fill(_children.begin(),_children.end(),sp);
    \n+
    335 }
    \n+
    336 }
    \n+
    \n+
    337
    \n+
    338#ifdef DOXYGEN
    \n+
    339
    \n+
    \n+
    341 PowerNode(T& t1, T& t2, ...)
    \n+
    342 {}
    \n+
    \n+
    343
    \n+
    344#else
    \n+
    345
    \n+
    346 template<typename... Children,
    \n+
    347 std::enable_if_t<
    \n+
    348 std::conjunction<std::is_same<ChildType, std::decay_t<Children>>...>::value
    \n+
    349 ,int> = 0>
    \n+
    350 PowerNode (Children&&... children)
    \n+
    351 {
    \n+
    352 static_assert(degree() == sizeof...(Children), "PowerNode constructor is called with incorrect number of children");
    \n+
    353 _children = NodeStorage{convert_arg(std::forward<Children>(children))...};
    \n+
    354 }
    \n+
    355
    \n+
    356 template<typename... Children,
    \n+
    357 std::enable_if_t<
    \n+
    358 std::conjunction<std::is_same<ChildType, Children>...>::value
    \n+
    359 ,int> = 0>
    \n+
    360 PowerNode (std::shared_ptr<Children>... children)
    \n+
    361 {
    \n+
    362 static_assert(degree() == sizeof...(Children), "PowerNode constructor is called with incorrect number of children");
    \n+
    363 _children = NodeStorage{children...};
    \n+
    364 }
    \n+
    365
    \n+
    366#endif // DOXYGEN
    \n+
    367
    \n+
    369
    \n+
    370 private:
    \n+
    371 NodeStorage _children;
    \n+
    372 };
    \n+
    \n+
    373
    \n+
    375
    \n+
    376 } // namespace TypeTree
    \n+
    377} //namespace Dune
    \n+
    378
    \n+
    379#endif // DUNE_TYPETREE_POWERNODE_HH
    \n+\n+\n+\n+\n
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n
    Definition accumulate_static.hh:16
    \n-
    Base class for composite nodes based on variadic templates.
    Definition compositenode.hh:28
    \n-
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition compositenode.hh:42
    \n-
    ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition compositenode.hh:166
    \n-
    static const bool isComposite
    Mark this class as a composite in the dune-typetree.
    Definition compositenode.hh:48
    \n-
    CompositeNode()
    Default constructor.
    Definition compositenode.hh:214
    \n-
    CompositeNodeTag NodeTag
    The type tag that describes a CompositeNode.
    Definition compositenode.hh:33
    \n-
    void setChild(typename Child< k >::Type &child, index_constant< k >={})
    Sets the k-th child to the passed-in value.
    Definition compositenode.hh:113
    \n-
    void setChild(typename Child< k >::Type &&child, index_constant< k >={})
    Store the passed value in k-th child.
    Definition compositenode.hh:120
    \n-
    static constexpr auto degree()
    Definition compositenode.hh:50
    \n-
    const NodeStorage & nodeStorage() const
    Definition compositenode.hh:132
    \n-
    CompositeNode(std::shared_ptr< Children >... children)
    Initialize the CompositeNode with copies of the passed in Storage objects.
    Definition compositenode.hh:224
    \n-
    std::shared_ptr< typename Child< k >::Type > childStorage(index_constant< k >={})
    Returns the storage of the k-th child.
    Definition compositenode.hh:96
    \n-
    std::tuple< Children... > ChildTypes
    A tuple storing the types of all children.
    Definition compositenode.hh:39
    \n-
    void setChild(std::shared_ptr< typename Child< k >::Type > child, index_constant< k >={})
    Sets the storage of the k-th child to the passed-in value.
    Definition compositenode.hh:127
    \n-
    const ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition compositenode.hh:186
    \n-
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition compositenode.hh:45
    \n-
    std::shared_ptr< const typename Child< k >::Type > childStorage(index_constant< k >={}) const
    Returns the storage of the k-th child (const version).
    Definition compositenode.hh:106
    \n-
    Child< k >::Type & child(index_constant< k >={})
    Returns the k-th child.
    Definition compositenode.hh:76
    \n-
    CompositeNode(const NodeStorage &children)
    Initialize the CompositeNode with a copy of the passed-in storage type.
    Definition compositenode.hh:229
    \n-
    std::tuple< std::shared_ptr< Children >... > NodeStorage
    The type used for storing the children.
    Definition compositenode.hh:36
    \n-
    const Child< k >::Type & child(index_constant< k >={}) const
    Returns the k-th child (const version).
    Definition compositenode.hh:86
    \n-
    Access to the type and storage type of the i-th child.
    Definition compositenode.hh:57
    \n-
    std::tuple_element< k, ChildTypes >::type Type
    The type of the child.
    Definition compositenode.hh:62
    \n-
    std::tuple_element< k, ChildTypes >::type type
    The type of the child.
    Definition compositenode.hh:65
    \n-
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n+
    Tag designating a power node.
    Definition nodetags.hh:21
    \n+
    Collect k instances of type T within a dune-typetree.
    Definition powernode.hh:52
    \n+
    void setChild(T &t, index_constant< i >={})
    Sets the i-th child to the passed-in value.
    Definition powernode.hh:143
    \n+
    T & child(std::size_t i)
    Returns the i-th child.
    Definition powernode.hh:175
    \n+
    const T & child(index_constant< i >={}) const
    Returns the i-th child (const version).
    Definition powernode.hh:113
    \n+
    void setChild(std::shared_ptr< T > st, index_constant< i >={})
    Sets the stored value representing the i-th child to the passed-in value.
    Definition powernode.hh:159
    \n+
    std::shared_ptr< T > childStorage(index_constant< i >={})
    Returns the storage of the i-th child.
    Definition powernode.hh:124
    \n+
    PowerNode(T &t1, T &t2,...)
    Initialize all children with the passed-in objects.
    Definition powernode.hh:341
    \n+
    const NodeStorage & nodeStorage() const
    Definition powernode.hh:232
    \n+
    std::array< std::shared_ptr< T >, k > NodeStorage
    The type used for storing the children.
    Definition powernode.hh:77
    \n+
    std::shared_ptr< const T > childStorage(index_constant< i >={}) const
    Returns the storage of the i-th child (const version).
    Definition powernode.hh:135
    \n+
    PowerNode(T &t, bool distinct_objects=true)
    Initialize all children with copies of a storage object constructed from the parameter t.
    Definition powernode.hh:324
    \n+
    PowerNodeTag NodeTag
    The type tag that describes a PowerNode.
    Definition powernode.hh:71
    \n+
    const T & child(std::size_t i) const
    Returns the i-th child (const version).
    Definition powernode.hh:185
    \n+
    static constexpr auto degree()
    Definition powernode.hh:65
    \n+
    std::shared_ptr< const T > childStorage(std::size_t i) const
    Returns the storage of the i-th child (const version).
    Definition powernode.hh:205
    \n+
    void setChild(std::size_t i, std::shared_ptr< T > st)
    Sets the stored value representing the i-th child to the passed-in value.
    Definition powernode.hh:226
    \n+
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition powernode.hh:63
    \n+
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition powernode.hh:57
    \n+
    static const bool isPower
    Mark this class as a power in the dune-typetree.
    Definition powernode.hh:60
    \n+
    PowerNode(const NodeStorage &children)
    Initialize the PowerNode with a copy of the passed-in storage type.
    Definition powernode.hh:319
    \n+
    T ChildType
    The type of each child.
    Definition powernode.hh:74
    \n+
    T & child(index_constant< i >={})
    Returns the i-th child.
    Definition powernode.hh:102
    \n+
    ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition powernode.hh:266
    \n+
    void setChild(std::size_t i, T &&t)
    Store the passed value in i-th child.
    Definition powernode.hh:219
    \n+
    void setChild(T &&t, index_constant< i >={})
    Store the passed value in i-th child.
    Definition powernode.hh:151
    \n+
    PowerNode()
    Default constructor.
    Definition powernode.hh:315
    \n+
    const ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition powernode.hh:286
    \n+
    void setChild(std::size_t i, T &t)
    Sets the i-th child to the passed-in value.
    Definition powernode.hh:212
    \n+
    std::shared_ptr< T > childStorage(std::size_t i)
    Returns the storage of the i-th child.
    Definition powernode.hh:195
    \n+
    Access to the type and storage type of the i-th child.
    Definition powernode.hh:83
    \n+
    T type
    The type of the child.
    Definition powernode.hh:91
    \n+
    T Type
    The type of the child.
    Definition powernode.hh:88
    \n
    Check if type represents a tree path.
    Definition typetraits.hh:184
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,323 +1,463 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-compositenode.hh\n+powernode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_COMPOSITENODE_HH\n-7#define DUNE_TYPETREE_COMPOSITENODE_HH\n+6#ifndef DUNE_TYPETREE_POWERNODE_HH\n+7#define DUNE_TYPETREE_POWERNODE_HH\n 8\n-9#include \n-10#include \n-11#include \n-12\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15#include \n 16\n-17namespace _\bD_\bu_\bn_\be {\n-18 namespace TypeTree {\n-19\n-26 template\n-_\b2_\b7 class _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-28 {\n-29\n-30 public:\n-31\n-_\b3_\b3 typedef _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-34\n-_\b3_\b6 typedef std::tuple... > _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-37\n-_\b3_\b9 typedef std::tuple _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n-40\n-_\b4_\b2 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n-43\n-_\b4_\b5 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n-46\n-_\b4_\b8 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = true;\n-49\n-_\b5_\b0 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n-51 {\n-52 return std::integral_constant{};\n-53 }\n-54\n-56 template\n-_\b5_\b7 struct _\bC_\bh_\bi_\bl_\bd {\n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+21\n+22namespace _\bD_\bu_\bn_\be {\n+23 namespace TypeTree {\n+24\n+31#ifndef DOXYGEN\n+32\n+34 template\n+35 struct AssertPowerNodeChildCount\n+36 : public std::enable_if::value &&\n+39 PowerNode::degree() == k,\n+40 T>\n+41 {};\n+42\n+43#endif\n+44\n+50 template\n+_\b5_\b1 class _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+52 {\n+53\n+54 public:\n+55\n+_\b5_\b7 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n 58\n-59 static_assert((k < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-60\n-_\b6_\b2 typedef typename std::tuple_element::type _\bT_\by_\bp_\be;\n-63\n-_\b6_\b5 typedef typename std::tuple_element::type _\bt_\by_\bp_\be;\n-66 };\n-67\n-70\n+_\b6_\b0 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = true;\n+61\n+_\b6_\b3 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n+64\n+_\b6_\b5 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+66 {\n+67 return std::integral_constant{};\n+68 }\n+69\n+_\b7_\b1 typedef _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n 72\n-75 template\n-_\b7_\b6 typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n-77 {\n-78 return *std::get(_children);\n-79 }\n-80\n-82\n-85 template\n-_\b8_\b6 const typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n-87 {\n-88 return *std::get(_children);\n-89 }\n-90\n-92\n-95 template\n-_\b9_\b6 std::shared_ptr::Type> _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant =\n-{})\n-97 {\n-98 return std::get(_children);\n-99 }\n-100\n-102\n-105 template\n-_\b1_\b0_\b6 std::shared_ptr::Type> _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-(index_constant = {}) const\n-107 {\n-108 return std::get(_children);\n-109 }\n-110\n-112 template\n-_\b1_\b1_\b3 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd, index_constant = {})\n+_\b7_\b4 typedef T _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n+75\n+_\b7_\b7 typedef std::array,k> _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+78\n+79\n+81 template\n+_\b8_\b2 struct _\bC_\bh_\bi_\bl_\bd\n+83 {\n+84\n+85 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+86\n+_\b8_\b8 typedef T _\bT_\by_\bp_\be;\n+89\n+_\b9_\b1 typedef T _\bt_\by_\bp_\be;\n+92 };\n+93\n+96\n+98\n+101 template\n+_\b1_\b0_\b2 T& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n+103 {\n+104 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+105 return *_children[i];\n+106 }\n+107\n+109\n+112 template\n+_\b1_\b1_\b3 const T& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n 114 {\n-115 std::get(_children) = stackobject_to_shared_ptr(_\bc_\bh_\bi_\bl_\bd);\n-116 }\n-117\n-119 template\n-_\b1_\b2_\b0 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be&& _\bc_\bh_\bi_\bl_\bd, index_constant = {})\n-121 {\n-122 std::get(_children) = convert_arg(std::move(_\bc_\bh_\bi_\bl_\bd));\n-123 }\n-124\n-126 template\n-_\b1_\b2_\b7 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::shared_ptr_\b:_\b:_\bT_\by_\bp_\be> _\bc_\bh_\bi_\bl_\bd,\n-index_constant = {})\n-128 {\n-129 std::get(_children) = std::move(_\bc_\bh_\bi_\bl_\bd);\n-130 }\n+115 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+116 return *_children[i];\n+117 }\n+118\n+120\n+123 template\n+_\b1_\b2_\b4 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n+125 {\n+126 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+127 return _children[i];\n+128 }\n+129\n 131\n-_\b1_\b3_\b2 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-133 {\n-134 return _children;\n-135 }\n-136\n-138\n-141\n-142 // The following two methods require a little bit of SFINAE trickery to\n+134 template\n+_\b1_\b3_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n+136 {\n+137 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+138 return _children[i];\n+139 }\n+140\n+142 template\n+_\b1_\b4_\b3 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (T& t, index_constant = {})\n+144 {\n+145 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+146 _children[i] = stackobject_to_shared_ptr(t);\n+147 }\n+148\n+150 template\n+_\b1_\b5_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (T&& t, index_constant = {})\n+152 {\n+153 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+154 _children[i] = convert_arg(std::move(t));\n+155 }\n+156\n+158 template\n+_\b1_\b5_\b9 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::shared_ptr st, index_constant = {})\n+160 {\n+161 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+162 _children[i] = std::move(st);\n+163 }\n+164\n+166\n+167\n+170\n+172\n+_\b1_\b7_\b5 T& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n+176 {\n+177 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+178 return *_children[i];\n+179 }\n+180\n+182\n+_\b1_\b8_\b5 const T& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n+186 {\n+187 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+188 return *_children[i];\n+189 }\n+190\n+192\n+_\b1_\b9_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n+196 {\n+197 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+198 return _children[i];\n+199 }\n+200\n+202\n+_\b2_\b0_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n+206 {\n+207 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+208 return _children[i];\n+209 }\n+210\n+_\b2_\b1_\b2 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, T& t)\n+213 {\n+214 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+215 _children[i] = stackobject_to_shared_ptr(t);\n+216 }\n+217\n+_\b2_\b1_\b9 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, T&& t)\n+220 {\n+221 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+222 _children[i] = convert_arg(std::move(t));\n+223 }\n+224\n+_\b2_\b2_\b6 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, std::shared_ptr st)\n+227 {\n+228 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+229 _children[i] = std::move(st);\n+230 }\n+231\n+_\b2_\b3_\b2 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+233 {\n+234 return _children;\n+235 }\n+236\n+238\n+241\n+242 // The following two methods require a little bit of SFINAE trickery to\n work correctly:\n-143 // We have to make sure that they don't shadow the methods for direct child\n+243 // We have to make sure that they don't shadow the methods for direct child\n access because\n-144 // those get called by the generic child() machinery. If that machinery\n+244 // those get called by the generic child() machinery. If that machinery\n picks up the methods\n-145 // defined below, we have an infinite recursion.\n-146 // So the methods make sure that either\n-147 //\n-148 // * there are more than one argument. In that case, we got multiple\n+245 // defined below, we have an infinite recursion.\n+246 // So the methods make sure that either\n+247 //\n+248 // * there are more than one argument. In that case, we got multiple\n indices and can forward\n-149 // to the general machine.\n-150 //\n-151 // * the first argument is not a valid flat index, i.e. either a std::\n+249 // to the general machine.\n+250 //\n+251 // * the first argument is not a valid flat index, i.e. either a std::\n size_t or an index_constant.\n-152 // The argument thus has to be some kind of TreePath instance that we can\n+252 // The argument thus has to be some kind of TreePath instance that we can\n also pass to the\n-153 // generic machine.\n-154 //\n-155 // The above SFINAE logic works, but there is still a problem with the\n+253 // generic machine.\n+254 //\n+255 // The above SFINAE logic works, but there is still a problem with the\n return type deduction.\n-156 // We have to do a lazy lookup of the return type after SFINAE has\n+256 // We have to do a lazy lookup of the return type after SFINAE has\n succeeded, otherwise the return\n-157 // type deduction will trigger the infinite recursion.\n-158\n-160\n-164#ifdef DOXYGEN\n-165 template\n-_\b1_\b6_\b6 ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n-167#else\n-168 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n-170 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i)\n-171#endif\n-172 {\n-173 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n-174 \"You cannot use the member function child() with an empty TreePath, use the\n+257 // type deduction will trigger the infinite recursion.\n+258\n+260\n+264#ifdef DOXYGEN\n+265 template\n+_\b2_\b6_\b6 ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n+267#else\n+268 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n+270 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i)\n+271#endif\n+272 {\n+273 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n+274 \"You cannot use the member function child() with an empty TreePath, use the\n freestanding version child(node,treePath) instead.\"\n-175 );\n-176 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n-177 }\n-178\n-180\n-184#ifdef DOXYGEN\n-185 template\n-_\b1_\b8_\b6 const ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n-187#else\n-188 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n-190 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i) const\n-191#endif\n-192 {\n-193 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n-194 \"You cannot use the member function child() with an empty TreePath, use the\n+275 );\n+276 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n+277 }\n+278\n+280\n+284#ifdef DOXYGEN\n+285 template\n+_\b2_\b8_\b6 const ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n+287#else\n+288 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n+290 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i) const\n+291#endif\n+292 {\n+293 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n+294 \"You cannot use the member function child() with an empty TreePath, use the\n freestanding version child(node,treePath) instead.\"\n-195 );\n-196 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n-197 }\n-198\n-200\n-201 protected:\n-202\n-205\n-207\n-_\b2_\b1_\b4 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be ()\n-215 {}\n-216\n-218 template::type>\n-_\b2_\b1_\b9 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (Args&&... args)\n-220 : _children(convert_arg(std::forward(args))...)\n-221 {}\n-222\n-_\b2_\b2_\b4 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (std::shared_ptr... children)\n-225 : _children(std::move(children)...)\n-226 {}\n-227\n-_\b2_\b2_\b9 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& children)\n-230 : _children(children)\n-231 {}\n-232\n-234\n-235 private:\n-236 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n-237 };\n-238\n-240\n-241 } // namespace TypeTree\n-242} //namespace Dune\n-243\n-244#endif // DUNE_TYPETREE_COMPOSITENODE_HH\n+295 );\n+296 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n+297 }\n+298\n+300\n+303\n+304 protected:\n+305\n+307\n+_\b3_\b1_\b5 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be ()\n+316 {}\n+317\n+_\b3_\b1_\b9 explicit _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& children)\n+320 : _children(children)\n+321 {}\n+322\n+_\b3_\b2_\b4 explicit _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (T& t, bool distinct_objects = true)\n+325 {\n+326 if (distinct_objects)\n+327 {\n+328 for (typename NodeStorage::iterator it = _children.begin(); it !=\n+_children.end(); ++it)\n+329 *it = std::make_shared(t);\n+330 }\n+331 else\n+332 {\n+333 std::shared_ptr sp = stackobject_to_shared_ptr(t);\n+334 std::fill(_children.begin(),_children.end(),sp);\n+335 }\n+336 }\n+337\n+338#ifdef DOXYGEN\n+339\n+_\b3_\b4_\b1 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be(T& t1, T& t2, ...)\n+342 {}\n+343\n+344#else\n+345\n+346 template>...>::value\n+349 ,int> = 0>\n+350 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (Children&&... children)\n+351 {\n+352 static_assert(_\bd_\be_\bg_\br_\be_\be() == sizeof...(Children), \"PowerNode constructor is\n+called with incorrect number of children\");\n+353 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{convert_arg(std::forward(children))...};\n+354 }\n+355\n+356 template...>::value\n+359 ,int> = 0>\n+360 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::shared_ptr... children)\n+361 {\n+362 static_assert(_\bd_\be_\bg_\br_\be_\be() == sizeof...(Children), \"PowerNode constructor is\n+called with incorrect number of children\");\n+363 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{children...};\n+364 }\n+365\n+366#endif // DOXYGEN\n+367\n+369\n+370 private:\n+371 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n+372 };\n+373\n+375\n+376 } // namespace TypeTree\n+377} //namespace Dune\n+378\n+379#endif // DUNE_TYPETREE_POWERNODE_HH\n _\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n ImplementationDefined child(Node &&node, Indices... indices)\n Extracts the child of a node given by a sequence of compile-time and run-time\n indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-Base class for composite nodes based on variadic templates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+Collect k instances of type T within a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(T &t, index_constant< i >={})\n+Sets the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+T & child(std::size_t i)\n+Returns the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const T & child(index_constant< i >={}) const\n+Returns the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::shared_ptr< T > st, index_constant< i >={})\n+Sets the stored value representing the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< T > childStorage(index_constant< i >={})\n+Returns the storage of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+PowerNode(T &t1, T &t2,...)\n+Initialize all children with the passed-in objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:341\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+const NodeStorage & nodeStorage() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::array< std::shared_ptr< T >, k > NodeStorage\n+The type used for storing the children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< const T > childStorage(index_constant< i >={}) const\n+Returns the storage of the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+PowerNode(T &t, bool distinct_objects=true)\n+Initialize all children with copies of a storage object constructed from the\n+parameter t.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+PowerNodeTag NodeTag\n+The type tag that describes a PowerNode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const T & child(std::size_t i) const\n+Returns the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static constexpr auto degree()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< const T > childStorage(std::size_t i) const\n+Returns the storage of the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, std::shared_ptr< T > st)\n+Sets the stored value representing the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a non composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n static const bool isLeaf\n Mark this class as non leaf in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Mark this class as a power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+PowerNode(const NodeStorage &children)\n+Initialize the PowerNode with a copy of the passed-in storage type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n+T ChildType\n+The type of each child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+T & child(index_constant< i >={})\n+Returns the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n ImplementationDefined & child(Indices... indices)\n Returns the child given by the list of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-CompositeNode()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, T &&t)\n+Store the passed value in i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(T &&t, index_constant< i >={})\n+Store the passed value in i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+PowerNode()\n Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-CompositeNodeTag NodeTag\n-The type tag that describes a CompositeNode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(typename Child< k >::Type &child, index_constant< k >={})\n-Sets the k-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(typename Child< k >::Type &&child, index_constant< k >={})\n-Store the passed value in k-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static constexpr auto degree()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-const NodeStorage & nodeStorage() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-CompositeNode(std::shared_ptr< Children >... children)\n-Initialize the CompositeNode with copies of the passed in Storage objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< typename Child< k >::Type > childStorage(index_constant< k >=\n-{})\n-Returns the storage of the k-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n-std::tuple< Children... > ChildTypes\n-A tuple storing the types of all children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::shared_ptr< typename Child< k >::Type > child,\n-index_constant< k >={})\n-Sets the storage of the k-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n const ImplementationDefined & child(Indices... indices)\n Returns the child given by the list of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Mark this class as a non power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< const typename Child< k >::Type > childStorage(index_constant<\n-k >={}) const\n-Returns the storage of the k-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-Child< k >::Type & child(index_constant< k >={})\n-Returns the k-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-CompositeNode(const NodeStorage &children)\n-Initialize the CompositeNode with a copy of the passed-in storage type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::tuple< std::shared_ptr< Children >... > NodeStorage\n-The type used for storing the children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const Child< k >::Type & child(index_constant< k >={}) const\n-Returns the k-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:286\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, T &t)\n+Sets the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< T > childStorage(std::size_t i)\n+Returns the storage of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:195\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n Access to the type and storage type of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n-std::tuple_element< k, ChildTypes >::type Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n+T type\n The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n-std::tuple_element< k, ChildTypes >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n+T Type\n The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a composite node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:88\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n Check if type represents a tree path.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:184\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00029.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00029.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: nodeinterface.hh File Reference\n+dune-typetree: simpletransformationdescriptors.hh File Reference\n \n \n \n \n \n \n \n@@ -71,60 +71,49 @@\n \n
    \n
    \n
    \n \n-
    nodeinterface.hh File Reference
    \n+Namespaces
    \n+
    simpletransformationdescriptors.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n-#include <type_traits>
    \n-#include <dune/common/documentation.hh>
    \n+
    #include <array>
    \n+#include <memory>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::NodeInterface
     Interface for nodes in a dune-typetree. More...
    struct  Dune::TypeTree::SimpleLeafNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
     
    \n \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Typedefs

    template<typename Node >
    using Dune::TypeTree::NodeTag = typename std::decay_t< Node >::NodeTag
     Returns the node tag of the given Node.
     
    template<typename T >
    using Dune::TypeTree::ImplementationTag = typename std::decay_t< T >::ImplementationTag
     Returns the implementation tag of the given Node.
     
    template<typename Node >
    using Dune::TypeTree::StaticDegree = decltype(Node::degree())
     Returns the statically known degree of the given Node type as a std::integral_constant.
     
    \n-\n-\n-\n-\n-\n

    \n-Functions

    template<typename Node >
    std::size_t Dune::TypeTree::degree (const Node &node)
     Returns the degree of node as run time information.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,43 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-nodeinterface.hh File Reference\n-#include \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+simpletransformationdescriptors.hh File Reference\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-\u00a0 Interface for nodes in a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg = typename std::decay_t< Node >::NodeTag\n-\u00a0 Returns the node tag of the given Node.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg = typename std::decay_t< T >::\n- ImplementationTag\n-\u00a0 Returns the implementation tag of the given Node.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be = decltype(Node::degree())\n-\u00a0 Returns the statically known degree of the given Node type as a std::\n- integral_constant.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be (const Node &node)\n-\u00a0 Returns the degree of node as run time information.\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00029_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00029_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: nodeinterface.hh Source File\n+dune-typetree: simpletransformationdescriptors.hh Source File\n \n \n \n \n \n \n \n@@ -74,100 +74,209 @@\n \n
    \n \n
    \n
    \n
    \n-
    nodeinterface.hh
    \n+
    simpletransformationdescriptors.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=8 sw=2 sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_NODEINTERFACE_HH
    \n-
    7#define DUNE_TYPETREE_NODEINTERFACE_HH
    \n+
    6#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n+
    7#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n
    8
    \n-
    9#include <cstddef>
    \n-
    10#include <type_traits>
    \n+
    9#include <array>
    \n+
    10#include <memory>
    \n
    11
    \n-
    12#include <dune/common/documentation.hh>
    \n-
    13
    \n-
    14namespace Dune {
    \n-
    15 namespace TypeTree {
    \n+\n+\n+
    14#include <dune/common/exceptions.hh>
    \n+
    15
    \n
    16
    \n-
    \n-\n-
    35 {
    \n-
    37 static const bool isLeaf = implementationDefined;
    \n+
    17namespace Dune {
    \n+
    18 namespace TypeTree {
    \n+
    19
    \n+
    25 template<typename SourceNode, typename Transformation, typename TransformedNode>
    \n+
    \n+\n+
    27 {
    \n+
    28
    \n+
    29 static const bool recursive = false;
    \n+
    30
    \n+
    31 typedef TransformedNode transformed_type;
    \n+
    32 typedef std::shared_ptr<transformed_type> transformed_storage_type;
    \n+
    33
    \n+
    \n+
    34 static transformed_type transform(const SourceNode& s, const Transformation& t)
    \n+
    35 {
    \n+
    36 return transformed_type();
    \n+
    37 }
    \n+
    \n
    38
    \n-
    40 static const bool isPower = implementationDefined;
    \n-
    41
    \n-
    43 static const bool isComposite = implementationDefined;
    \n-
    44
    \n+
    \n+
    39 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n+
    40 {
    \n+
    41 return std::make_shared<transformed_type>();
    \n+
    42 }
    \n+
    \n+
    43
    \n+
    44 };
    \n+
    \n+
    45
    \n
    46
    \n-
    51 static auto degree();
    \n+
    47 template<typename SourceNode, typename Transformation, template<typename Child, std::size_t> class TransformedNode>
    \n+
    \n+\n+
    49 {
    \n+
    50
    \n+
    51 static const bool recursive = true;
    \n
    52
    \n-
    54
    \n-
    59 typedef ImplementationDefined NodeTag;
    \n+
    53 template<typename TC>
    \n+
    \n+
    54 struct result
    \n+
    55 {
    \n+
    56 typedef TransformedNode<TC, StaticDegree<SourceNode>::value> type;
    \n+
    57 typedef std::shared_ptr<type> storage_type;
    \n+
    58 static const std::size_t degree = StaticDegree<type>::value;
    \n+
    59 };
    \n+
    \n
    60
    \n-
    62
    \n-
    65 typedef ImplementationDefined NodeStorage;
    \n-
    66 };
    \n-
    \n-
    67
    \n-
    69 template<typename Node>
    \n-
    70 using NodeTag = typename std::decay_t<Node>::NodeTag;
    \n-
    71
    \n-
    73 template<typename T>
    \n-
    74 using ImplementationTag = typename std::decay_t<T>::ImplementationTag;
    \n+
    61 template<typename TC>
    \n+
    \n+
    62 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n+
    63 {
    \n+
    64 return typename result<TC>::type(children);
    \n+
    65 }
    \n+
    \n+
    66
    \n+
    67 template<typename TC>
    \n+
    \n+
    68 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n+
    69 {
    \n+
    70 return std::make_shared<typename result<TC>::type>(children);
    \n+
    71 }
    \n+
    \n+
    72
    \n+
    73 };
    \n+
    \n+
    74
    \n
    75
    \n-
    76
    \n-
    78 template<typename Node>
    \n-
    \n-
    79 std::size_t degree(const Node& node)
    \n-
    80 {
    \n-
    81 return degree(&node,NodeTag<Node>());
    \n-
    82 }
    \n-
    \n-
    83
    \n-
    84#ifndef DOXYGEN
    \n-
    85
    \n-
    87
    \n-
    93 template<typename Node, typename NodeTag>
    \n-
    94 std::size_t degree(const Node* node, NodeTag)
    \n-
    95 {
    \n-
    96 return node->degree();
    \n-
    97 }
    \n-
    98
    \n-
    99#endif // DOXYGEN
    \n+
    76 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNode>
    \n+
    \n+\n+
    78 {
    \n+
    79
    \n+
    80 static const bool recursive = true;
    \n+
    81
    \n+
    82 template<typename TC>
    \n+
    \n+
    83 struct result
    \n+
    84 {
    \n+
    85 typedef TransformedNode<TC> type;
    \n+
    86 typedef std::shared_ptr<type> storage_type;
    \n+
    87 };
    \n+
    \n+
    88
    \n+
    89 template<typename TC>
    \n+
    \n+
    90 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n+
    91 {
    \n+
    92 return typename result<TC>::type(children);
    \n+
    93 }
    \n+
    \n+
    94
    \n+
    95 template<typename TC>
    \n+
    \n+
    96 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n+
    97 {
    \n+
    98 return std::make_shared<typename result<TC>::type>(children);
    \n+
    99 }
    \n+
    \n
    100
    \n+
    101 };
    \n+
    \n
    102
    \n-
    106 template<typename Node>
    \n-
    107 using StaticDegree = decltype(Node::degree());
    \n-
    108
    \n-
    110
    \n-
    111 } // namespace TypeTree
    \n-
    112} //namespace Dune
    \n-
    113
    \n-
    114#endif // DUNE_TYPETREE_NODEINTERFACE_HH
    \n-
    std::size_t degree(const Node &node)
    Returns the degree of node as run time information.
    Definition nodeinterface.hh:79
    \n-
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n-
    typename std::decay_t< T >::ImplementationTag ImplementationTag
    Returns the implementation tag of the given Node.
    Definition nodeinterface.hh:74
    \n+
    103
    \n+
    104 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNode>
    \n+
    \n+\n+
    106 {
    \n+
    107
    \n+
    108 static const bool recursive = true;
    \n+
    109
    \n+
    110 template<typename... TC>
    \n+
    \n+
    111 struct result
    \n+
    112 {
    \n+
    113 typedef TransformedNode<TC...> type;
    \n+
    114 typedef std::shared_ptr<type> storage_type;
    \n+
    115 };
    \n+
    \n+
    116
    \n+
    117 template<typename... TC>
    \n+
    \n+
    118 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
    \n+
    119 {
    \n+
    120 return typename result<TC...>::type(children...);
    \n+
    121 }
    \n+
    \n+
    122
    \n+
    123 template<typename... TC>
    \n+
    \n+
    124 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n+
    125 {
    \n+
    126 return std::make_shared<typename result<TC...>::type>(children...);
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    129 };
    \n+
    \n+
    130
    \n+
    132
    \n+
    133 } // namespace TypeTree
    \n+
    134} //namespace Dune
    \n+
    135
    \n+
    136#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n+\n+\n
    decltype(Node::degree()) StaticDegree
    Returns the statically known degree of the given Node type as a std::integral_constant.
    Definition nodeinterface.hh:107
    \n
    Definition accumulate_static.hh:16
    \n-
    Interface for nodes in a dune-typetree.
    Definition nodeinterface.hh:35
    \n-
    static auto degree()
    Number of children of this node in the dune-typetree.
    \n-
    static const bool isPower
    Whether this is a power node in the dune-typetree.
    Definition nodeinterface.hh:40
    \n-
    static const bool isLeaf
    Whether this is a leaf node in a dune-typetree.
    Definition nodeinterface.hh:37
    \n-
    ImplementationDefined NodeStorage
    container type to pass around a collection of children
    Definition nodeinterface.hh:65
    \n-
    static const bool isComposite
    Whether this is a composite node in the dune-typetree.
    Definition nodeinterface.hh:43
    \n-
    ImplementationDefined NodeTag
    The type tag that describes what kind of node this is.
    Definition nodeinterface.hh:59
    \n+
    Definition simpletransformationdescriptors.hh:27
    \n+
    static transformed_type transform(const SourceNode &s, const Transformation &t)
    Definition simpletransformationdescriptors.hh:34
    \n+
    static const bool recursive
    Definition simpletransformationdescriptors.hh:29
    \n+
    std::shared_ptr< transformed_type > transformed_storage_type
    Definition simpletransformationdescriptors.hh:32
    \n+
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition simpletransformationdescriptors.hh:39
    \n+
    TransformedNode transformed_type
    Definition simpletransformationdescriptors.hh:31
    \n+
    Definition simpletransformationdescriptors.hh:49
    \n+
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition simpletransformationdescriptors.hh:68
    \n+
    static const bool recursive
    Definition simpletransformationdescriptors.hh:51
    \n+
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition simpletransformationdescriptors.hh:62
    \n+
    Definition simpletransformationdescriptors.hh:55
    \n+
    TransformedNode< TC, StaticDegree< SourceNode >::value > type
    Definition simpletransformationdescriptors.hh:56
    \n+
    static const std::size_t degree
    Definition simpletransformationdescriptors.hh:58
    \n+
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:57
    \n+
    Definition simpletransformationdescriptors.hh:78
    \n+
    static const bool recursive
    Definition simpletransformationdescriptors.hh:80
    \n+
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition simpletransformationdescriptors.hh:90
    \n+
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition simpletransformationdescriptors.hh:96
    \n+
    Definition simpletransformationdescriptors.hh:84
    \n+
    TransformedNode< TC > type
    Definition simpletransformationdescriptors.hh:85
    \n+
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:86
    \n+
    Definition simpletransformationdescriptors.hh:106
    \n+
    static const bool recursive
    Definition simpletransformationdescriptors.hh:108
    \n+
    static result< TC... >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition simpletransformationdescriptors.hh:124
    \n+
    static result< TC... >::type transform(const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition simpletransformationdescriptors.hh:118
    \n+
    Definition simpletransformationdescriptors.hh:112
    \n+
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:114
    \n+
    TransformedNode< TC... > type
    Definition simpletransformationdescriptors.hh:113
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,124 +1,253 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-nodeinterface.hh\n+simpletransformationdescriptors.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=8 sw=2 sts=2:\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_NODEINTERFACE_HH\n-7#define DUNE_TYPETREE_NODEINTERFACE_HH\n+6#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n+7#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n 8\n-9#include \n-10#include \n+9#include \n+10#include \n 11\n-12#include \n-13\n-14namespace _\bD_\bu_\bn_\be {\n-15 namespace TypeTree {\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+14#include \n+15\n 16\n-_\b3_\b4 struct _\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+17namespace _\bD_\bu_\bn_\be {\n+18 namespace TypeTree {\n+19\n+25 template\n+_\b2_\b6 struct _\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+27 {\n+28\n+_\b2_\b9 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = false;\n+30\n+_\b3_\b1 typedef TransformedNode _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b2 typedef std::shared_ptr _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+33\n+_\b3_\b4 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const Transformation&\n+t)\n 35 {\n-_\b3_\b7 static const bool _\bi_\bs_\bL_\be_\ba_\bf = implementationDefined;\n+36 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be();\n+37 }\n 38\n-_\b4_\b0 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = implementationDefined;\n-41\n-_\b4_\b3 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = implementationDefined;\n-44\n+_\b3_\b9 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr s, const Transformation& t)\n+40 {\n+41 return std::make_shared();\n+42 }\n+43\n+44 };\n+45\n 46\n-_\b5_\b1 static auto _\bd_\be_\bg_\br_\be_\be();\n+47 template class TransformedNode>\n+_\b4_\b8 struct _\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+49 {\n+50\n+_\b5_\b1 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n 52\n-54\n-_\b5_\b9 typedef ImplementationDefined _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+53 template\n+_\b5_\b4 struct _\br_\be_\bs_\bu_\bl_\bt\n+55 {\n+_\b5_\b6 typedef TransformedNode::value> _\bt_\by_\bp_\be;\n+_\b5_\b7 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b8 static const std::size_t _\bd_\be_\bg_\br_\be_\be = _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be_\b<_\bt_\by_\bp_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n+59 };\n 60\n-62\n-_\b6_\b5 typedef ImplementationDefined _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-66 };\n-67\n-69 template\n-_\b7_\b0 using _\bN_\bo_\bd_\be_\bT_\ba_\bg = typename std::decay_t::NodeTag;\n-71\n-73 template\n-_\b7_\b4 using _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg = typename std::decay_t::ImplementationTag;\n+61 template\n+_\b6_\b2 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>&\n+children)\n+63 {\n+64 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(children);\n+65 }\n+66\n+67 template\n+_\b6_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>& children)\n+69 {\n+70 return std::make_shared::type>(children);\n+71 }\n+72\n+73 };\n+74\n 75\n-76\n-78 template\n-_\b7_\b9 std::size_t _\bd_\be_\bg_\br_\be_\be(const Node& node)\n-80 {\n-81 return _\bd_\be_\bg_\br_\be_\be(&node,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bN_\bo_\bd_\be_\b>());\n-82 }\n-83\n-84#ifndef DOXYGEN\n-85\n-87\n-93 template\n-94 std::size_t _\bd_\be_\bg_\br_\be_\be(const Node* node, _\bN_\bo_\bd_\be_\bT_\ba_\bg)\n-95 {\n-96 return node->degree();\n-97 }\n-98\n-99#endif // DOXYGEN\n+76 template class TransformedNode>\n+_\b7_\b7 struct _\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+78 {\n+79\n+_\b8_\b0 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+81\n+82 template\n+_\b8_\b3 struct _\br_\be_\bs_\bu_\bl_\bt\n+84 {\n+_\b8_\b5 typedef TransformedNode _\bt_\by_\bp_\be;\n+_\b8_\b6 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+87 };\n+88\n+89 template\n+_\b9_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, const std::vector>& children)\n+91 {\n+92 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(children);\n+93 }\n+94\n+95 template\n+_\b9_\b6 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, const std::\n+vector>& children)\n+97 {\n+98 return std::make_shared::type>(children);\n+99 }\n 100\n+101 };\n 102\n-106 template\n-_\b1_\b0_\b7 using _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be = decltype(Node::degree());\n-108\n-110\n-111 } // namespace TypeTree\n-112} //namespace Dune\n-113\n-114#endif // DUNE_TYPETREE_NODEINTERFACE_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-std::size_t degree(const Node &node)\n-Returns the degree of node as run time information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-typename std::decay_t< Node >::NodeTag NodeTag\n-Returns the node tag of the given Node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n-typename std::decay_t< T >::ImplementationTag ImplementationTag\n-Returns the implementation tag of the given Node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:74\n+103\n+104 template class TransformedNode>\n+_\b1_\b0_\b5 struct _\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+106 {\n+107\n+_\b1_\b0_\b8 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+109\n+110 template\n+_\b1_\b1_\b1 struct _\br_\be_\bs_\bu_\bl_\bt\n+112 {\n+_\b1_\b1_\b3 typedef TransformedNode _\bt_\by_\bp_\be;\n+_\b1_\b1_\b4 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+115 };\n+116\n+117 template\n+_\b1_\b1_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, std::shared_ptr... children)\n+119 {\n+120 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(children...);\n+121 }\n+122\n+123 template\n+_\b1_\b2_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt::storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, std::shared_ptr...\n+children)\n+125 {\n+126 return std::make_shared::type>(children...);\n+127 }\n+128\n+129 };\n+130\n+132\n+133 } // namespace TypeTree\n+134} //namespace Dune\n+135\n+136#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n+_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be\n decltype(Node::degree()) StaticDegree\n Returns the statically known degree of the given Node type as a std::\n integral_constant.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:107\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Interface for nodes in a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static auto degree()\n-Number of children of this node in the dune-typetree.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Whether this is a power node in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n-static const bool isLeaf\n-Whether this is a leaf node in a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-ImplementationDefined NodeStorage\n-container type to pass around a collection of children\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Whether this is a composite node in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-ImplementationDefined NodeTag\n-The type tag that describes what kind of node this is.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(const SourceNode &s, const Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< transformed_type > transformed_storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static transformed_storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be\n+TransformedNode transformed_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC\n+>, result< TC >::degree > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(const SourceNode &s, const Transformation\n+&t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< TC, StaticDegree< SourceNode >::value > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static const std::size_t degree\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(const SourceNode &s, const Transformation\n+&t, const std::vector< std::shared_ptr< TC > > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC\n+> > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< TC > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC... >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC... >::type transform(const SourceNode &s, const\n+Transformation &t, std::shared_ptr< TC >... children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< TC... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:113\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00032.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00032.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: accumulate_static.hh File Reference\n+dune-typetree: traversal.hh File Reference\n \n \n \n \n \n \n \n@@ -70,135 +70,79 @@\n
    \n \n
    \n
    \n
    \n \n-
    accumulate_static.hh File Reference
    \n+
    traversal.hh File Reference
    \n
    \n
    \n-
    #include <dune/common/typetraits.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/treepath.hh>
    \n-#include <dune/typetree/utility.hh>
    \n+
    #include <utility>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/typetree/childextraction.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/treepath.hh>
    \n+#include <dune/typetree/visitor.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::TypeTree::or_< result_type >
     Statically combine two values of type result_type using ||. More...
     
    struct  Dune::TypeTree::or_< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::and_< result_type >
     Statically combine two values of type result_type using &&. More...
     
    struct  Dune::TypeTree::and_< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::plus< result_type >
     Statically combine two values of type result_type using +. More...
     
    struct  Dune::TypeTree::plus< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::minus< result_type >
     Statically combine two values of type result_type using -. More...
     
    struct  Dune::TypeTree::minus< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::multiply< result_type >
     Statically combine two values of type result_type using *. More...
     
    struct  Dune::TypeTree::multiply< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::min< result_type >
     Statically combine two values of type result_type by returning their minimum. More...
     
    struct  Dune::TypeTree::min< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::max< result_type >
     Statically combine two values of type result_type by returning their maximum. More...
     
    struct  Dune::TypeTree::max< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::AccumulateValue< Tree, Functor, Reduction, startValue, ParentChildReduction >
     Statically accumulate a value over the nodes of a TypeTree. More...
     
    struct  Dune::TypeTree::TypeAccumulationPolicy< Functor, Reduction, StartType, ParentChildReduction, ReductionAlgorithm >
     
    struct  Dune::TypeTree::AccumulateType< Tree, Policy >
     Statically accumulate a type over the nodes of a TypeTree. More...
     
    \n \n \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::Experimental
    namespace  Dune::TypeTree::Detail
     
    \n+\n+\n+\n+\n+\n+\n+\n+

    \n+Typedefs

    template<class Tree >
    using Dune::TypeTree::Detail::DynamicTraversalConcept = decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u)))
     
    template<class Tree >
    using Dune::TypeTree::Detail::StaticTraversalConcept = decltype((std::integral_constant< std::size_t, Tree::degree()>{}))
     
    \n \n-\n-\n-\n-\n-

    \n Functions

    template<typename Tree , typename Visitor , typename Init >
    auto Dune::TypeTree::Experimental::hybridApplyToTree (Tree &&tree, Visitor &&visitor, Init &&init)
     Apply hybrid visitor to TypeTree.
     
    \n-

    Variable Documentation

    \n-\n-

    ◆ child_result

    \n-\n-
    \n-
    \n-\n- \n- \n- \n- \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n
    \n- \n- \n- \n- \n-
    const result_type child_result = accumulate_value<child,Functor,Reduction,ParentChildReduction,current_value,child_tree_path,NodeTag<child>>::result
    \n-
    \n-static
    template<class Tree , TreePathType::Type pathType, class Prefix , std::enable_if_t< Tree::isLeaf, int > = 0>
    constexpr auto Dune::TypeTree::Detail::leafTreePathTuple (Prefix prefix)
     
    template<class Tree , TreePathType::Type pathType, class Prefix , std::size_t... indices, std::enable_if_t<(Tree::isComposite or(Tree::isPower and(pathType!=TreePathType::dynamic))), int > = 0>
    constexpr auto Dune::TypeTree::Detail::leafTreePathTuple (Prefix prefix, std::index_sequence< indices... >)
     
    template<class T , class TreePath , class V , std::enable_if_t< std::decay_t< T >::isLeaf, int > = 0>
    void Dune::TypeTree::Detail::applyToTree (T &&tree, TreePath treePath, V &&visitor)
     
    template<class T , class TreePath , class PreFunc , class LeafFunc , class PostFunc >
    void Dune::TypeTree::Detail::forEachNode (T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc &&postFunc)
     
    template<class Tree , TreePathType::Type pathType = TreePathType::dynamic>
    constexpr auto Dune::TypeTree::leafTreePathTuple ()
     Create tuple of tree paths to leafs.
     
    template<typename Tree , typename Visitor >
    void Dune::TypeTree::applyToTree (Tree &&tree, Visitor &&visitor)
     Apply visitor to TypeTree.
     
    template<class Tree , class NodeFunc >
    void Dune::TypeTree::forEachNode (Tree &&tree, NodeFunc &&nodeFunc)
     Traverse tree and visit each node.
     
    template<class Tree , class LeafFunc >
    void Dune::TypeTree::forEachLeafNode (Tree &&tree, LeafFunc &&leafFunc)
     Traverse tree and visit each leaf node.
     
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ result

    \n-\n-
    \n-
    \n-\n- \n- \n- \n- \n-
    \n- \n- \n- \n- \n-
    const result_type result = current_value
    \n-
    \n-static
    \n-
    \n-\n-
    \n-
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,84 +1,73 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-accumulate_static.hh File Reference\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+traversal.hh File Reference\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type using ||. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type using &&. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type using +. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type using -. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type using *. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type by returning their\n- minimum. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statically combine two values of type result_type by returning their\n- maximum. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bF_\bu_\bn_\bc_\bt_\bo_\br_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bs_\bt_\ba_\br_\bt_\bV_\ba_\bl_\bu_\be_\b,\n- _\bP_\ba_\br_\be_\bn_\bt_\bC_\bh_\bi_\bl_\bd_\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b _\b>\n-\u00a0 Statically accumulate a value over the nodes of a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bF_\bu_\bn_\bc_\bt_\bo_\br_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bS_\bt_\ba_\br_\bt_\bT_\by_\bp_\be_\b,\n- _\bP_\ba_\br_\be_\bn_\bt_\bC_\bh_\bi_\bl_\bd_\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bP_\bo_\bl_\bi_\bc_\by_\b _\b>\n-\u00a0 Statically accumulate a type over the nodes of a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n+\u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((std::\n+ declval< Tree >()._\bd_\be_\bg_\br_\be_\be(), std::declval< Tree >()._\bc_\bh_\bi_\bl_\bd(0u)))\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((std::\n+ integral_constant< std::size_t, Tree::degree()>{}))\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (Tree &&tree, Visitor\n- &&visitor, Init &&init)\n-\u00a0 Apply hybrid visitor to _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n-\u00a0\n-*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0c\bch\bhi\bil\bld\bd_\b_r\bre\bes\bsu\bul\blt\bt *\b**\b**\b**\b**\b*\n-const result_type child_result =\n-accumulate_value>_\b:_\b: static\n-_\br_\be_\bs_\bu_\bl_\bt\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bre\bes\bsu\bul\blt\bt *\b**\b**\b**\b**\b*\n-const result_type result = current_value static\n+template = 0>\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be (Prefix prefix)\n+\u00a0\n+template = 0>\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be (Prefix prefix, std::\n+ index_sequence< indices... >)\n+\u00a0\n+template::isLeaf, int > = 0>\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (T &&tree, TreePath\n+ _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V &&visitor)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be (T &&tree, TreePath\n+ _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc\n+ &&postFunc)\n+\u00a0\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be ()\n+\u00a0 Create tuple of tree paths to leafs.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (Tree &&tree, Visitor &&visitor)\n+\u00a0 Apply visitor to _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be (Tree &&tree, NodeFunc &&nodeFunc)\n+\u00a0 Traverse tree and visit each node.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be (Tree &&tree, LeafFunc\n+ &&leafFunc)\n+\u00a0 Traverse tree and visit each leaf node.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00032_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00032_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: accumulate_static.hh Source File\n+dune-typetree: traversal.hh Source File\n \n \n \n \n \n \n \n@@ -74,595 +74,281 @@\n \n
    \n \n
    \n
    \n
    \n-
    accumulate_static.hh
    \n+
    traversal.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n-
    7#define DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n+
    6#ifndef DUNE_TYPETREE_TRAVERSAL_HH
    \n+
    7#define DUNE_TYPETREE_TRAVERSAL_HH
    \n
    8
    \n-
    9#include <dune/common/typetraits.hh>
    \n-\n-\n-\n-\n-
    14
    \n-
    15
    \n-
    \n-
    16namespace Dune {
    \n-
    \n-
    17 namespace TypeTree {
    \n+
    9#include <utility>
    \n+
    10
    \n+
    11#include <dune/common/hybridutilities.hh>
    \n+
    12#include <dune/common/std/type_traits.hh>
    \n+
    13
    \n+\n+\n+\n+\n
    18
    \n-
    25 template<typename result_type>
    \n-
    \n-
    26 struct or_
    \n-
    27 {
    \n-
    28 template<result_type r1, result_type r2>
    \n-
    \n-
    29 struct reduce
    \n-
    30 {
    \n-
    31 static const result_type result = r1 || r2;
    \n-
    32 };
    \n-
    \n+
    19namespace Dune {
    \n+
    20 namespace TypeTree {
    \n+
    21
    \n+
    27#ifndef DOXYGEN
    \n+
    29 struct NoOp
    \n+
    30 {
    \n+
    31 template<class... T>
    \n+
    32 constexpr void operator()(T&&...) const { /* do nothing */ }
    \n
    33 };
    \n+
    34#endif
    \n+
    35
    \n+
    36 namespace Detail {
    \n+
    37
    \n+
    38 // SFINAE template check that Tree has a degree() function and a child() function accepting integer indices
    \n+
    39 template<class Tree>
    \n+
    40 using DynamicTraversalConcept = decltype((
    \n+
    41 std::declval<Tree>().degree(),
    \n+
    42 std::declval<Tree>().child(0u)
    \n+
    43 ));
    \n+
    44
    \n+
    45 // SFINAE template check that Tree has static (constexpr) function Tree::degree()
    \n+
    46 template<class Tree>
    \n+
    47 using StaticTraversalConcept = decltype((
    \n+
    48 std::integral_constant<std::size_t, Tree::degree()>{}
    \n+
    49 ));
    \n+
    50
    \n+
    51
    \n+
    52 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n+
    53 std::enable_if_t<Tree::isLeaf, int> = 0>
    \n+
    \n+
    54 constexpr auto leafTreePathTuple(Prefix prefix)
    \n+
    55 {
    \n+
    56 return std::make_tuple(prefix);
    \n+
    57 }
    \n+
    \n+
    58
    \n+
    59 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n+
    60 std::enable_if_t<not Tree::isLeaf, int> = 0>
    \n+
    61 constexpr auto leafTreePathTuple(Prefix prefix);
    \n+
    62
    \n+
    63 template<class Tree, TreePathType::Type pathType, class Prefix, std::size_t... indices,
    \n+
    64 std::enable_if_t<(Tree::isComposite or (Tree::isPower and (pathType!=TreePathType::dynamic))), int> = 0>
    \n+
    \n+
    65 constexpr auto leafTreePathTuple(Prefix prefix, std::index_sequence<indices...>)
    \n+
    66 {
    \n+
    67 return std::tuple_cat(Detail::leafTreePathTuple<TypeTree::Child<Tree,indices>, pathType>(Dune::TypeTree::push_back(prefix, Dune::index_constant<indices>{}))...);
    \n+
    68 }
    \n+
    \n+
    69
    \n+
    70 template<class Tree, TreePathType::Type pathType, class Prefix, std::size_t... indices,
    \n+
    71 std::enable_if_t<(Tree::isPower and (pathType==TreePathType::dynamic)), int> = 0>
    \n+
    72 constexpr auto leafTreePathTuple(Prefix prefix, std::index_sequence<indices...>)
    \n+
    73 {
    \n+
    74 return std::tuple_cat(Detail::leafTreePathTuple<TypeTree::Child<Tree,indices>, pathType>(Dune::TypeTree::push_back(prefix, indices))...);
    \n+
    75 }
    \n+
    76
    \n+
    77 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n+
    78 std::enable_if_t<not Tree::isLeaf, int>>
    \n+
    79 constexpr auto leafTreePathTuple(Prefix prefix)
    \n+
    80 {
    \n+
    81 return Detail::leafTreePathTuple<Tree, pathType>(prefix, std::make_index_sequence<Tree::degree()>{});
    \n+
    82 }
    \n+
    83
    \n+
    84 /* The signature is the same as for the public applyToTree
    \n+
    85 * function in Dune::Typetree, despite the additionally passed
    \n+
    86 * treePath argument. The path passed here is associated to
    \n+
    87 * the tree and the relative paths of the children (wrt. to tree)
    \n+
    88 * are appended to this. Hence the behavior of the public function
    \n+
    89 * is resembled by passing an empty treePath.
    \n+
    90 */
    \n+
    91
    \n+
    92 /*
    \n+
    93 * This is the overload for leaf traversal
    \n+
    94 */
    \n+
    95 template<class T, class TreePath, class V,
    \n+
    96 std::enable_if_t<std::decay_t<T>::isLeaf, int> = 0>
    \n+
    \n+
    97 void applyToTree(T&& tree, TreePath treePath, V&& visitor)
    \n+
    98 {
    \n+
    99 visitor.leaf(tree, treePath);
    \n+
    100 }
    \n
    \n-
    34
    \n-
    36 template<typename result_type>
    \n-
    \n-
    37 struct and_
    \n-
    38 {
    \n-
    39 template<result_type r1, result_type r2>
    \n-
    \n-
    40 struct reduce
    \n-
    41 {
    \n-
    42 static const result_type result = r1 && r2;
    \n-
    43 };
    \n-
    \n-
    44 };
    \n-
    \n-
    45
    \n-
    47 template<typename result_type>
    \n-
    \n-
    48 struct plus
    \n-
    49 {
    \n-
    50 template<result_type r1, result_type r2>
    \n-
    \n-
    51 struct reduce
    \n-
    52 {
    \n-
    53 static const result_type result = r1 + r2;
    \n-
    54 };
    \n-
    \n-
    55 };
    \n-
    \n-
    56
    \n-
    58 template<typename result_type>
    \n-
    \n-
    59 struct minus
    \n-
    60 {
    \n-
    61 template<result_type r1, result_type r2>
    \n-
    \n-
    62 struct reduce
    \n-
    63 {
    \n-
    64 static const result_type result = r1 - r2;
    \n-
    65 };
    \n-
    \n-
    66 };
    \n-
    \n-
    67
    \n-
    69 template<typename result_type>
    \n-
    \n-
    70 struct multiply
    \n-
    71 {
    \n-
    72 template<result_type r1, result_type r2>
    \n-
    \n-
    73 struct reduce
    \n-
    74 {
    \n-
    75 static const result_type result = r1 * r2;
    \n-
    76 };
    \n-
    \n-
    77 };
    \n-
    \n-
    78
    \n-
    80 template<typename result_type>
    \n-
    \n-
    81 struct min
    \n-
    82 {
    \n-
    83 template<result_type r1, result_type r2>
    \n-
    \n-
    84 struct reduce
    \n-
    85 {
    \n-
    86 static const result_type result = r1 < r2 ? r1 : r2;
    \n-
    87 };
    \n-
    \n-
    88 };
    \n-
    \n-
    89
    \n-
    91 template<typename result_type>
    \n-
    \n-
    92 struct max
    \n-
    93 {
    \n-
    94 template<result_type r1, result_type r2>
    \n-
    \n-
    95 struct reduce
    \n-
    96 {
    \n-
    97 static const result_type result = r1 > r2 ? r1 : r2;
    \n-
    98 };
    \n-
    \n-
    99 };
    \n-
    \n-
    100
    \n
    101
    \n-
    102 namespace {
    \n-
    103
    \n-
    104 // implementation of the traversal algorithm
    \n-
    105
    \n-
    107 template<typename Node, typename Functor, typename Reduction, typename Functor::result_type current_value, typename TreePath, bool doVisit>
    \n-
    108 struct accumulate_node_helper
    \n-
    109 {
    \n-
    110
    \n-
    111 typedef typename Functor::result_type result_type;
    \n+
    102 /*
    \n+
    103 * This is the general overload doing child traversal.
    \n+
    104 */
    \n+
    105 template<class T, class TreePath, class V,
    \n+
    106 std::enable_if_t<not std::decay_t<T>::isLeaf, int> = 0>
    \n+
    107 void applyToTree(T&& tree, TreePath treePath, V&& visitor)
    \n+
    108 {
    \n+
    109 using Tree = std::remove_reference_t<T>;
    \n+
    110 using Visitor = std::remove_reference_t<V>;
    \n+
    111 visitor.pre(tree, treePath);
    \n
    112
    \n-
    113 static const result_type result = current_value;
    \n-
    114
    \n-
    115 };
    \n+
    113 // check which type of traversal is supported by the tree
    \n+
    114 using allowDynamicTraversal = Dune::Std::is_detected<DynamicTraversalConcept,Tree>;
    \n+
    115 using allowStaticTraversal = Dune::Std::is_detected<StaticTraversalConcept,Tree>;
    \n
    116
    \n-
    118 template<typename Node, typename Functor, typename Reduction, typename Functor::result_type current_value, typename TreePath>
    \n-
    119 struct accumulate_node_helper<Node,Functor,Reduction,current_value,TreePath,true>
    \n-
    120 {
    \n-
    121
    \n-
    122 typedef typename Functor::result_type result_type;
    \n-
    123
    \n-
    124 static const result_type result = Reduction::template reduce<current_value,Functor::template visit<Node,TreePath>::result>::result;
    \n-
    125
    \n-
    126 };
    \n-
    127
    \n-
    129 template<typename Tree, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, typename Tag>
    \n-
    130 struct accumulate_value;
    \n-
    131
    \n-
    133 template<typename LeafNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n-
    134 struct accumulate_value<LeafNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,LeafNodeTag>
    \n-
    135 {
    \n-
    136
    \n-
    137 typedef typename Functor::result_type result_type;
    \n-
    138
    \n-
    139 static const result_type result =
    \n-
    140
    \n-
    141 accumulate_node_helper<LeafNode,Functor,Reduction,current_value,TreePath,Functor::template doVisit<LeafNode,TreePath>::value>::result;
    \n+
    117 // the tree must support either dynamic or static traversal
    \n+
    118 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n+
    119
    \n+
    120 // the visitor may specify preferred dynamic traversal
    \n+
    121 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n+
    122
    \n+
    123 // create a dynamic or static index range
    \n+
    124 auto indices = [&]{
    \n+
    125 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)
    \n+
    126 return Dune::range(std::size_t(tree.degree()));
    \n+
    127 else
    \n+
    128 return Dune::range(tree.degree());
    \n+
    129 }();
    \n+
    130
    \n+
    131 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {
    \n+
    132 Hybrid::forEach(indices, [&](auto i) {
    \n+
    133 auto&& child = tree.child(i);
    \n+
    134 using Child = std::decay_t<decltype(child)>;
    \n+
    135
    \n+
    136 visitor.beforeChild(tree, child, treePath, i);
    \n+
    137
    \n+
    138 // This requires that visitor.in(...) can always be instantiated,
    \n+
    139 // even if there's a single child only.
    \n+
    140 if (i>0)
    \n+
    141 visitor.in(tree, treePath);
    \n
    142
    \n-
    143 };
    \n-
    144
    \n-
    146 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, std::size_t i, std::size_t n>
    \n-
    147 struct accumulate_over_children
    \n-
    148 {
    \n-
    149
    \n-
    150 typedef typename Functor::result_type result_type;
    \n-
    151
    \n-
    152 typedef decltype(push_back(TreePath{},index_constant<i>{})) child_tree_path;
    \n-
    153
    \n-
    154 typedef typename Node::template Child<i>::Type child;
    \n-
    155
    \n-
    156 static const result_type child_result = accumulate_value<child,Functor,Reduction,ParentChildReduction,current_value,child_tree_path,NodeTag<child>>::result;
    \n-
    157
    \n-
    158 static const result_type result = accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,child_result,TreePath,i+1,n>::result;
    \n-
    159
    \n-
    160 };
    \n-
    161
    \n-
    163 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, std::size_t n>
    \n-
    164 struct accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,current_value,TreePath,n,n>
    \n+
    143 constexpr bool visitChild = Visitor::template VisitChild<Tree,Child,TreePath>::value;
    \n+
    144 if constexpr(visitChild) {
    \n+
    145 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n+
    146 applyToTree(child, childTreePath, visitor);
    \n+
    147 }
    \n+
    148
    \n+
    149 visitor.afterChild(tree, child, treePath, i);
    \n+
    150 });
    \n+
    151 }
    \n+
    152 visitor.post(tree, treePath);
    \n+
    153 }
    \n+
    154
    \n+
    155 /* Traverse tree and visit each node. The signature is the same
    \n+
    156 * as for the public forEachNode function in Dune::Typtree,
    \n+
    157 * despite the additionally passed treePath argument. The path
    \n+
    158 * passed here is associated to the tree and the relative
    \n+
    159 * paths of the children (wrt. to tree) are appended to this.
    \n+
    160 * Hence the behavior of the public function is resembled
    \n+
    161 * by passing an empty treePath.
    \n+
    162 */
    \n+
    163 template<class T, class TreePath, class PreFunc, class LeafFunc, class PostFunc>
    \n+
    \n+
    164 void forEachNode(T&& tree, TreePath treePath, PreFunc&& preFunc, LeafFunc&& leafFunc, PostFunc&& postFunc)
    \n
    165 {
    \n-
    166
    \n-
    167 typedef typename Functor::result_type result_type;
    \n-
    168
    \n-
    169 static const result_type result = current_value;
    \n-
    170
    \n-
    171 };
    \n-
    172
    \n-
    175 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n-
    176 struct accumulate_value_generic_composite_node
    \n-
    177 {
    \n+
    166 using Tree = std::decay_t<T>;
    \n+
    167 if constexpr(Tree::isLeaf) {
    \n+
    168 leafFunc(tree, treePath);
    \n+
    169 } else {
    \n+
    170 preFunc(tree, treePath);
    \n+
    171
    \n+
    172 // check which type of traversal is supported by the tree, prefer dynamic traversal
    \n+
    173 using allowDynamicTraversal = Dune::Std::is_detected<DynamicTraversalConcept,Tree>;
    \n+
    174 using allowStaticTraversal = Dune::Std::is_detected<StaticTraversalConcept,Tree>;
    \n+
    175
    \n+
    176 // the tree must support either dynamic or static traversal
    \n+
    177 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n
    178
    \n-
    179 typedef typename Functor::result_type result_type;
    \n-
    180
    \n-
    181 static const result_type child_result = accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,current_value,TreePath,0,StaticDegree<Node>::value>::result;
    \n-
    182
    \n-
    183 static const result_type result =
    \n-
    184 accumulate_node_helper<Node,Functor,ParentChildReduction,child_result,TreePath,Functor::template doVisit<Node,TreePath>::value>::result;
    \n-
    185
    \n-
    186
    \n-
    187 };
    \n-
    188
    \n-
    190 template<typename PowerNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n-
    191 struct accumulate_value<PowerNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,PowerNodeTag>
    \n-
    192 : public accumulate_value_generic_composite_node<PowerNode,Functor,Reduction,ParentChildReduction,current_value,TreePath>
    \n-
    193 {};
    \n-
    194
    \n-
    196 template<typename CompositeNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n-
    197 struct accumulate_value<CompositeNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,CompositeNodeTag>
    \n-
    198 : public accumulate_value_generic_composite_node<CompositeNode,Functor,Reduction,ParentChildReduction,current_value,TreePath>
    \n-
    199 {};
    \n-
    200
    \n-
    201 } // anonymous namespace
    \n-
    202
    \n-
    204
    \n-
    260 template<typename Tree, typename Functor, typename Reduction, typename Functor::result_type startValue, typename ParentChildReduction = Reduction>
    \n-
    \n-\n-
    262 {
    \n-
    263
    \n-
    265 typedef typename Functor::result_type result_type;
    \n-
    266
    \n-
    268 static const result_type result = accumulate_value<Tree,Functor,Reduction,ParentChildReduction,startValue,HybridTreePath<>,NodeTag<Tree>>::result;
    \n-
    269
    \n-
    270 };
    \n+
    179 if constexpr(allowDynamicTraversal::value) {
    \n+
    180 // Specialization for dynamic traversal
    \n+
    181 for (std::size_t i = 0; i < tree.degree(); ++i) {
    \n+
    182 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n+
    183 forEachNode(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);
    \n+
    184 }
    \n+
    185 } else if constexpr(allowStaticTraversal::value) {
    \n+
    186 // Specialization for static traversal
    \n+
    187 auto indices = std::make_index_sequence<Tree::degree()>{};
    \n+
    188 Hybrid::forEach(indices, [&](auto i) {
    \n+
    189 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n+
    190 forEachNode(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);
    \n+
    191 });
    \n+
    192 }
    \n+
    193 postFunc(tree, treePath);
    \n+
    194 }
    \n+
    195 }
    \n+
    \n+
    196
    \n+
    197 } // namespace Detail
    \n+
    198
    \n+
    199
    \n+
    200 // ********************************************************************************
    \n+
    201 // Public Interface
    \n+
    202 // ********************************************************************************
    \n+
    203
    \n+
    217 template<class Tree, TreePathType::Type pathType=TreePathType::dynamic>
    \n+
    \n+
    218 constexpr auto leafTreePathTuple()
    \n+
    219 {
    \n+
    220 return Detail::leafTreePathTuple<std::decay_t<Tree>, pathType>(hybridTreePath());
    \n+
    221 }
    \n+
    \n+
    222
    \n+
    224
    \n+
    238 template<typename Tree, typename Visitor>
    \n+
    \n+
    239 void applyToTree(Tree&& tree, Visitor&& visitor)
    \n+
    240 {
    \n+
    241 Detail::applyToTree(tree, hybridTreePath(), visitor);
    \n+
    242 }
    \n+
    \n+
    243
    \n+
    253 template<class Tree, class NodeFunc>
    \n+
    \n+
    254 void forEachNode(Tree&& tree, NodeFunc&& nodeFunc)
    \n+
    255 {
    \n+
    256 Detail::forEachNode(tree, hybridTreePath(), nodeFunc, nodeFunc, NoOp{});
    \n+
    257 }
    \n+
    \n+
    258
    \n+
    268 template<class Tree, class LeafFunc>
    \n+
    \n+
    269 void forEachLeafNode(Tree&& tree, LeafFunc&& leafFunc)
    \n+
    270 {
    \n+
    271 Detail::forEachNode(tree, hybridTreePath(), NoOp{}, leafFunc, NoOp{});
    \n+
    272 }
    \n
    \n-
    271
    \n-
    274 struct flattened_reduction;
    \n+
    273
    \n
    275
    \n-
    278 struct bottom_up_reduction;
    \n-
    279
    \n-
    280 namespace {
    \n-
    281
    \n-
    282 // implementation of the traversal algorithm
    \n-
    283
    \n-
    286 template<typename Node, typename Functor, typename Reduction, typename current_type, typename TreePath, bool doVisit>
    \n-
    287 struct accumulate_type_node_helper
    \n-
    288 {
    \n-
    289
    \n-
    290 typedef current_type type;
    \n-
    291
    \n-
    292 };
    \n-
    293
    \n-
    295 template<typename Node, typename Functor, typename Reduction, typename current_type, typename TreePath>
    \n-
    296 struct accumulate_type_node_helper<Node,Functor,Reduction,current_type,TreePath,true>
    \n-
    297 {
    \n-
    298
    \n-
    299 typedef typename Reduction::template reduce<
    \n-
    300 current_type,
    \n-
    301 typename Functor::template visit<
    \n-
    302 Node,
    \n-
    303 TreePath
    \n-
    304 >::type
    \n-
    305 >::type type;
    \n-
    306
    \n-
    307 };
    \n-
    308
    \n-
    310 template<typename Tree, typename Policy, typename current_type, typename TreePath, typename Tag>
    \n-
    311 struct accumulate_type;
    \n-
    312
    \n-
    314 template<typename LeafNode, typename Policy, typename current_type, typename TreePath>
    \n-
    315 struct accumulate_type<LeafNode,Policy,current_type,TreePath,LeafNodeTag>
    \n-
    316 {
    \n-
    317
    \n-
    318 typedef typename accumulate_type_node_helper<
    \n-
    319 LeafNode,
    \n-
    320 typename Policy::functor,
    \n-
    321 typename Policy::sibling_reduction,
    \n-
    322 current_type,
    \n-
    323 TreePath,
    \n-
    324 Policy::functor::template doVisit<
    \n-
    325 LeafNode,
    \n-
    326 TreePath>::value
    \n-
    327 >::type type;
    \n-
    328
    \n-
    329 };
    \n-
    330
    \n-
    331
    \n-
    334 template<typename current_type, typename tree_path, typename start_type, typename reduction_strategy>
    \n-
    335 struct propagate_type_down_tree;
    \n-
    336
    \n-
    338 template<typename current_type, typename tree_path, typename start_type>
    \n-
    339 struct propagate_type_down_tree<
    \n-
    340 current_type,
    \n-
    341 tree_path,
    \n-
    342 start_type,
    \n-
    343 bottom_up_reduction
    \n-
    344 >
    \n-
    345 {
    \n-
    346 typedef current_type type;
    \n-
    347 };
    \n-
    348
    \n-
    350 template<typename current_type, typename tree_path, typename start_type>
    \n-
    351 struct propagate_type_down_tree<
    \n-
    352 current_type,
    \n-
    353 tree_path,
    \n-
    354 start_type,
    \n-
    355 flattened_reduction
    \n-
    356 >
    \n-
    357 {
    \n-
    358 typedef typename std::conditional<
    \n-
    359 TreePathBack<tree_path>::value == 0,
    \n-
    360 start_type,
    \n-
    361 current_type
    \n-
    362 >::type type;
    \n-
    363 };
    \n-
    364
    \n-
    365
    \n-
    367 template<typename Node, typename Policy, typename current_type, typename TreePath, std::size_t i, std::size_t n>
    \n-
    368 struct accumulate_type_over_children
    \n-
    369 {
    \n-
    370
    \n-
    371 typedef decltype(push_back(TreePath{},index_constant<i>{})) child_tree_path;
    \n-
    372
    \n-
    373 typedef typename Node::template Child<i>::Type child;
    \n-
    374
    \n-
    375 typedef typename accumulate_type<
    \n-
    376 child,
    \n-
    377 Policy,
    \n-
    378 // apply reduction choice (flat / hierarchic)
    \n-
    379 typename propagate_type_down_tree<
    \n-
    380 current_type,
    \n-
    381 child_tree_path,
    \n-
    382 typename Policy::start_type,
    \n-
    383 typename Policy::reduction_strategy
    \n-
    384 >::type,
    \n-
    385 child_tree_path,
    \n-
    386 NodeTag<child>
    \n-
    387 >::type child_result_type;
    \n-
    388
    \n-
    389 typedef typename accumulate_type_over_children<
    \n-
    390 Node,
    \n-
    391 Policy,
    \n-
    392 child_result_type,
    \n-
    393 TreePath,
    \n-
    394 i+1,
    \n-
    395 n
    \n-
    396 >::type type;
    \n-
    397
    \n-
    398 };
    \n-
    399
    \n-
    401 template<typename Node, typename Policy, typename current_type, typename TreePath, std::size_t n>
    \n-
    402 struct accumulate_type_over_children<Node,Policy,current_type,TreePath,n,n>
    \n-
    403 {
    \n-
    404
    \n-
    405 typedef current_type type;
    \n-
    406
    \n-
    407 };
    \n-
    408
    \n-
    409
    \n-
    412 template<typename Node, typename Policy, typename current_type, typename TreePath>
    \n-
    413 struct accumulate_type_generic_composite_node
    \n-
    414 {
    \n-
    415
    \n-
    416 typedef typename accumulate_type_over_children<
    \n-
    417 Node,
    \n-
    418 Policy,
    \n-
    419 current_type,
    \n-
    420 TreePath,
    \n-
    421 0,
    \n-
    422 StaticDegree<Node>::value
    \n-
    423 >::type children_result_type;
    \n-
    424
    \n-
    425 typedef typename accumulate_type_node_helper<
    \n-
    426 Node,
    \n-
    427 typename Policy::functor,
    \n-
    428 typename Policy::parent_child_reduction,
    \n-
    429 children_result_type,
    \n-
    430 TreePath,
    \n-
    431 Policy::functor::template doVisit<
    \n-
    432 Node,
    \n-
    433 TreePath
    \n-
    434 >::value
    \n-
    435 >::type type;
    \n-
    436
    \n-
    437 };
    \n-
    438
    \n-
    440 template<typename PowerNode, typename Policy, typename current_type, typename TreePath>
    \n-
    441 struct accumulate_type<PowerNode,Policy,current_type,TreePath,PowerNodeTag>
    \n-
    442 : public accumulate_type_generic_composite_node<PowerNode,Policy,current_type,TreePath>
    \n-
    443 {};
    \n-
    444
    \n-
    446 template<typename CompositeNode, typename Policy, typename current_type, typename TreePath>
    \n-
    447 struct accumulate_type<CompositeNode,Policy,current_type,TreePath,CompositeNodeTag>
    \n-
    448 : public accumulate_type_generic_composite_node<CompositeNode,Policy,current_type,TreePath>
    \n-
    449 {};
    \n-
    450
    \n-
    451 } // anonymous namespace
    \n-
    452
    \n-
    453
    \n-
    461 template<
    \n-
    462 typename Functor,
    \n-
    463 typename Reduction,
    \n-
    464 typename StartType,
    \n-
    465 typename ParentChildReduction = Reduction,
    \n-
    466 typename ReductionAlgorithm = flattened_reduction
    \n-
    467 >
    \n-
    \n-\n-
    469 {
    \n-
    470
    \n-
    498 typedef Functor functor;
    \n-
    499
    \n-
    519 typedef Reduction sibling_reduction;
    \n-
    520
    \n-
    527 typedef ParentChildReduction parent_child_reduction;
    \n-
    528
    \n-
    535 typedef StartType start_type;
    \n-
    536
    \n-
    541 typedef ReductionAlgorithm reduction_strategy;
    \n-
    542 };
    \n-
    \n-
    543
    \n-
    544
    \n-
    546
    \n-
    554 template<typename Tree, typename Policy>
    \n-
    \n-\n-
    556 {
    \n-
    557
    \n-
    559 typedef typename accumulate_type<
    \n-
    560 Tree,
    \n-
    561 Policy,
    \n-
    562 typename Policy::start_type,
    \n-\n-\n-
    565 >::type type;
    \n-
    566
    \n-
    567 };
    \n-
    \n-
    568
    \n-
    569
    \n-
    570
    \n-
    571
    \n-
    572
    \n-
    573 /***************************************************/
    \n-
    574
    \n-
    \n-
    575 namespace Experimental {
    \n-
    576 namespace Impl {
    \n-
    577
    \n-
    579 template<class T, class TreePath, class V, class U,
    \n-
    580 std::enable_if_t<std::decay_t<T>::isLeaf, int> = 0>
    \n-
    581 auto hybridApplyToTree(T&& tree, TreePath treePath, V&& visitor, U&& current_val)
    \n-
    582 {
    \n-
    583 return visitor.leaf(tree, treePath, std::forward<U>(current_val));
    \n-
    584 }
    \n-
    585
    \n-
    587 template<class T, class TreePath, class V, class U,
    \n-
    588 std::enable_if_t<not std::decay_t<T>::isLeaf, int> = 0>
    \n-
    589 auto hybridApplyToTree(T&& tree, TreePath treePath, V&& visitor, U&& current_val)
    \n-
    590 {
    \n-
    591 using Tree = std::remove_reference_t<T>;
    \n-
    592 using Visitor = std::remove_reference_t<V>;
    \n-
    593 auto pre_val = visitor.pre(tree, treePath, std::forward<U>(current_val));
    \n-
    594
    \n-
    595 // check which type of traversal is supported by the tree
    \n-
    596 using allowDynamicTraversal = Dune::Std::is_detected<Detail::DynamicTraversalConcept,Tree>;
    \n-
    597 using allowStaticTraversal = Dune::Std::is_detected<Detail::StaticTraversalConcept,Tree>;
    \n-
    598
    \n-
    599 // the tree must support either dynamic or static traversal
    \n-
    600 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n-
    601
    \n-
    602 // the visitor may specify preferred dynamic traversal
    \n-
    603 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n-
    604
    \n-
    605 // declare rule that applies visitor and current value to a child i. Returns next value
    \n-
    606 auto apply_i = [&](auto&& value, const auto& i){
    \n-
    607 auto&& child = tree.child(i);
    \n-
    608 using Child = std::decay_t<decltype(child)>;
    \n-
    609
    \n-
    610 auto val_before = visitor.beforeChild(tree, child, treePath, i, std::move(value));
    \n-
    611
    \n-
    612 // visits between children
    \n-
    613 auto val_in = Hybrid::ifElse(
    \n-
    614 Hybrid::equal_to(i,Indices::_0),
    \n-
    615 [&](auto id){return std::move(val_before);},
    \n-
    616 [&](auto id){return visitor.in(tree, treePath, std::move(val_before));}
    \n-
    617 );
    \n-
    618
    \n-
    619 constexpr bool visitChild = Visitor::template VisitChild<Tree,Child,TreePath>::value;
    \n-
    620 auto val_visit = [&](){
    \n-
    621 if constexpr (visitChild) {
    \n-
    622 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n-
    623 return hybridApplyToTree(child, childTreePath, visitor, std::move(val_in));
    \n-
    624 }
    \n-
    625 else
    \n-
    626 return std::move(val_in);
    \n-
    627 }();
    \n-
    628
    \n-
    629 return visitor.afterChild(tree, child, treePath, i, std::move(val_visit));
    \n-
    630 };
    \n-
    631
    \n-
    632 // apply visitor to children
    \n-
    633 auto in_val = [&](){
    \n-
    634 if constexpr (allowStaticTraversal::value && not preferDynamicTraversal::value) {
    \n-
    635 // get list of static indices
    \n-
    636 auto indices = std::make_index_sequence<Tree::degree()>{};
    \n-
    637
    \n-
    638 // unfold apply_i left to right
    \n-
    639 return unpackIntegerSequence([&](auto... i) {
    \n-
    659 return left_fold(std::move(apply_i),std::move(pre_val), i...);
    \n-
    660 }, indices);
    \n-
    661
    \n-
    662 } else {
    \n-
    663 // unfold first child to get type
    \n-
    664 auto i_val = apply_i(std::move(pre_val),std::size_t{0});
    \n-
    665 // dynamically loop rest of the children to accumulate remindng values
    \n-
    666 for(std::size_t i = 1; i < tree.degree(); i++)
    \n-
    667 i_val = apply_i(i_val,i);
    \n-
    668 return i_val;
    \n-
    669 }
    \n-
    670 }();
    \n-
    671
    \n-
    672 return visitor.post(tree, treePath, in_val);
    \n-
    673 }
    \n-
    674
    \n-
    675 }
    \n-
    676
    \n-
    700 template<typename Tree, typename Visitor, typename Init>
    \n-
    \n-
    701 auto hybridApplyToTree(Tree&& tree, Visitor&& visitor, Init&& init)
    \n-
    702 {
    \n-
    703 return Impl::hybridApplyToTree(tree, hybridTreePath(), visitor, init);
    \n-
    704 }
    \n-
    \n-
    705
    \n-
    706 } // namespace Experimental
    \n-
    \n-
    707
    \n-
    709 } // namespace TypeTree
    \n-
    \n-
    710} //namespace Dune
    \n-
    \n-
    711
    \n-
    712#endif // DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n-\n-
    static const result_type child_result
    Definition accumulate_static.hh:156
    \n-
    static const result_type result
    Definition accumulate_static.hh:113
    \n-\n-\n-\n+
    276 } // namespace TypeTree
    \n+
    277} //namespace Dune
    \n+
    278
    \n+
    279#endif // DUNE_TYPETREE_TRAVERSAL_HH
    \n+\n+\n+\n+\n+
    void forEachNode(Tree &&tree, NodeFunc &&nodeFunc)
    Traverse tree and visit each node.
    Definition traversal.hh:254
    \n+
    constexpr auto leafTreePathTuple()
    Create tuple of tree paths to leafs.
    Definition traversal.hh:218
    \n+
    void forEachLeafNode(Tree &&tree, LeafFunc &&leafFunc)
    Traverse tree and visit each leaf node.
    Definition traversal.hh:269
    \n+
    void applyToTree(Tree &&tree, Visitor &&visitor)
    Apply visitor to TypeTree.
    Definition traversal.hh:239
    \n
    typename impl::_Child< Node, indices... >::type Child
    Template alias for the type of a child node given by a list of child indices.
    Definition childextraction.hh:225
    \n
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n-
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n
    Definition accumulate_static.hh:16
    \n-
    Statically combine two values of type result_type using ||.
    Definition accumulate_static.hh:27
    \n-
    Definition accumulate_static.hh:30
    \n-
    static const result_type result
    Definition accumulate_static.hh:31
    \n-
    Statically combine two values of type result_type using &&.
    Definition accumulate_static.hh:38
    \n-
    Definition accumulate_static.hh:41
    \n-
    static const result_type result
    Definition accumulate_static.hh:42
    \n-
    Statically combine two values of type result_type using +.
    Definition accumulate_static.hh:49
    \n-
    Definition accumulate_static.hh:52
    \n-
    static const result_type result
    Definition accumulate_static.hh:53
    \n-
    Statically combine two values of type result_type using -.
    Definition accumulate_static.hh:60
    \n-
    Definition accumulate_static.hh:63
    \n-
    static const result_type result
    Definition accumulate_static.hh:64
    \n-
    Statically combine two values of type result_type using *.
    Definition accumulate_static.hh:71
    \n-
    Definition accumulate_static.hh:74
    \n-
    static const result_type result
    Definition accumulate_static.hh:75
    \n-
    Statically combine two values of type result_type by returning their minimum.
    Definition accumulate_static.hh:82
    \n-
    Definition accumulate_static.hh:85
    \n-
    static const result_type result
    Definition accumulate_static.hh:86
    \n-
    Statically combine two values of type result_type by returning their maximum.
    Definition accumulate_static.hh:93
    \n-
    Definition accumulate_static.hh:96
    \n-
    static const result_type result
    Definition accumulate_static.hh:97
    \n-
    Statically accumulate a value over the nodes of a TypeTree.
    Definition accumulate_static.hh:262
    \n-
    Functor::result_type result_type
    The result type of the computation.
    Definition accumulate_static.hh:265
    \n-
    static const result_type result
    The accumulated result of the computation.
    Definition accumulate_static.hh:268
    \n-
    Definition accumulate_static.hh:469
    \n-
    ParentChildReduction parent_child_reduction
    Definition accumulate_static.hh:527
    \n-
    Functor functor
    Definition accumulate_static.hh:498
    \n-
    StartType start_type
    Definition accumulate_static.hh:535
    \n-
    ReductionAlgorithm reduction_strategy
    Definition accumulate_static.hh:541
    \n-
    Reduction sibling_reduction
    Definition accumulate_static.hh:519
    \n-
    Statically accumulate a type over the nodes of a TypeTree.
    Definition accumulate_static.hh:556
    \n-
    accumulate_type< Tree, Policy, typenamePolicy::start_type, HybridTreePath<>, NodeTag< Tree > >::type type
    The accumulated result of the computation.
    Definition accumulate_static.hh:565
    \n-
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n+
    void forEachNode(T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc &&postFunc)
    Definition traversal.hh:164
    \n+
    decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u))) DynamicTraversalConcept
    Definition traversal.hh:43
    \n+
    decltype((std::integral_constant< std::size_t, Tree::degree()>{})) StaticTraversalConcept
    Definition traversal.hh:49
    \n+
    void applyToTree(T &&tree, TreePath treePath, V &&visitor)
    Definition traversal.hh:97
    \n+
    constexpr auto leafTreePathTuple(Prefix prefix)
    Definition traversal.hh:54
    \n+
    Type
    Definition treepath.hh:106
    \n+
    @ dynamic
    Definition treepath.hh:106
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,592 +1,299 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-accumulate_static.hh\n+traversal.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n-7#define DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n+6#ifndef DUNE_TYPETREE_TRAVERSAL_HH\n+7#define DUNE_TYPETREE_TRAVERSAL_HH\n 8\n-9#include \n-10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-14\n-15\n-_\b1_\b6namespace _\bD_\bu_\bn_\be {\n-_\b1_\b7 namespace TypeTree {\n+9#include \n+10\n+11#include \n+12#include \n+13\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n 18\n-25 template\n-_\b2_\b6 struct _\bo_\br_\b_\n-27 {\n-28 template\n-_\b2_\b9 struct _\br_\be_\bd_\bu_\bc_\be\n+19namespace _\bD_\bu_\bn_\be {\n+20 namespace TypeTree {\n+21\n+27#ifndef DOXYGEN\n+29 struct NoOp\n 30 {\n-_\b3_\b1 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 || r2;\n-32 };\n+31 template\n+32 constexpr void operator()(T&&...) const { /* do nothing */ }\n 33 };\n-34\n-36 template\n-_\b3_\b7 struct _\ba_\bn_\bd_\b_\n-38 {\n-39 template\n-_\b4_\b0 struct _\br_\be_\bd_\bu_\bc_\be\n-41 {\n-_\b4_\b2 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 && r2;\n-43 };\n-44 };\n-45\n-47 template\n-_\b4_\b8 struct _\bp_\bl_\bu_\bs\n-49 {\n-50 template\n-_\b5_\b1 struct _\br_\be_\bd_\bu_\bc_\be\n-52 {\n-_\b5_\b3 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 + r2;\n-54 };\n-55 };\n-56\n-58 template\n-_\b5_\b9 struct _\bm_\bi_\bn_\bu_\bs\n-60 {\n-61 template\n-_\b6_\b2 struct _\br_\be_\bd_\bu_\bc_\be\n-63 {\n-_\b6_\b4 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 - r2;\n-65 };\n-66 };\n-67\n-69 template\n-_\b7_\b0 struct _\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-71 {\n-72 template\n-_\b7_\b3 struct _\br_\be_\bd_\bu_\bc_\be\n-74 {\n-_\b7_\b5 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 * r2;\n-76 };\n-77 };\n-78\n-80 template\n-_\b8_\b1 struct _\bm_\bi_\bn\n-82 {\n-83 template\n-_\b8_\b4 struct _\br_\be_\bd_\bu_\bc_\be\n-85 {\n-_\b8_\b6 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 < r2 ? r1 : r2;\n-87 };\n-88 };\n-89\n-91 template\n-_\b9_\b2 struct _\bm_\ba_\bx\n-93 {\n-94 template\n-_\b9_\b5 struct _\br_\be_\bd_\bu_\bc_\be\n-96 {\n-_\b9_\b7 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 > r2 ? r1 : r2;\n-98 };\n-99 };\n-100\n+34#endif\n+35\n+36 namespace Detail {\n+37\n+38 // SFINAE template check that Tree has a degree() function and a child()\n+function accepting integer indices\n+39 template\n+_\b4_\b0 using _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((\n+41 std::declval().degree(),\n+42 std::declval().child(0u)\n+43 ));\n+44\n+45 // SFINAE template check that Tree has static (constexpr) function Tree::\n+degree()\n+46 template\n+_\b4_\b7 using _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((\n+48 std::integral_constant{}\n+49 ));\n+50\n+51\n+52 template = 0>\n+_\b5_\b4 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix)\n+55 {\n+56 return std::make_tuple(prefix);\n+57 }\n+58\n+59 template = 0>\n+61 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix);\n+62\n+63 template = 0>\n+_\b6_\b5 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix, std::\n+index_sequence)\n+66 {\n+67 return std::tuple_cat(_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be<_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:\n+_\bC_\bh_\bi_\bl_\bd_\b<_\bT_\br_\be_\be_\b,_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b>, pathType>(_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(prefix, Dune::\n+index_constant{}))...);\n+68 }\n+69\n+70 template\n+= 0>\n+72 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix, std::\n+index_sequence)\n+73 {\n+74 return std::tuple_cat(_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be<_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:\n+_\bC_\bh_\bi_\bl_\bd_\b<_\bT_\br_\be_\be_\b,_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b>, pathType>(_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(prefix, indices))...);\n+75 }\n+76\n+77 template>\n+79 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix)\n+80 {\n+81 return Detail::leafTreePathTuple(prefix, std::\n+make_index_sequence{});\n+82 }\n+83\n+84 /* The signature is the same as for the public applyToTree\n+85 * function in Dune::Typetree, despite the additionally passed\n+86 * treePath argument. The path passed here is associated to\n+87 * the tree and the relative paths of the children (wrt. to tree)\n+88 * are appended to this. Hence the behavior of the public function\n+89 * is resembled by passing an empty treePath.\n+90 */\n+91\n+92 /*\n+93 * This is the overload for leaf traversal\n+94 */\n+95 template::isLeaf, int> = 0>\n+_\b9_\b7 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n+98 {\n+99 visitor.leaf(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+100 }\n 101\n-102 namespace {\n-103\n-104 // implementation of the traversal algorithm\n-105\n-107 template\n-108 struct accumulate_node_helper\n-109 {\n-110\n-111 typedef typename Functor::result_type result_type;\n+102 /*\n+103 * This is the general overload doing child traversal.\n+104 */\n+105 template::isLeaf, int> = 0>\n+107 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n+108 {\n+109 using Tree = std::remove_reference_t;\n+110 using Visitor = std::remove_reference_t;\n+111 visitor.pre(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n 112\n-_\b1_\b1_\b3 static const result_type _\br_\be_\bs_\bu_\bl_\bt = current_value;\n-114\n-115 };\n+113 // check which type of traversal is supported by the tree\n+114 using allowDynamicTraversal = Dune::Std::\n+is_detected;\n+115 using allowStaticTraversal = Dune::Std::\n+is_detected;\n 116\n-118 template\n-119 struct\n-accumulate_node_helper\n-120 {\n-121\n-122 typedef typename Functor::result_type result_type;\n-123\n-124 static const result_type _\br_\be_\bs_\bu_\bl_\bt = Reduction::template\n-reduce::result>::result;\n-125\n-126 };\n-127\n-129 template\n-130 struct accumulate_value;\n-131\n-133 template\n-134 struct\n-accumulate_value\n-135 {\n-136\n-137 typedef typename Functor::result_type result_type;\n-138\n-139 static const result_type _\br_\be_\bs_\bu_\bl_\bt =\n-140\n-141\n-accumulate_node_helper::value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n+117 // the tree must support either dynamic or static traversal\n+118 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n+119\n+120 // the visitor may specify preferred dynamic traversal\n+121 using preferDynamicTraversal = std::bool_constant;\n+122\n+123 // create a dynamic or static index range\n+124 auto indices = [&]{\n+125 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)\n+126 return Dune::range(std::size_t(tree.degree()));\n+127 else\n+128 return Dune::range(tree.degree());\n+129 }();\n+130\n+131 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {\n+132 Hybrid::forEach(indices, [&](auto i) {\n+133 auto&& _\bc_\bh_\bi_\bl_\bd = tree.child(i);\n+134 using _\bC_\bh_\bi_\bl_\bd = std::decay_t;\n+135\n+136 visitor.beforeChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+137\n+138 // This requires that visitor.in(...) can always be instantiated,\n+139 // even if there's a single child only.\n+140 if (i>0)\n+141 visitor.in(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n 142\n-143 };\n-144\n-146 template\n-147 struct accumulate_over_children\n-148 {\n-149\n-150 typedef typename Functor::result_type result_type;\n-151\n-152 typedef decltype(_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(TreePath{},index_constant{}))\n-child_tree_path;\n-153\n-154 typedef typename Node::template _\bC_\bh_\bi_\bl_\bd::Type child;\n-155\n-_\b1_\b5_\b6 static const result_type child_result =\n-accumulate_value>::\n-result;\n-157\n-158 static const result_type result =\n-accumulate_over_children::\n-result;\n-159\n-160 };\n-161\n-163 template\n-164 struct\n-accumulate_over_children\n+143 constexpr bool visitChild = Visitor::template\n+VisitChild::value;\n+144 if constexpr(visitChild) {\n+145 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+146 _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(_\bc_\bh_\bi_\bl_\bd, childTreePath, visitor);\n+147 }\n+148\n+149 visitor.afterChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+150 });\n+151 }\n+152 visitor.post(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+153 }\n+154\n+155 /* Traverse tree and visit each node. The signature is the same\n+156 * as for the public forEachNode function in Dune::Typtree,\n+157 * despite the additionally passed treePath argument. The path\n+158 * passed here is associated to the tree and the relative\n+159 * paths of the children (wrt. to tree) are appended to this.\n+160 * Hence the behavior of the public function is resembled\n+161 * by passing an empty treePath.\n+162 */\n+163 template\n+_\b1_\b6_\b4 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, PreFunc&& preFunc, LeafFunc&&\n+leafFunc, PostFunc&& postFunc)\n 165 {\n-166\n-167 typedef typename Functor::result_type result_type;\n-168\n-169 static const result_type _\br_\be_\bs_\bu_\bl_\bt = current_value;\n-170\n-171 };\n-172\n-175 template\n-176 struct accumulate_value_generic_composite_node\n-177 {\n+166 using Tree = std::decay_t;\n+167 if constexpr(Tree::isLeaf) {\n+168 leafFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+169 } else {\n+170 preFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+171\n+172 // check which type of traversal is supported by the tree, prefer dynamic\n+traversal\n+173 using allowDynamicTraversal = Dune::Std::\n+is_detected;\n+174 using allowStaticTraversal = Dune::Std::\n+is_detected;\n+175\n+176 // the tree must support either dynamic or static traversal\n+177 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n 178\n-179 typedef typename Functor::result_type result_type;\n-180\n-181 static const result_type _\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bs_\bu_\bl_\bt =\n-accumulate_over_children::\n-value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n-182\n-183 static const result_type _\br_\be_\bs_\bu_\bl_\bt =\n-184\n-accumulate_node_helper::value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n-185\n-186\n-187 };\n-188\n-190 template\n-191 struct\n-accumulate_value\n-192 : public\n-accumulate_value_generic_composite_node\n-193 {};\n-194\n-196 template\n-197 struct\n-accumulate_value\n-198 : public\n-accumulate_value_generic_composite_node\n-199 {};\n-200\n-201 } // anonymous namespace\n-202\n-204\n-260 template\n-_\b2_\b6_\b1 struct _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be\n-262 {\n-263\n-_\b2_\b6_\b5 typedef typename Functor::result_type _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be;\n-266\n-_\b2_\b6_\b8 static const _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be _\br_\be_\bs_\bu_\bl_\bt =\n-accumulate_value,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>>_\b:_\b:\n-_\br_\be_\bs_\bu_\bl_\bt;\n-269\n-270 };\n-271\n-274 struct flattened_reduction;\n+179 if constexpr(allowDynamicTraversal::value) {\n+180 // Specialization for dynamic traversal\n+181 for (std::size_t i = 0; i < tree.degree(); ++i) {\n+182 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+183 _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);\n+184 }\n+185 } else if constexpr(allowStaticTraversal::value) {\n+186 // Specialization for static traversal\n+187 auto indices = std::make_index_sequence{};\n+188 Hybrid::forEach(indices, [&](auto i) {\n+189 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+190 _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);\n+191 });\n+192 }\n+193 postFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+194 }\n+195 }\n+196\n+197 } // namespace Detail\n+198\n+199\n+200 /\n+/\n+********************************************************************************\n+201 // Public Interface\n+202 /\n+/\n+********************************************************************************\n+203\n+217 template\n+_\b2_\b1_\b8 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be()\n+219 {\n+220 return Detail::leafTreePathTuple, pathType>\n+(_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh());\n+221 }\n+222\n+224\n+238 template\n+_\b2_\b3_\b9 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(Tree&& tree, Visitor&& visitor)\n+240 {\n+241 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor);\n+242 }\n+243\n+253 template\n+_\b2_\b5_\b4 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(Tree&& tree, NodeFunc&& nodeFunc)\n+255 {\n+256 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), nodeFunc, nodeFunc, NoOp{});\n+257 }\n+258\n+268 template\n+_\b2_\b6_\b9 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be(Tree&& tree, LeafFunc&& leafFunc)\n+270 {\n+271 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), NoOp{}, leafFunc, NoOp{});\n+272 }\n+273\n 275\n-278 struct bottom_up_reduction;\n-279\n-280 namespace {\n-281\n-282 // implementation of the traversal algorithm\n-283\n-286 template\n-287 struct accumulate_type_node_helper\n-288 {\n-289\n-290 typedef current_type type;\n-291\n-292 };\n-293\n-295 template\n-296 struct\n-accumulate_type_node_helper\n-297 {\n-298\n-299 typedef typename Reduction::template reduce<\n-300 current_type,\n-301 typename Functor::template visit<\n-302 Node,\n-303 TreePath\n-304 >::type\n-305 >::type type;\n-306\n-307 };\n-308\n-310 template\n-311 struct accumulate_type;\n-312\n-314 template\n-315 struct accumulate_type\n-316 {\n-317\n-318 typedef typename accumulate_type_node_helper<\n-319 LeafNode,\n-320 typename Policy::functor,\n-321 typename Policy::sibling_reduction,\n-322 current_type,\n-323 TreePath,\n-324 Policy::functor::template doVisit<\n-325 LeafNode,\n-326 TreePath>::value\n-327 >::type type;\n-328\n-329 };\n-330\n-331\n-334 template\n-335 struct propagate_type_down_tree;\n-336\n-338 template\n-339 struct propagate_type_down_tree<\n-340 current_type,\n-341 tree_path,\n-342 start_type,\n-343 bottom_up_reduction\n-344 >\n-345 {\n-346 typedef current_type type;\n-347 };\n-348\n-350 template\n-351 struct propagate_type_down_tree<\n-352 current_type,\n-353 tree_path,\n-354 start_type,\n-355 flattened_reduction\n-356 >\n-357 {\n-358 typedef typename std::conditional<\n-359 TreePathBack::value == 0,\n-360 start_type,\n-361 current_type\n-362 >::type type;\n-363 };\n-364\n-365\n-367 template\n-368 struct accumulate_type_over_children\n-369 {\n-370\n-371 typedef decltype(_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(TreePath{},index_constant{}))\n-child_tree_path;\n-372\n-373 typedef typename Node::template Child::Type child;\n-374\n-375 typedef typename accumulate_type<\n-376 child,\n-377 Policy,\n-378 // apply reduction choice (flat / hierarchic)\n-379 typename propagate_type_down_tree<\n-380 current_type,\n-381 child_tree_path,\n-382 typename Policy::start_type,\n-383 typename Policy::reduction_strategy\n-384 >::type,\n-385 child_tree_path,\n-386 NodeTag\n-387 >::type child_result_type;\n-388\n-389 typedef typename accumulate_type_over_children<\n-390 Node,\n-391 Policy,\n-392 child_result_type,\n-393 TreePath,\n-394 i+1,\n-395 n\n-396 >::type type;\n-397\n-398 };\n-399\n-401 template\n-402 struct accumulate_type_over_children\n-403 {\n-404\n-405 typedef current_type type;\n-406\n-407 };\n-408\n-409\n-412 template\n-413 struct accumulate_type_generic_composite_node\n-414 {\n-415\n-416 typedef typename accumulate_type_over_children<\n-417 Node,\n-418 Policy,\n-419 current_type,\n-420 TreePath,\n-421 0,\n-422 StaticDegree::value\n-423 >::type children_result_type;\n-424\n-425 typedef typename accumulate_type_node_helper<\n-426 Node,\n-427 typename Policy::functor,\n-428 typename Policy::parent_child_reduction,\n-429 children_result_type,\n-430 TreePath,\n-431 Policy::functor::template doVisit<\n-432 Node,\n-433 TreePath\n-434 >::value\n-435 >::type type;\n-436\n-437 };\n-438\n-440 template\n-441 struct accumulate_type\n-442 : public\n-accumulate_type_generic_composite_node\n-443 {};\n-444\n-446 template\n-447 struct\n-accumulate_type\n-448 : public\n-accumulate_type_generic_composite_node\n-449 {};\n-450\n-451 } // anonymous namespace\n-452\n-453\n-461 template<\n-462 typename Functor,\n-463 typename Reduction,\n-464 typename StartType,\n-465 typename ParentChildReduction = Reduction,\n-466 typename ReductionAlgorithm = flattened_reduction\n-467 >\n-_\b4_\b6_\b8 struct _\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by\n-469 {\n-470\n-_\b4_\b9_\b8 typedef Functor _\bf_\bu_\bn_\bc_\bt_\bo_\br;\n-499\n-_\b5_\b1_\b9 typedef Reduction _\bs_\bi_\bb_\bl_\bi_\bn_\bg_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-520\n-_\b5_\b2_\b7 typedef ParentChildReduction _\bp_\ba_\br_\be_\bn_\bt_\b__\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-528\n-_\b5_\b3_\b5 typedef StartType _\bs_\bt_\ba_\br_\bt_\b__\bt_\by_\bp_\be;\n-536\n-_\b5_\b4_\b1 typedef ReductionAlgorithm _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b__\bs_\bt_\br_\ba_\bt_\be_\bg_\by;\n-542 };\n-543\n-544\n-546\n-554 template\n-_\b5_\b5_\b5 struct _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be\n-556 {\n-557\n-559 typedef typename accumulate_type<\n-560 Tree,\n-561 Policy,\n-562 typename Policy::start_type,\n-563 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b>,\n-564 _\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>\n-_\b5_\b6_\b5 >::type _\bt_\by_\bp_\be;\n-566\n-567 };\n-568\n-569\n-570\n-571\n-572\n-573 /***************************************************/\n-574\n-_\b5_\b7_\b5 namespace Experimental {\n-576 namespace Impl {\n-577\n-579 template::isLeaf, int> = 0>\n-581 auto hybridApplyToTree(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor, U&&\n-current_val)\n-582 {\n-583 return visitor.leaf(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::forward(current_val));\n-584 }\n-585\n-587 template::isLeaf, int> = 0>\n-589 auto hybridApplyToTree(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor, U&&\n-current_val)\n-590 {\n-591 using Tree = std::remove_reference_t;\n-592 using Visitor = std::remove_reference_t;\n-593 auto pre_val = visitor.pre(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::forward(current_val));\n-594\n-595 // check which type of traversal is supported by the tree\n-596 using allowDynamicTraversal = Dune::Std::is_detected;\n-597 using allowStaticTraversal = Dune::Std::is_detected;\n-598\n-599 // the tree must support either dynamic or static traversal\n-600 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n-601\n-602 // the visitor may specify preferred dynamic traversal\n-603 using preferDynamicTraversal = std::bool_constant;\n-604\n-605 // declare rule that applies visitor and current value to a child i.\n-Returns next value\n-606 auto apply_i = [&](auto&& value, const auto& i){\n-607 auto&& _\bc_\bh_\bi_\bl_\bd = tree.child(i);\n-608 using _\bC_\bh_\bi_\bl_\bd = std::decay_t;\n-609\n-610 auto val_before = visitor.beforeChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i, std::move\n-(value));\n-611\n-612 // visits between children\n-613 auto val_in = Hybrid::ifElse(\n-614 Hybrid::equal_to(i,Indices::_0),\n-615 [&](auto id){return std::move(val_before);},\n-616 [&](auto id){return visitor.in(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::move(val_before));}\n-617 );\n-618\n-619 constexpr bool visitChild = Visitor::template\n-VisitChild::value;\n-620 auto val_visit = [&](){\n-621 if constexpr (visitChild) {\n-622 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-623 return hybridApplyToTree(_\bc_\bh_\bi_\bl_\bd, childTreePath, visitor, std::move(val_in));\n-624 }\n-625 else\n-626 return std::move(val_in);\n-627 }();\n-628\n-629 return visitor.afterChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i, std::move(val_visit));\n-630 };\n-631\n-632 // apply visitor to children\n-633 auto in_val = [&](){\n-634 if constexpr (allowStaticTraversal::value && not preferDynamicTraversal::\n-value) {\n-635 // get list of static indices\n-636 auto indices = std::make_index_sequence{};\n-637\n-638 // unfold apply_i left to right\n-639 return unpackIntegerSequence([&](auto... i) {\n-659 return left_fold(std::move(apply_i),std::move(pre_val), i...);\n-660 }, indices);\n-661\n-662 } else {\n-663 // unfold first child to get type\n-664 auto i_val = apply_i(std::move(pre_val),std::size_t{0});\n-665 // dynamically loop rest of the children to accumulate remindng values\n-666 for(std::size_t i = 1; i < tree.degree(); i++)\n-667 i_val = apply_i(i_val,i);\n-668 return i_val;\n-669 }\n-670 }();\n-671\n-672 return visitor.post(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, in_val);\n-673 }\n-674\n-675 }\n-676\n-700 template\n-_\b7_\b0_\b1 auto hybridApplyToTree(Tree&& tree, Visitor&& visitor, Init&& init)\n-702 {\n-703 return Impl::hybridApplyToTree(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor, init);\n-704 }\n-705\n-706 } // namespace Experimental\n-707\n-709 } // namespace TypeTree\n-710} //namespace Dune\n-711\n-712#endif // DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bs_\bu_\bl_\bt\n-static const result_type child_result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:156\n-_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n-_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+276 } // namespace TypeTree\n+277} //namespace Dune\n+278\n+279#endif // DUNE_TYPETREE_TRAVERSAL_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh\n+_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be\n+void forEachNode(Tree &&tree, NodeFunc &&nodeFunc)\n+Traverse tree and visit each node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be\n+constexpr auto leafTreePathTuple()\n+Create tuple of tree paths to leafs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n+void forEachLeafNode(Tree &&tree, LeafFunc &&leafFunc)\n+Traverse tree and visit each leaf node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n+void applyToTree(Tree &&tree, Visitor &&visitor)\n+Apply visitor to TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:239\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n typename impl::_Child< Node, indices... >::type Child\n Template alias for the type of a child node given by a list of child indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n ImplementationDefined child(Node &&node, Indices... indices)\n Extracts the child of a node given by a sequence of compile-time and run-time\n indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-typename std::decay_t< Node >::NodeTag NodeTag\n-Returns the node tag of the given Node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n T... > &tp, std::size_t i)\n Appends a run time index to a HybridTreePath.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto hybridTreePath(const T &... t)\n@@ -594,105 +301,33 @@\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto treePath(const T &... t)\n Constructs a new HybridTreePath from the given indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b_\n-Statically combine two values of type result_type using ||.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b_\n-Statically combine two values of type result_type using &&.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs\n-Statically combine two values of type result_type using +.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs\n-Statically combine two values of type result_type using -.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-Statically combine two values of type result_type using *.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn\n-Statically combine two values of type result_type by returning their minimum.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx\n-Statically combine two values of type result_type by returning their maximum.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be\n-Statically accumulate a value over the nodes of a TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n-Functor::result_type result_type\n-The result type of the computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-The accumulated result of the computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bp_\ba_\br_\be_\bn_\bt_\b__\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n-ParentChildReduction parent_child_reduction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:527\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bf_\bu_\bn_\bc_\bt_\bo_\br\n-Functor functor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bs_\bt_\ba_\br_\bt_\b__\bt_\by_\bp_\be\n-StartType start_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b__\bs_\bt_\br_\ba_\bt_\be_\bg_\by\n-ReductionAlgorithm reduction_strategy\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bs_\bi_\bb_\bl_\bi_\bn_\bg_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n-Reduction sibling_reduction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be\n-Statically accumulate a type over the nodes of a TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:556\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n-accumulate_type< Tree, Policy, typenamePolicy::start_type, HybridTreePath<>,\n-NodeTag< Tree > >::type type\n-The accumulated result of the computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:565\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-A hybrid version of TreePath that supports both compile time and run time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be\n+void forEachNode(T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc\n+&&leafFunc, PostFunc &&postFunc)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt\n+decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u)))\n+DynamicTraversalConcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt\n+decltype((std::integral_constant< std::size_t, Tree::degree()>{}))\n+StaticTraversalConcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n+void applyToTree(T &&tree, TreePath treePath, V &&visitor)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be\n+constexpr auto leafTreePathTuple(Prefix prefix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n+Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n+@ dynamic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00035.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00035.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: simpletransformationdescriptors.hh File Reference\n+dune-typetree: visitor.hh File Reference\n \n \n \n \n \n \n \n@@ -71,49 +71,109 @@\n \n
    \n
    \n
    \n \n-
    simpletransformationdescriptors.hh File Reference
    \n+Namespaces |\n+Functions |\n+Variables
    \n+
    visitor.hh File Reference
    \n \n
    \n-
    #include <array>
    \n-#include <memory>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include <dune/typetree/treepath.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::SimpleLeafNodeTransformation< SourceNode, Transformation, TransformedNode >
    struct  Dune::TypeTree::DefaultVisitor
     Visitor interface and base class for TypeTree visitors. More...
     
    struct  Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode >
    struct  Dune::TypeTree::DefaultPairVisitor
     Visitor interface and base class for visitors of pairs of TypeTrees. More...
     
    struct  Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
    struct  Dune::TypeTree::Experimental::DefaultHybridVisitor
     Hybrid visitor interface and base class for TypeTree hybrid visitors. More...
     
    struct  Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
    struct  Dune::TypeTree::VisitDirectChildren
     Mixin base class for visitors that only want to visit the direct children of a node. More...
     
    struct  Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
    struct  Dune::TypeTree::VisitDirectChildren::VisitChild< Node1, Child1, Node2, Child2, TreePath >
     Template struct for determining whether or not to visit a given child. More...
     
    struct  Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >
    struct  Dune::TypeTree::VisitTree
     Mixin base class for visitors that want to visit the complete tree. More...
     
    struct  Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC >
    struct  Dune::TypeTree::VisitTree::VisitChild< Node1, Child1, Node2, Child2, TreePath >
     Template struct for determining whether or not to visit a given child. More...
     
    struct  Dune::TypeTree::StaticTraversal
     Mixin base class for visitors that require a static TreePath during traversal. More...
     
    struct  Dune::TypeTree::DynamicTraversal
     Mixin base class for visitors that only need a dynamic TreePath during traversal. More...
     
    struct  Dune::TypeTree::TreeVisitor
     Convenience base class for visiting the entire tree. More...
     
    struct  Dune::TypeTree::DirectChildrenVisitor
     Convenience base class for visiting the direct children of a node. More...
     
    struct  Dune::TypeTree::TreePairVisitor
     Convenience base class for visiting an entire tree pair. More...
     
    struct  Dune::TypeTree::DirectChildrenPairVisitor
     Convenience base class for visiting the direct children of a node pair. More...
     
    struct  Dune::TypeTree::Experimental::Info::LeafCounterVisitor
     
    struct  Dune::TypeTree::Experimental::Info::NodeCounterVisitor
     
    struct  Dune::TypeTree::Experimental::Info::DepthVisitor
     
    \n \n \n \n \n \n+\n+\n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::Experimental
     
    namespace  Dune::TypeTree::Experimental::Info
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Functions

    template<typename Tree >
    auto Dune::TypeTree::Experimental::Info::depth (const Tree &tree)
     The depth of the TypeTree.
     
    template<typename Tree >
    constexpr auto Dune::TypeTree::Experimental::Info::depth ()
     The depth of the Tree.
     
    template<typename Tree >
    auto Dune::TypeTree::Experimental::Info::nodeCount (const Tree &tree)
     The total number of nodes in the Tree.
     
    template<typename Tree >
    auto Dune::TypeTree::Experimental::Info::leafCount (const Tree &tree)
     The number of leaf nodes in the Tree.
     
    \n+\n+\n+\n+\n+\n

    \n+Variables

    template<typename Tree >
    constexpr bool Dune::TypeTree::Experimental::Info::isDynamic = std::is_same<std::size_t, decltype(leafCount(std::declval<Tree>()))>{}
     true if any of the nodes in the tree only has dynamic degree.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,106 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-simpletransformationdescriptors.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+visitor.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Visitor interface and base class for _\bT_\by_\bp_\be_\bT_\br_\be_\be visitors. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Visitor interface and base class for visitors of pairs of TypeTrees.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Hybrid visitor interface and base class for _\bT_\by_\bp_\be_\bT_\br_\be_\be hybrid visitors.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+\u00a0 Mixin base class for visitors that only want to visit the direct\n+ children of a node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bN_\bo_\bd_\be_\b1_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b1_\b,_\b _\bN_\bo_\bd_\be_\b2_\b,\n+ _\bC_\bh_\bi_\bl_\bd_\b2_\b,_\b _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b _\b>\n+\u00a0 Template struct for determining whether or not to visit a given child.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+\u00a0 Mixin base class for visitors that want to visit the complete tree.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bN_\bo_\bd_\be_\b1_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b1_\b,_\b _\bN_\bo_\bd_\be_\b2_\b,_\b _\bC_\bh_\bi_\bl_\bd_\b2_\b,\n+ _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b _\b>\n+\u00a0 Template struct for determining whether or not to visit a given child.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+\u00a0 Mixin base class for visitors that require a static TreePath during\n+ traversal. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+\u00a0 Mixin base class for visitors that only need a dynamic TreePath during\n+ traversal. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Convenience base class for visiting the entire tree. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Convenience base class for visiting the direct children of a node.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Convenience base class for visiting an entire tree pair. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 Convenience base class for visiting the direct children of a node\n+ pair. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh (const Tree &tree)\n+\u00a0 The depth of the _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n+\u00a0\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh ()\n+\u00a0 The depth of the Tree.\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt (const Tree\n+ &tree)\n+\u00a0 The total number of nodes in the Tree.\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt (const Tree\n+ &tree)\n+\u00a0 The number of leaf nodes in the Tree.\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+template\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc = std::\n+ is_same()))>\n+ {}\n+\u00a0 true if any of the nodes in the tree only has dynamic degree.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00035_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00035_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: simpletransformationdescriptors.hh Source File\n+dune-typetree: visitor.hh Source File\n \n \n \n \n \n \n \n@@ -74,209 +74,385 @@\n \n
    \n \n
    \n
    \n
    \n-
    simpletransformationdescriptors.hh
    \n+
    visitor.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n-
    7#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n+
    6#ifndef DUNE_TYPETREE_VISITOR_HH
    \n+
    7#define DUNE_TYPETREE_VISITOR_HH
    \n
    8
    \n-
    9#include <array>
    \n-
    10#include <memory>
    \n+\n+
    10#include <dune/common/hybridutilities.hh>
    \n
    11
    \n-\n-\n-
    14#include <dune/common/exceptions.hh>
    \n-
    15
    \n-
    16
    \n-
    17namespace Dune {
    \n-
    18 namespace TypeTree {
    \n-
    19
    \n-
    25 template<typename SourceNode, typename Transformation, typename TransformedNode>
    \n-
    \n-\n-
    27 {
    \n-
    28
    \n-
    29 static const bool recursive = false;
    \n-
    30
    \n-
    31 typedef TransformedNode transformed_type;
    \n-
    32 typedef std::shared_ptr<transformed_type> transformed_storage_type;
    \n-
    33
    \n-
    \n-
    34 static transformed_type transform(const SourceNode& s, const Transformation& t)
    \n-
    35 {
    \n-
    36 return transformed_type();
    \n-
    37 }
    \n-
    \n-
    38
    \n-
    \n-
    39 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n-
    40 {
    \n-
    41 return std::make_shared<transformed_type>();
    \n-
    42 }
    \n-
    \n-
    43
    \n-
    44 };
    \n-
    \n-
    45
    \n-
    46
    \n-
    47 template<typename SourceNode, typename Transformation, template<typename Child, std::size_t> class TransformedNode>
    \n+
    12namespace Dune {
    \n+
    13 namespace TypeTree {
    \n+
    14
    \n+
    21
    \n
    \n-\n+\n
    49 {
    \n
    50
    \n-
    51 static const bool recursive = true;
    \n
    52
    \n-
    53 template<typename TC>
    \n-
    \n-
    54 struct result
    \n-
    55 {
    \n-
    56 typedef TransformedNode<TC, StaticDegree<SourceNode>::value> type;
    \n-
    57 typedef std::shared_ptr<type> storage_type;
    \n-
    58 static const std::size_t degree = StaticDegree<type>::value;
    \n-
    59 };
    \n-
    \n-
    60
    \n-
    61 template<typename TC>
    \n-
    \n-
    62 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n-
    63 {
    \n-
    64 return typename result<TC>::type(children);
    \n-
    65 }
    \n-
    \n-
    66
    \n-
    67 template<typename TC>
    \n-
    \n-
    68 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n-
    69 {
    \n-
    70 return std::make_shared<typename result<TC>::type>(children);
    \n-
    71 }
    \n-
    \n-
    72
    \n-
    73 };
    \n-
    \n-
    74
    \n+
    59 template<typename T, typename TreePath>
    \n+
    60 void pre(T&&, TreePath) const {}
    \n+
    61
    \n+
    63
    \n+
    71 template<typename T, typename TreePath>
    \n+
    72 void in(T&&, TreePath) const {}
    \n+
    73
    \n
    75
    \n-
    76 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNode>
    \n-
    \n-\n-
    78 {
    \n-
    79
    \n-
    80 static const bool recursive = true;
    \n-
    81
    \n-
    82 template<typename TC>
    \n-
    \n-
    83 struct result
    \n-
    84 {
    \n-
    85 typedef TransformedNode<TC> type;
    \n-
    86 typedef std::shared_ptr<type> storage_type;
    \n-
    87 };
    \n-
    \n-
    88
    \n-
    89 template<typename TC>
    \n-
    \n-
    90 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n-
    91 {
    \n-
    92 return typename result<TC>::type(children);
    \n-
    93 }
    \n-
    \n+
    82 template<typename T, typename TreePath>
    \n+
    83 void post(T&&, TreePath) const {}
    \n+
    84
    \n+
    86
    \n+
    92 template<typename T, typename TreePath>
    \n+
    93 void leaf(T&&, TreePath) const {}
    \n
    94
    \n-
    95 template<typename TC>
    \n-
    \n-
    96 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n-
    97 {
    \n-
    98 return std::make_shared<typename result<TC>::type>(children);
    \n-
    99 }
    \n-
    \n-
    100
    \n-
    101 };
    \n-
    \n-
    102
    \n-
    103
    \n-
    104 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNode>
    \n-
    \n-\n-
    106 {
    \n-
    107
    \n-
    108 static const bool recursive = true;
    \n-
    109
    \n-
    110 template<typename... TC>
    \n-
    \n-
    111 struct result
    \n-
    112 {
    \n-
    113 typedef TransformedNode<TC...> type;
    \n-
    114 typedef std::shared_ptr<type> storage_type;
    \n-
    115 };
    \n-
    \n-
    116
    \n-
    117 template<typename... TC>
    \n-
    \n-
    118 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
    \n-
    119 {
    \n-
    120 return typename result<TC...>::type(children...);
    \n-
    121 }
    \n-
    \n-
    122
    \n-
    123 template<typename... TC>
    \n-
    \n-
    124 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n-
    125 {
    \n-
    126 return std::make_shared<typename result<TC...>::type>(children...);
    \n-
    127 }
    \n+
    96
    \n+
    106 template<typename T, typename Child, typename TreePath, typename ChildIndex>
    \n+
    107 void beforeChild(T&&, Child&&, TreePath, ChildIndex) const {}
    \n+
    108
    \n+
    110
    \n+
    121 template<typename T, typename Child, typename TreePath, typename ChildIndex>
    \n+
    122 void afterChild(T&&, Child&&, TreePath, ChildIndex) const {}
    \n+
    123
    \n+
    124 };
    \n
    \n+
    125
    \n+
    126
    \n
    128
    \n-
    129 };
    \n-
    \n-
    130
    \n-
    132
    \n-
    133 } // namespace TypeTree
    \n-
    134} //namespace Dune
    \n-
    135
    \n-
    136#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    \n-\n-\n-
    decltype(Node::degree()) StaticDegree
    Returns the statically known degree of the given Node type as a std::integral_constant.
    Definition nodeinterface.hh:107
    \n+
    \n+\n+
    164 {
    \n+
    165
    \n+
    167
    \n+
    175 template<typename T1, typename T2, typename TreePath>
    \n+
    176 void pre(T1&&, T2&&, TreePath) const {}
    \n+
    177
    \n+
    179
    \n+
    188 template<typename T1, typename T2, typename TreePath>
    \n+
    189 void in(T1&&, T2&&, TreePath) const {}
    \n+
    190
    \n+
    192
    \n+
    200 template<typename T1, typename T2, typename TreePath>
    \n+
    201 void post(T1&&, T2&&, TreePath) const {}
    \n+
    202
    \n+
    204
    \n+
    215 template<typename T1, typename T2, typename TreePath>
    \n+
    216 void leaf(T1&&, T2&&, TreePath) const {}
    \n+
    217
    \n+
    219
    \n+
    231 template<typename T1, typename Child1, typename T2, typename Child2, typename TreePath, typename ChildIndex>
    \n+
    232 void beforeChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const {}
    \n+
    233
    \n+
    235
    \n+
    247 template<typename T1, typename Child1, typename T2, typename Child2, typename TreePath, typename ChildIndex>
    \n+
    248 void afterChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const {}
    \n+
    249
    \n+
    250 };
    \n+
    \n+
    251
    \n+
    252
    \n+
    253 namespace Experimental {
    \n+
    254
    \n+
    \n+\n+
    286 {
    \n+
    287
    \n+
    295 template<typename T, typename TreePath, typename U>
    \n+
    296 auto pre(T&&, TreePath, const U& u) const { return u;}
    \n+
    297
    \n+
    305 template<typename T, typename TreePath, typename U>
    \n+
    306 auto in(T&&, TreePath, const U& u) const {return u;}
    \n+
    307
    \n+
    315 template<typename T, typename TreePath, typename U>
    \n+
    316 auto post(T&&, TreePath, const U& u) const {return u;}
    \n+
    317
    \n+
    325 template<typename T, typename TreePath, typename U>
    \n+
    326 auto leaf(T&&, TreePath, const U& u) const { return u;}
    \n+
    327
    \n+
    335 template<typename T, typename Child, typename TreePath, typename ChildIndex, typename U>
    \n+
    336 auto beforeChild(T&&, Child&&, TreePath, ChildIndex, const U& u) const {return u;}
    \n+
    337
    \n+
    345 template<typename T, typename Child, typename TreePath, typename ChildIndex, typename U>
    \n+
    346 auto afterChild(T&&, Child&&, TreePath, ChildIndex, const U& u) const {return u;}
    \n+
    347
    \n+
    348 };
    \n+
    \n+
    349 } // namespace Experimental
    \n+
    350
    \n+
    352
    \n+
    \n+\n+
    358 {
    \n+
    359
    \n+
    360 // the little trick with the default template arguments
    \n+
    361 // makes the class usable for both single-tree visitors
    \n+
    362 // and visitors for pairs of trees
    \n+
    364 template<typename Node1,
    \n+
    365 typename Child1,
    \n+
    366 typename Node2,
    \n+
    367 typename Child2 = void,
    \n+
    368 typename TreePath = void>
    \n+
    \n+\n+
    370 {
    \n+
    372 static const bool value = false;
    \n+
    373 };
    \n+
    \n+
    374
    \n+
    375 };
    \n+
    \n+
    376
    \n+
    377
    \n+
    379
    \n+
    \n+\n+
    384 {
    \n+
    385
    \n+
    386 // the little trick with the default template arguments
    \n+
    387 // makes the class usable for both single-tree visitors
    \n+
    388 // and visitors for pairs of trees
    \n+
    390 template<typename Node1,
    \n+
    391 typename Child1,
    \n+
    392 typename Node2,
    \n+
    393 typename Child2 = void,
    \n+
    394 typename TreePath = void>
    \n+
    \n+\n+
    396 {
    \n+
    398 static const bool value = true;
    \n+
    399 };
    \n+
    \n+
    400
    \n+
    401 };
    \n+
    \n+
    402
    \n+
    404
    \n+
    \n+\n+
    412 {
    \n+\n+
    415 };
    \n+
    \n+
    416
    \n+
    418
    \n+
    \n+\n+
    426 {
    \n+\n+
    429 };
    \n+
    \n+
    430
    \n+
    \n+\n+
    433 : public DefaultVisitor
    \n+
    434 , public VisitTree
    \n+
    435 {};
    \n+
    \n+
    436
    \n+
    \n+\n+
    439 : public DefaultVisitor
    \n+
    440 , public VisitDirectChildren
    \n+
    441 {};
    \n+
    \n+
    442
    \n+
    \n+\n+
    445 : public DefaultPairVisitor
    \n+
    446 , public VisitTree
    \n+
    447 {};
    \n+
    \n+
    448
    \n+
    \n+\n+
    451 : public DefaultPairVisitor
    \n+
    452 , public VisitDirectChildren
    \n+
    453 {};
    \n+
    \n+
    454
    \n+
    \n+
    455 namespace Experimental::Info {
    \n+
    456
    \n+
    \n+\n+
    458 : public DefaultHybridVisitor
    \n+
    459 , public StaticTraversal
    \n+
    460 , public VisitTree
    \n+
    461 {
    \n+
    462 template<class Tree, class Child, class TreePath, class ChildIndex, class U>
    \n+
    \n+
    463 auto beforeChild(Tree&&, Child&&, TreePath, ChildIndex, U u) const {
    \n+
    464 // in this case child index is an integral constant: forward u
    \n+
    465 return u;
    \n+
    466 }
    \n+
    \n+
    467
    \n+
    468 template<class Tree, class Child, class TreePath, class U>
    \n+
    \n+
    469 std::size_t beforeChild(Tree&&, Child&&, TreePath, std::size_t /*childIndex*/, U u) const {
    \n+
    470 // in this case child index is a run-time index: cast accumulated u to std::size_t
    \n+
    471 return std::size_t{u};
    \n+
    472 }
    \n+
    \n+
    473
    \n+
    474 template<class Tree, class TreePath, class U>
    \n+
    \n+
    475 auto leaf(Tree&&, TreePath, U u) const
    \n+
    476 {
    \n+
    477 return Hybrid::plus(u,Dune::Indices::_1);
    \n+
    478 }
    \n+
    \n+
    479
    \n+
    480 };
    \n+
    \n+
    481
    \n+
    \n+\n+
    483 : public LeafCounterVisitor
    \n+
    484 {
    \n+
    485 template<typename Tree, typename TreePath, typename U>
    \n+
    \n+
    486 auto pre(Tree&&, TreePath, U u) const {
    \n+
    487 return Hybrid::plus(u,Indices::_1);
    \n+
    488 }
    \n+
    \n+
    489 };
    \n+
    \n+
    490
    \n+
    \n+\n+
    492 : public DefaultHybridVisitor
    \n+
    493 , public StaticTraversal
    \n+
    494 , public VisitTree
    \n+
    495 {
    \n+
    496 template<class Tree, class TreePath, class U>
    \n+
    \n+
    497 auto leaf(Tree&&, TreePath, U u) const
    \n+
    498 {
    \n+
    499 auto path_size = index_constant<treePathSize(TreePath{})>{};
    \n+
    500 auto depth = Hybrid::plus(path_size,Indices::_1);
    \n+
    501 return Hybrid::max(depth,u);
    \n+
    502 }
    \n+
    \n+
    503 };
    \n+
    \n+
    504
    \n+
    506 // result is alwayas an integral constant
    \n+
    507 template<typename Tree>
    \n+
    \n+
    508 auto depth(const Tree& tree)
    \n+
    509 {
    \n+
    510 return hybridApplyToTree(tree,DepthVisitor{},Indices::_0);
    \n+
    511 }
    \n+
    \n+
    512
    \n+
    514 // return types is std::integral_constant.
    \n+
    515 template<typename Tree>
    \n+
    \n+
    516 constexpr auto depth()
    \n+
    517 {
    \n+
    518 return decltype(hybridApplyToTree(std::declval<Tree>(),DepthVisitor{},Indices::_0)){};
    \n+
    519 }
    \n+
    \n+
    520
    \n+
    522 // if Tree is dynamic, return type is std::size_t, otherwise std::integral_constant.
    \n+
    523 template<typename Tree>
    \n+
    \n+
    524 auto nodeCount(const Tree& tree)
    \n+
    525 {
    \n+
    526 return hybridApplyToTree(tree,NodeCounterVisitor{},Indices::_0);
    \n+
    527 }
    \n+
    \n+
    528
    \n+
    530 // if Tree is dynamic, return type is std::size_t, otherwise std::integral_constant.
    \n+
    531 template<typename Tree>
    \n+
    \n+
    532 auto leafCount(const Tree& tree)
    \n+
    533 {
    \n+
    534 return hybridApplyToTree(tree,LeafCounterVisitor{},Dune::Indices::_0);
    \n+
    535 }
    \n+
    \n+
    536
    \n+
    538 template<typename Tree>
    \n+
    539 constexpr bool isDynamic = std::is_same<std::size_t, decltype(leafCount(std::declval<Tree>()))>{};
    \n+
    540
    \n+
    541 } // namespace Experimental::Info
    \n+
    \n+
    542
    \n+
    544
    \n+
    545 } // namespace TypeTree
    \n+
    546} //namespace Dune
    \n+
    547
    \n+
    548#endif // DUNE_TYPETREE_VISITOR_HH
    \n+\n+
    typename impl::_Child< Node, indices... >::type Child
    Template alias for the type of a child node given by a list of child indices.
    Definition childextraction.hh:225
    \n+
    constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
    Returns the size (number of components) of the given HybridTreePath.
    Definition treepath.hh:334
    \n
    Definition accumulate_static.hh:16
    \n-
    Definition simpletransformationdescriptors.hh:27
    \n-
    static transformed_type transform(const SourceNode &s, const Transformation &t)
    Definition simpletransformationdescriptors.hh:34
    \n-
    static const bool recursive
    Definition simpletransformationdescriptors.hh:29
    \n-
    std::shared_ptr< transformed_type > transformed_storage_type
    Definition simpletransformationdescriptors.hh:32
    \n-
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition simpletransformationdescriptors.hh:39
    \n-
    TransformedNode transformed_type
    Definition simpletransformationdescriptors.hh:31
    \n-
    Definition simpletransformationdescriptors.hh:49
    \n-
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition simpletransformationdescriptors.hh:68
    \n-
    static const bool recursive
    Definition simpletransformationdescriptors.hh:51
    \n-
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition simpletransformationdescriptors.hh:62
    \n-
    Definition simpletransformationdescriptors.hh:55
    \n-
    TransformedNode< TC, StaticDegree< SourceNode >::value > type
    Definition simpletransformationdescriptors.hh:56
    \n-
    static const std::size_t degree
    Definition simpletransformationdescriptors.hh:58
    \n-
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:57
    \n-
    Definition simpletransformationdescriptors.hh:78
    \n-
    static const bool recursive
    Definition simpletransformationdescriptors.hh:80
    \n-
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition simpletransformationdescriptors.hh:90
    \n-
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition simpletransformationdescriptors.hh:96
    \n-
    Definition simpletransformationdescriptors.hh:84
    \n-
    TransformedNode< TC > type
    Definition simpletransformationdescriptors.hh:85
    \n-
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:86
    \n-
    Definition simpletransformationdescriptors.hh:106
    \n-
    static const bool recursive
    Definition simpletransformationdescriptors.hh:108
    \n-
    static result< TC... >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition simpletransformationdescriptors.hh:124
    \n-
    static result< TC... >::type transform(const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition simpletransformationdescriptors.hh:118
    \n-
    Definition simpletransformationdescriptors.hh:112
    \n-
    std::shared_ptr< type > storage_type
    Definition simpletransformationdescriptors.hh:114
    \n-
    TransformedNode< TC... > type
    Definition simpletransformationdescriptors.hh:113
    \n+
    auto hybridApplyToTree(Tree &&tree, Visitor &&visitor, Init &&init)
    Apply hybrid visitor to TypeTree.
    Definition accumulate_static.hh:701
    \n+
    Type
    Definition treepath.hh:106
    \n+
    @ fullyStatic
    Definition treepath.hh:106
    \n+
    @ dynamic
    Definition treepath.hh:106
    \n+
    constexpr bool isDynamic
    true if any of the nodes in the tree only has dynamic degree.
    Definition visitor.hh:539
    \n+
    auto leafCount(const Tree &tree)
    The number of leaf nodes in the Tree.
    Definition visitor.hh:532
    \n+
    auto nodeCount(const Tree &tree)
    The total number of nodes in the Tree.
    Definition visitor.hh:524
    \n+
    constexpr auto depth()
    The depth of the Tree.
    Definition visitor.hh:516
    \n+
    Visitor interface and base class for TypeTree visitors.
    Definition visitor.hh:49
    \n+
    void in(T &&, TreePath) const
    Method for infix tree traversal.
    Definition visitor.hh:72
    \n+
    void afterChild(T &&, Child &&, TreePath, ChildIndex) const
    Method for child-parent traversal.
    Definition visitor.hh:122
    \n+
    void beforeChild(T &&, Child &&, TreePath, ChildIndex) const
    Method for parent-child traversal.
    Definition visitor.hh:107
    \n+
    void post(T &&, TreePath) const
    Method for postfix tree traversal.
    Definition visitor.hh:83
    \n+
    void leaf(T &&, TreePath) const
    Method for leaf traversal.
    Definition visitor.hh:93
    \n+
    void pre(T &&, TreePath) const
    Method for prefix tree traversal.
    Definition visitor.hh:60
    \n+
    Visitor interface and base class for visitors of pairs of TypeTrees.
    Definition visitor.hh:164
    \n+
    void leaf(T1 &&, T2 &&, TreePath) const
    Method for leaf traversal.
    Definition visitor.hh:216
    \n+
    void beforeChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
    Method for parent-child traversal.
    Definition visitor.hh:232
    \n+
    void pre(T1 &&, T2 &&, TreePath) const
    Method for prefix tree traversal.
    Definition visitor.hh:176
    \n+
    void post(T1 &&, T2 &&, TreePath) const
    Method for postfix traversal.
    Definition visitor.hh:201
    \n+
    void in(T1 &&, T2 &&, TreePath) const
    Method for infix tree traversal.
    Definition visitor.hh:189
    \n+
    void afterChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
    Method for child-parent traversal.
    Definition visitor.hh:248
    \n+
    Hybrid visitor interface and base class for TypeTree hybrid visitors.
    Definition visitor.hh:286
    \n+
    auto post(T &&, TreePath, const U &u) const
    Method for postfix tree traversal.
    Definition visitor.hh:316
    \n+
    auto pre(T &&, TreePath, const U &u) const
    Method for prefix tree traversal.
    Definition visitor.hh:296
    \n+
    auto leaf(T &&, TreePath, const U &u) const
    Method for leaf traversal.
    Definition visitor.hh:326
    \n+
    auto afterChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
    Method for child-parent traversal.
    Definition visitor.hh:346
    \n+
    auto in(T &&, TreePath, const U &u) const
    Method for infix tree traversal.
    Definition visitor.hh:306
    \n+
    auto beforeChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
    Method for parent-child traversal.
    Definition visitor.hh:336
    \n+
    Mixin base class for visitors that only want to visit the direct children of a node.
    Definition visitor.hh:358
    \n+
    Template struct for determining whether or not to visit a given child.
    Definition visitor.hh:370
    \n+
    static const bool value
    Do not visit any child.
    Definition visitor.hh:372
    \n+
    Mixin base class for visitors that want to visit the complete tree.
    Definition visitor.hh:384
    \n+
    Template struct for determining whether or not to visit a given child.
    Definition visitor.hh:396
    \n+
    static const bool value
    Visit any child.
    Definition visitor.hh:398
    \n+
    Mixin base class for visitors that require a static TreePath during traversal.
    Definition visitor.hh:412
    \n+
    static const TreePathType::Type treePathType
    Use the static tree traversal algorithm.
    Definition visitor.hh:414
    \n+
    Mixin base class for visitors that only need a dynamic TreePath during traversal.
    Definition visitor.hh:426
    \n+
    static const TreePathType::Type treePathType
    Use the dynamic tree traversal algorithm.
    Definition visitor.hh:428
    \n+
    Convenience base class for visiting the entire tree.
    Definition visitor.hh:435
    \n+
    Convenience base class for visiting the direct children of a node.
    Definition visitor.hh:441
    \n+
    Convenience base class for visiting an entire tree pair.
    Definition visitor.hh:447
    \n+
    Convenience base class for visiting the direct children of a node pair.
    Definition visitor.hh:453
    \n+\n+
    auto leaf(Tree &&, TreePath, U u) const
    Definition visitor.hh:475
    \n+
    auto beforeChild(Tree &&, Child &&, TreePath, ChildIndex, U u) const
    Definition visitor.hh:463
    \n+
    std::size_t beforeChild(Tree &&, Child &&, TreePath, std::size_t, U u) const
    Definition visitor.hh:469
    \n+\n+
    auto pre(Tree &&, TreePath, U u) const
    Definition visitor.hh:486
    \n+\n+
    auto leaf(Tree &&, TreePath, U u) const
    Definition visitor.hh:497
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,253 +1,481 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-simpletransformationdescriptors.hh\n+visitor.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n-7#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n+6#ifndef DUNE_TYPETREE_VISITOR_HH\n+7#define DUNE_TYPETREE_VISITOR_HH\n 8\n-9#include \n-10#include \n+9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+10#include \n 11\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-14#include \n-15\n-16\n-17namespace _\bD_\bu_\bn_\be {\n-18 namespace TypeTree {\n-19\n-25 template\n-_\b2_\b6 struct _\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-27 {\n-28\n-_\b2_\b9 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = false;\n-30\n-_\b3_\b1 typedef TransformedNode _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b2 typedef std::shared_ptr _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-33\n-_\b3_\b4 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const Transformation&\n-t)\n-35 {\n-36 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be();\n-37 }\n-38\n-_\b3_\b9 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr s, const Transformation& t)\n-40 {\n-41 return std::make_shared();\n-42 }\n-43\n-44 };\n-45\n-46\n-47 template class TransformedNode>\n-_\b4_\b8 struct _\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+12namespace _\bD_\bu_\bn_\be {\n+13 namespace TypeTree {\n+14\n+21\n+_\b4_\b8 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n 49 {\n 50\n-_\b5_\b1 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n 52\n-53 template\n-_\b5_\b4 struct _\br_\be_\bs_\bu_\bl_\bt\n-55 {\n-_\b5_\b6 typedef TransformedNode::value> _\bt_\by_\bp_\be;\n-_\b5_\b7 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b5_\b8 static const std::size_t _\bd_\be_\bg_\br_\be_\be = _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be_\b<_\bt_\by_\bp_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n-59 };\n-60\n-61 template\n-_\b6_\b2 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>&\n-children)\n-63 {\n-64 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(children);\n-65 }\n-66\n-67 template\n-_\b6_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>& children)\n-69 {\n-70 return std::make_shared::type>(children);\n-71 }\n-72\n-73 };\n-74\n+59 template\n+_\b6_\b0 void _\bp_\br_\be(T&&, TreePath) const {}\n+61\n+63\n+71 template\n+_\b7_\b2 void _\bi_\bn(T&&, TreePath) const {}\n+73\n 75\n-76 template class TransformedNode>\n-_\b7_\b7 struct _\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-78 {\n-79\n-_\b8_\b0 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n-81\n-82 template\n-_\b8_\b3 struct _\br_\be_\bs_\bu_\bl_\bt\n-84 {\n-_\b8_\b5 typedef TransformedNode _\bt_\by_\bp_\be;\n-_\b8_\b6 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-87 };\n-88\n-89 template\n-_\b9_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, const std::vector>& children)\n-91 {\n-92 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(children);\n-93 }\n+82 template\n+_\b8_\b3 void _\bp_\bo_\bs_\bt(T&&, TreePath) const {}\n+84\n+86\n+92 template\n+_\b9_\b3 void _\bl_\be_\ba_\bf(T&&, TreePath) const {}\n 94\n-95 template\n-_\b9_\b6 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, const std::\n-vector>& children)\n-97 {\n-98 return std::make_shared::type>(children);\n-99 }\n-100\n-101 };\n-102\n-103\n-104 template class TransformedNode>\n-_\b1_\b0_\b5 struct _\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-106 {\n-107\n-_\b1_\b0_\b8 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n-109\n-110 template\n-_\b1_\b1_\b1 struct _\br_\be_\bs_\bu_\bl_\bt\n-112 {\n-_\b1_\b1_\b3 typedef TransformedNode _\bt_\by_\bp_\be;\n-_\b1_\b1_\b4 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-115 };\n-116\n-117 template\n-_\b1_\b1_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, std::shared_ptr... children)\n-119 {\n-120 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(children...);\n-121 }\n-122\n-123 template\n-_\b1_\b2_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt::storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, std::shared_ptr...\n-children)\n-125 {\n-126 return std::make_shared::type>(children...);\n-127 }\n+96\n+106 template\n+_\b1_\b0_\b7 void _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex) const {}\n+108\n+110\n+121 template\n+_\b1_\b2_\b2 void _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex) const {}\n+123\n+124 };\n+125\n+126\n 128\n-129 };\n-130\n-132\n-133 } // namespace TypeTree\n-134} //namespace Dune\n-135\n-136#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be\n-decltype(Node::degree()) StaticDegree\n-Returns the statically known degree of the given Node type as a std::\n+_\b1_\b6_\b3 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+164 {\n+165\n+167\n+175 template\n+_\b1_\b7_\b6 void _\bp_\br_\be(T1&&, T2&&, TreePath) const {}\n+177\n+179\n+188 template\n+_\b1_\b8_\b9 void _\bi_\bn(T1&&, T2&&, TreePath) const {}\n+190\n+192\n+200 template\n+_\b2_\b0_\b1 void _\bp_\bo_\bs_\bt(T1&&, T2&&, TreePath) const {}\n+202\n+204\n+215 template\n+_\b2_\b1_\b6 void _\bl_\be_\ba_\bf(T1&&, T2&&, TreePath) const {}\n+217\n+219\n+231 template\n+_\b2_\b3_\b2 void _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex)\n+const {}\n+233\n+235\n+247 template\n+_\b2_\b4_\b8 void _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex) const\n+{}\n+249\n+250 };\n+251\n+252\n+253 namespace Experimental {\n+254\n+_\b2_\b8_\b5 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+286 {\n+287\n+295 template\n+_\b2_\b9_\b6 auto _\bp_\br_\be(T&&, TreePath, const U& u) const { return u;}\n+297\n+305 template\n+_\b3_\b0_\b6 auto _\bi_\bn(T&&, TreePath, const U& u) const {return u;}\n+307\n+315 template\n+_\b3_\b1_\b6 auto _\bp_\bo_\bs_\bt(T&&, TreePath, const U& u) const {return u;}\n+317\n+325 template\n+_\b3_\b2_\b6 auto _\bl_\be_\ba_\bf(T&&, TreePath, const U& u) const { return u;}\n+327\n+335 template\n+_\b3_\b3_\b6 auto _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, const U& u) const\n+{return u;}\n+337\n+345 template\n+_\b3_\b4_\b6 auto _\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd(T&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, const U& u) const\n+{return u;}\n+347\n+348 };\n+349 } // namespace Experimental\n+350\n+352\n+_\b3_\b5_\b7 struct _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+358 {\n+359\n+360 // the little trick with the default template arguments\n+361 // makes the class usable for both single-tree visitors\n+362 // and visitors for pairs of trees\n+364 template\n+_\b3_\b6_\b9 struct _\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n+370 {\n+_\b3_\b7_\b2 static const bool _\bv_\ba_\bl_\bu_\be = false;\n+373 };\n+374\n+375 };\n+376\n+377\n+379\n+_\b3_\b8_\b3 struct _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+384 {\n+385\n+386 // the little trick with the default template arguments\n+387 // makes the class usable for both single-tree visitors\n+388 // and visitors for pairs of trees\n+390 template\n+_\b3_\b9_\b5 struct _\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n+396 {\n+_\b3_\b9_\b8 static const bool _\bv_\ba_\bl_\bu_\be = true;\n+399 };\n+400\n+401 };\n+402\n+404\n+_\b4_\b1_\b1 struct _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+412 {\n+_\b4_\b1_\b4 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc;\n+415 };\n+416\n+418\n+_\b4_\b2_\b5 struct _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+426 {\n+_\b4_\b2_\b8 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc;\n+429 };\n+430\n+_\b4_\b3_\b2 struct _\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+433 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+434 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+435 {};\n+436\n+_\b4_\b3_\b8 struct _\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+439 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+440 , public _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+441 {};\n+442\n+_\b4_\b4_\b4 struct _\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+445 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+446 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+447 {};\n+448\n+_\b4_\b5_\b0 struct _\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+451 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+452 , public _\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+453 {};\n+454\n+_\b4_\b5_\b5 namespace Experimental::Info {\n+456\n+_\b4_\b5_\b7 struct _\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+458 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+459 , public _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+460 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+461 {\n+462 template\n+_\b4_\b6_\b3 auto _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(Tree&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, ChildIndex, U u) const {\n+464 // in this case child index is an integral constant: forward u\n+465 return u;\n+466 }\n+467\n+468 template\n+_\b4_\b6_\b9 std::size_t _\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd(Tree&&, _\bC_\bh_\bi_\bl_\bd&&, TreePath, std::size_t /\n+*childIndex*/, U u) const {\n+470 // in this case child index is a run-time index: cast accumulated u to\n+std::size_t\n+471 return std::size_t{u};\n+472 }\n+473\n+474 template\n+_\b4_\b7_\b5 auto _\bl_\be_\ba_\bf(Tree&&, TreePath, U u) const\n+476 {\n+477 return Hybrid::plus(u,Dune::Indices::_1);\n+478 }\n+479\n+480 };\n+481\n+_\b4_\b8_\b2 struct _\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+483 : public _\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+484 {\n+485 template\n+_\b4_\b8_\b6 auto _\bp_\br_\be(Tree&&, TreePath, U u) const {\n+487 return Hybrid::plus(u,Indices::_1);\n+488 }\n+489 };\n+490\n+_\b4_\b9_\b1 struct _\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+492 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+493 , public _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+494 , public _\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+495 {\n+496 template\n+_\b4_\b9_\b7 auto _\bl_\be_\ba_\bf(Tree&&, TreePath, U u) const\n+498 {\n+499 auto path_size = index_constant<_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(TreePath{})>{};\n+500 auto _\bd_\be_\bp_\bt_\bh = Hybrid::plus(path_size,Indices::_1);\n+501 return Hybrid::max(_\bd_\be_\bp_\bt_\bh,u);\n+502 }\n+503 };\n+504\n+506 // result is alwayas an integral constant\n+507 template\n+_\b5_\b0_\b8 auto _\bd_\be_\bp_\bt_\bh(const Tree& tree)\n+509 {\n+510 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Indices::_0);\n+511 }\n+512\n+514 // return types is std::integral_constant.\n+515 template\n+_\b5_\b1_\b6 constexpr auto _\bd_\be_\bp_\bt_\bh()\n+517 {\n+518 return decltype(_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(std::declval(),_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+{},Indices::_0)){};\n+519 }\n+520\n+522 // if Tree is dynamic, return type is std::size_t, otherwise std::\n integral_constant.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:107\n+523 template\n+_\b5_\b2_\b4 auto _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt(const Tree& tree)\n+525 {\n+526 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Indices::_0);\n+527 }\n+528\n+530 // if Tree is dynamic, return type is std::size_t, otherwise std::\n+integral_constant.\n+531 template\n+_\b5_\b3_\b2 auto _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt(const Tree& tree)\n+533 {\n+534 return _\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br{},Dune::Indices::_0);\n+535 }\n+536\n+538 template\n+_\b5_\b3_\b9 constexpr bool _\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc = std::is_same()))>{};\n+540\n+541 } // namespace Experimental::Info\n+542\n+544\n+545 } // namespace TypeTree\n+546} //namespace Dune\n+547\n+548#endif // DUNE_TYPETREE_VISITOR_HH\n+_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+typename impl::_Child< Node, indices... >::type Child\n+Template alias for the type of a child node given by a list of child indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n+constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n+Returns the size (number of components) of the given HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(const SourceNode &s, const Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< transformed_type > transformed_storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static transformed_storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be\n-TransformedNode transformed_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC\n->, result< TC >::degree > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(const SourceNode &s, const Transformation\n-&t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< TC, StaticDegree< SourceNode >::value > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static const std::size_t degree\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(const SourceNode &s, const Transformation\n-&t, const std::vector< std::shared_ptr< TC > > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC\n-> > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< TC > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC... >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC... >::type transform(const SourceNode &s, const\n-Transformation &t, std::shared_ptr< TC >... children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNode< TC... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simpletransformationdescriptors.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n+auto hybridApplyToTree(Tree &&tree, Visitor &&visitor, Init &&init)\n+Apply hybrid visitor to TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:701\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n+Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc\n+@ fullyStatic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n+@ dynamic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bi_\bs_\bD_\by_\bn_\ba_\bm_\bi_\bc\n+constexpr bool isDynamic\n+true if any of the nodes in the tree only has dynamic degree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n+auto leafCount(const Tree &tree)\n+The number of leaf nodes in the Tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:532\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n+auto nodeCount(const Tree &tree)\n+The total number of nodes in the Tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n+constexpr auto depth()\n+The depth of the Tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:516\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Visitor interface and base class for TypeTree visitors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n+void in(T &&, TreePath) const\n+Method for infix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n+void afterChild(T &&, Child &&, TreePath, ChildIndex) const\n+Method for child-parent traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:122\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n+void beforeChild(T &&, Child &&, TreePath, ChildIndex) const\n+Method for parent-child traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(T &&, TreePath) const\n+Method for postfix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n+void leaf(T &&, TreePath) const\n+Method for leaf traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n+void pre(T &&, TreePath) const\n+Method for prefix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Visitor interface and base class for visitors of pairs of TypeTrees.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n+void leaf(T1 &&, T2 &&, TreePath) const\n+Method for leaf traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n+void beforeChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex)\n+const\n+Method for parent-child traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n+void pre(T1 &&, T2 &&, TreePath) const\n+Method for prefix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:176\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(T1 &&, T2 &&, TreePath) const\n+Method for postfix traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n+void in(T1 &&, T2 &&, TreePath) const\n+Method for infix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n+void afterChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const\n+Method for child-parent traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Hybrid visitor interface and base class for TypeTree hybrid visitors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:286\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+auto post(T &&, TreePath, const U &u) const\n+Method for postfix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n+auto pre(T &&, TreePath, const U &u) const\n+Method for prefix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n+auto leaf(T &&, TreePath, const U &u) const\n+Method for leaf traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\ba_\bf_\bt_\be_\br_\bC_\bh_\bi_\bl_\bd\n+auto afterChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const\n+Method for child-parent traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:346\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bi_\bn\n+auto in(T &&, TreePath, const U &u) const\n+Method for infix tree traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bH_\by_\bb_\br_\bi_\bd_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n+auto beforeChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const\n+Method for parent-child traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:336\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+Mixin base class for visitors that only want to visit the direct children of a\n+node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:358\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n+Template struct for determining whether or not to visit a given child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:370\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static const bool value\n+Do not visit any child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:372\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be\n+Mixin base class for visitors that want to visit the complete tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:384\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd\n+Template struct for determining whether or not to visit a given child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:396\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bT_\br_\be_\be_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static const bool value\n+Visit any child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+Mixin base class for visitors that require a static TreePath during traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:412\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n+static const TreePathType::Type treePathType\n+Use the static tree traversal algorithm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:414\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl\n+Mixin base class for visitors that only need a dynamic TreePath during\n+traversal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:426\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n+static const TreePathType::Type treePathType\n+Use the dynamic tree traversal algorithm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Convenience base class for visiting the entire tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:435\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Convenience base class for visiting the direct children of a node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:441\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Convenience base class for visiting an entire tree pair.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:447\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\bP_\ba_\bi_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+Convenience base class for visiting the direct children of a node pair.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:453\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:461\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n+auto leaf(Tree &&, TreePath, U u) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:475\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n+auto beforeChild(Tree &&, Child &&, TreePath, ChildIndex, U u) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:463\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bL_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bC_\bh_\bi_\bl_\bd\n+std::size_t beforeChild(Tree &&, Child &&, TreePath, std::size_t, U u) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bN_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt_\be_\br_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bp_\br_\be\n+auto pre(Tree &&, TreePath, U u) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bD_\be_\bp_\bt_\bh_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bl_\be_\ba_\bf\n+auto leaf(Tree &&, TreePath, U u) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:497\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00038.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00038.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: powernode.hh File Reference\n+dune-typetree: filteredcompositenode.hh File Reference\n \n \n \n \n \n \n \n@@ -72,37 +72,35 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    powernode.hh File Reference
    \n+
    filteredcompositenode.hh File Reference
    \n
    \n
    \n-
    #include <cassert>
    \n-#include <array>
    \n-#include <memory>
    \n+
    #include <memory>
    \n+#include <tuple>
    \n #include <type_traits>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/filters.hh>
    \n+#include <dune/common/shared_ptr.hh>
    \n #include <dune/common/typetraits.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/utility.hh>
    \n-#include <dune/typetree/childextraction.hh>
    \n-#include <dune/typetree/typetraits.hh>
    \n+#include <dune/common/indices.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::TypeTree::PowerNode< T, k >
     Collect k instances of type T within a dune-typetree. More...
    class  Dune::TypeTree::FilteredCompositeNode< Node, Filter >
     Base class for composite nodes representing a filtered view on an underlying composite node. More...
     
    struct  Dune::TypeTree::PowerNode< T, k >::Child< i >
     Access to the type and storage type of the i-th child. More...
    struct  Dune::TypeTree::FilteredCompositeNode< Node, Filter >::Child< k >
     Access to the type and storage type of the i-th child. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,30 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-powernode.hh File Reference\n-#include \n-#include \n+filteredcompositenode.hh File Reference\n #include \n+#include \n #include \n-#include \n-#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b,_\b _\bk_\b _\b>\n-\u00a0 Collect k instances of type T within a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>\n+\u00a0 Base class for composite nodes representing a filtered view on an\n+ underlying composite node. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b,_\b _\bk_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bi_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n \u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00038_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00038_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: powernode.hh Source File\n+dune-typetree: filteredcompositenode.hh Source File\n \n \n \n \n \n \n \n@@ -74,401 +74,287 @@\n \n
    \n \n
    \n \n
    \n-
    powernode.hh
    \n+
    filteredcompositenode.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_POWERNODE_HH
    \n-
    7#define DUNE_TYPETREE_POWERNODE_HH
    \n+
    6#ifndef DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n+
    7#define DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n
    8
    \n-
    9#include <cassert>
    \n-
    10#include <array>
    \n-
    11#include <memory>
    \n-
    12#include <type_traits>
    \n-
    13
    \n-
    14#include <dune/common/typetraits.hh>
    \n-
    15#include <dune/common/std/type_traits.hh>
    \n-
    16
    \n-\n-\n-\n-\n+
    9#include <memory>
    \n+
    10#include <tuple>
    \n+
    11#include <type_traits>
    \n+
    12
    \n+\n+\n+
    15#include <dune/common/shared_ptr.hh>
    \n+
    16#include <dune/common/typetraits.hh>
    \n+
    17#include <dune/common/indices.hh>
    \n+
    18
    \n+\n+\n
    21
    \n
    22namespace Dune {
    \n
    23 namespace TypeTree {
    \n
    24
    \n-
    31#ifndef DOXYGEN
    \n+
    30#ifndef DOXYGEN
    \n+
    31 namespace {
    \n
    32
    \n-
    34 template<typename PowerNode, typename T, std::size_t k>
    \n-
    35 struct AssertPowerNodeChildCount
    \n-
    36 : public std::enable_if<std::is_same<
    \n-
    37 typename PowerNode::ChildType,
    \n-
    38 T>::value &&
    \n-
    39 PowerNode::degree() == k,
    \n-
    40 T>
    \n-
    41 {};
    \n-
    42
    \n-
    43#endif
    \n+
    33 // ********************************************************************************
    \n+
    34 // Utility structs for filter construction and application
    \n+
    35 // ********************************************************************************
    \n+
    36
    \n+
    37 // Gets the filter and wraps it in case of a SimpleFilter.
    \n+
    38 template<typename Filter, typename Tag>
    \n+
    39 struct get_filter;
    \n+
    40
    \n+
    41 // Helper struct to extract the child template parameter pack from the ChildTypes tuple.
    \n+
    42 template<typename Filter, typename Node, typename ChildTypes>
    \n+
    43 struct apply_filter_wrapper;
    \n
    44
    \n-
    50 template<typename T, std::size_t k>
    \n-
    \n-\n-
    52 {
    \n-
    53
    \n-
    54 public:
    \n-
    55
    \n-
    57 static const bool isLeaf = false;
    \n-
    58
    \n-
    60 static const bool isPower = true;
    \n-
    61
    \n-
    63 static const bool isComposite = false;
    \n-
    64
    \n-
    \n-
    65 static constexpr auto degree ()
    \n+
    45 template<typename Filter, typename Node, typename... Children>
    \n+
    46 struct apply_filter_wrapper<Filter,Node,std::tuple<Children...> >
    \n+
    47 : public Filter::template apply<Node,Children...>
    \n+
    48 {};
    \n+
    49
    \n+
    50 // specialization for SimpleFilter
    \n+
    51 template<typename Filter>
    \n+
    52 struct get_filter<Filter,SimpleFilterTag>
    \n+
    53 {
    \n+
    54 struct type
    \n+
    55 {
    \n+
    56 template<typename Node, typename ChildTypes>
    \n+
    57 struct apply
    \n+
    58 : public apply_filter_wrapper<filter<Filter>,Node,ChildTypes>
    \n+
    59 {};
    \n+
    60 };
    \n+
    61 };
    \n+
    62
    \n+
    63 // specialization for AdvancedFilter
    \n+
    64 template<typename Filter>
    \n+
    65 struct get_filter<Filter,AdvancedFilterTag>
    \n
    66 {
    \n-
    67 return std::integral_constant<std::size_t,k>{};
    \n-
    68 }
    \n-
    \n-
    69
    \n-\n-
    72
    \n-
    74 typedef T ChildType;
    \n+
    67 struct type
    \n+
    68 {
    \n+
    69 template<typename Node, typename ChildTypes>
    \n+
    70 struct apply
    \n+
    71 : public apply_filter_wrapper<Filter,Node,ChildTypes>
    \n+
    72 {};
    \n+
    73 };
    \n+
    74 };
    \n
    75
    \n-
    77 typedef std::array<std::shared_ptr<T>,k> NodeStorage;
    \n+
    76 } // anonymous namespace
    \n+
    77#endif // DOXYGEN
    \n
    78
    \n
    79
    \n-
    81 template<std::size_t i>
    \n+
    81 template<typename Node, typename Filter>
    \n
    \n-
    82 struct Child
    \n-
    83 {
    \n+\n+
    83 {
    \n
    84
    \n-
    85 static_assert((i < degree()), "child index out of range");
    \n-
    86
    \n-
    88 typedef T Type;
    \n-
    89
    \n-
    91 typedef T type;
    \n-
    92 };
    \n-
    \n-
    93
    \n+
    85 typedef typename get_filter<Filter,typename Filter::FilterTag>::type filter;
    \n+
    86 typedef typename filter::template apply<Node,typename Node::ChildTypes>::type filter_result;
    \n+
    87 typedef typename filter_result::template apply<Node> mapped_children;
    \n+
    88
    \n+
    89 static const bool nodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
    \n+
    90
    \n+
    91 template<std::size_t k>
    \n+
    92 struct lazy_enable
    \n+
    93 {
    \n+
    94 static const bool value = !nodeIsConst;
    \n+
    95 };
    \n
    96
    \n+
    97 public:
    \n
    98
    \n-
    101 template<std::size_t i>
    \n-
    \n-
    102 T& child (index_constant<i> = {})
    \n-
    103 {
    \n-
    104 static_assert((i < degree()), "child index out of range");
    \n-
    105 return *_children[i];
    \n-
    106 }
    \n-
    \n+\n+
    101
    \n+
    103 typedef typename mapped_children::NodeStorage NodeStorage;
    \n+
    104
    \n+
    106 typedef typename mapped_children::ChildTypes ChildTypes;
    \n
    107
    \n-
    109
    \n-
    112 template<std::size_t i>
    \n-
    \n-
    113 const T& child (index_constant<i> = {}) const
    \n-
    114 {
    \n-
    115 static_assert((i < degree()), "child index out of range");
    \n-
    116 return *_children[i];
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    120
    \n-
    123 template<std::size_t i>
    \n-
    \n-
    124 std::shared_ptr<T> childStorage (index_constant<i> = {})
    \n-
    125 {
    \n-
    126 static_assert((i < degree()), "child index out of range");
    \n-
    127 return _children[i];
    \n-
    128 }
    \n-
    \n+
    109 static const bool isLeaf = false;
    \n+
    110
    \n+
    112 static const bool isPower = false;
    \n+
    113
    \n+
    115 static const bool isComposite = true;
    \n+
    116
    \n+
    \n+
    117 static constexpr auto degree ()
    \n+
    118 {
    \n+
    119 return std::integral_constant<std::size_t,filter_result::size>{};
    \n+
    120 }
    \n+
    \n+
    121
    \n+
    123 template<std::size_t k>
    \n+
    \n+
    124 struct Child {
    \n+
    125
    \n+
    126#ifndef DOXYGEN
    \n+
    127
    \n+
    128 typedef typename std::tuple_element<k,typename mapped_children::Children>::type OriginalChild;
    \n
    129
    \n+
    130 static const std::size_t mapped_index = std::tuple_element<k,typename filter_result::IndexMap>::type::original_index;
    \n
    131
    \n-
    134 template<std::size_t i>
    \n-
    \n-
    135 std::shared_ptr<const T> childStorage (index_constant<i> = {}) const
    \n-
    136 {
    \n-
    137 static_assert((i < degree()), "child index out of range");
    \n-
    138 return _children[i];
    \n-
    139 }
    \n+
    132#endif // DOXYGEN
    \n+
    133
    \n+
    135 typedef typename OriginalChild::Type Type;
    \n+
    136
    \n+
    138 typedef typename OriginalChild::type type;
    \n+
    139 };
    \n
    \n
    140
    \n-
    142 template<std::size_t i>
    \n-
    \n-
    143 void setChild (T& t, index_constant<i> = {})
    \n-
    144 {
    \n-
    145 static_assert((i < degree()), "child index out of range");
    \n-
    146 _children[i] = stackobject_to_shared_ptr(t);
    \n-
    147 }
    \n-
    \n-
    148
    \n-
    150 template<std::size_t i>
    \n-
    \n-
    151 void setChild (T&& t, index_constant<i> = {})
    \n-
    152 {
    \n-
    153 static_assert((i < degree()), "child index out of range");
    \n-
    154 _children[i] = convert_arg(std::move(t));
    \n-
    155 }
    \n+
    143
    \n+
    145
    \n+
    148 template<std::size_t k,
    \n+
    149 typename std::enable_if<lazy_enable<k>::value, int>::type = 0>
    \n+
    \n+
    150 auto& child (index_constant<k> = {})
    \n+
    151 {
    \n+
    152 return _node->template child<Child<k>::mapped_index>();
    \n+
    153 }
    \n
    \n+
    154
    \n
    156
    \n-
    158 template<std::size_t i>
    \n-
    \n-
    159 void setChild (std::shared_ptr<T> st, index_constant<i> = {})
    \n-
    160 {
    \n-
    161 static_assert((i < degree()), "child index out of range");
    \n-
    162 _children[i] = std::move(st);
    \n+
    159 template<std::size_t k>
    \n+
    \n+
    160 const auto& child (index_constant<k> = {}) const
    \n+
    161 {
    \n+
    162 return _node->template child<Child<k>::mapped_index>();
    \n
    163 }
    \n
    \n
    164
    \n
    166
    \n-
    167
    \n-
    170
    \n-
    172
    \n-
    \n-
    175 T& child (std::size_t i)
    \n-
    176 {
    \n-
    177 assert(i < degree() && "child index out of range");
    \n-
    178 return *_children[i];
    \n-
    179 }
    \n-
    \n-
    180
    \n-
    182
    \n-
    \n-
    185 const T& child (std::size_t i) const
    \n-
    186 {
    \n-
    187 assert(i < degree() && "child index out of range");
    \n-
    188 return *_children[i];
    \n-
    189 }
    \n+
    169 template<std::size_t k,
    \n+
    170 typename std::enable_if<lazy_enable<k>::value, int>::type = 0>
    \n+
    \n+
    171 auto childStorage (index_constant<k> = {})
    \n+
    172 {
    \n+
    173 return _node->template childStorage<Child<k>::mapped_index>();
    \n+
    174 }
    \n+
    \n+
    175
    \n+
    177
    \n+
    180 template<std::size_t k>
    \n+
    \n+
    181 auto childStorage (index_constant<k> = {}) const
    \n+
    182 {
    \n+
    183 return _node->template childStorage<Child<k>::mapped_index>();
    \n+
    184 }
    \n+
    \n+
    185
    \n+
    187 template<std::size_t k, class ChildType>
    \n+
    \n+
    188 void setChild (ChildType&& child, typename std::enable_if<lazy_enable<k>::value,void*>::type = 0)
    \n+
    189 {
    \n+
    190 _node->template setChild<Child<k>::mapped_index>(std::forward<ChildType>(child));
    \n+
    191 }
    \n
    \n-
    190
    \n
    192
    \n-
    \n-
    195 std::shared_ptr<T> childStorage (std::size_t i)
    \n-
    196 {
    \n-
    197 assert(i < degree() && "child index out of range");
    \n-
    198 return _children[i];
    \n-
    199 }
    \n-
    \n-
    200
    \n-
    202
    \n-
    \n-
    205 std::shared_ptr<const T> childStorage (std::size_t i) const
    \n-
    206 {
    \n-
    207 assert(i < degree() && "child index out of range");
    \n-
    208 return _children[i];
    \n+
    194
    \n+
    197
    \n+
    198 protected:
    \n+
    199
    \n+
    201
    \n+
    204 template<bool enabled = !nodeIsConst>
    \n+
    205 typename std::enable_if<enabled,Node&>::type
    \n+
    \n+\n+
    207 {
    \n+
    208 return *_node;
    \n
    209 }
    \n
    \n
    210
    \n-
    \n-
    212 void setChild (std::size_t i, T& t)
    \n-
    213 {
    \n-
    214 assert(i < degree() && "child index out of range");
    \n-
    215 _children[i] = stackobject_to_shared_ptr(t);
    \n-
    216 }
    \n-
    \n-
    217
    \n-
    \n-
    219 void setChild (std::size_t i, T&& t)
    \n-
    220 {
    \n-
    221 assert(i < degree() && "child index out of range");
    \n-
    222 _children[i] = convert_arg(std::move(t));
    \n-
    223 }
    \n-
    \n-
    224
    \n+
    212
    \n+
    \n+
    215 const Node& unfiltered () const
    \n+
    216 {
    \n+
    217 return *_node;
    \n+
    218 }
    \n+
    \n+
    219
    \n+
    221
    \n+
    224 template<bool enabled = !nodeIsConst>
    \n+
    225 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
    \n
    \n-
    226 void setChild (std::size_t i, std::shared_ptr<T> st)
    \n+\n
    227 {
    \n-
    228 assert(i < degree() && "child index out of range");
    \n-
    229 _children[i] = std::move(st);
    \n-
    230 }
    \n-
    \n-
    231
    \n-
    \n-
    232 const NodeStorage& nodeStorage () const
    \n-
    233 {
    \n-
    234 return _children;
    \n-
    235 }
    \n+
    228 return _node;
    \n+
    229 }
    \n+
    \n+
    230
    \n+
    232
    \n+
    \n+
    235 std::shared_ptr<const Node> unfilteredStorage () const
    \n+
    236 {
    \n+
    237 return _node;
    \n+
    238 }
    \n
    \n-
    236
    \n-
    238
    \n+
    239
    \n
    241
    \n-
    242 // The following two methods require a little bit of SFINAE trickery to work correctly:
    \n-
    243 // We have to make sure that they don't shadow the methods for direct child access because
    \n-
    244 // those get called by the generic child() machinery. If that machinery picks up the methods
    \n-
    245 // defined below, we have an infinite recursion.
    \n-
    246 // So the methods make sure that either
    \n-
    247 //
    \n-
    248 // * there are more than one argument. In that case, we got multiple indices and can forward
    \n-
    249 // to the general machine.
    \n-
    250 //
    \n-
    251 // * the first argument is not a valid flat index, i.e. either a std::size_t or an index_constant.
    \n-
    252 // The argument thus has to be some kind of TreePath instance that we can also pass to the
    \n-
    253 // generic machine.
    \n-
    254 //
    \n-
    255 // The above SFINAE logic works, but there is still a problem with the return type deduction.
    \n-
    256 // We have to do a lazy lookup of the return type after SFINAE has succeeded, otherwise the return
    \n-
    257 // type deduction will trigger the infinite recursion.
    \n+
    242 public:
    \n+
    243
    \n+
    246
    \n+
    \n+
    248 FilteredCompositeNode (std::shared_ptr<Node> node)
    \n+
    249 : _node(std::move(node))
    \n+
    250 {}
    \n+
    \n+
    251
    \n+
    \n+\n+
    254 : _node(stackobject_to_shared_ptr(node))
    \n+
    255 {}
    \n+
    \n+
    256
    \n
    258
    \n-
    260
    \n-
    264#ifdef DOXYGEN
    \n-
    265 template<typename... Indices>
    \n-
    \n-
    266 ImplementationDefined& child (Indices... indices)
    \n-
    267#else
    \n-
    268 template<typename I0, typename... I,
    \n-
    269 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n-
    270 decltype(auto) child (I0 i0, I... i)
    \n-
    271#endif
    \n-
    272 {
    \n-
    273 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n-
    274 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n-
    275 );
    \n-
    276 return Dune::TypeTree::child(*this,i0,i...);
    \n-
    277 }
    \n-
    \n-
    278
    \n-
    280
    \n-
    284#ifdef DOXYGEN
    \n-
    285 template<typename... Indices>
    \n-
    \n-
    286 const ImplementationDefined& child (Indices... indices)
    \n-
    287#else
    \n-
    288 template<typename I0, typename... I,
    \n-
    289 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n-
    290 decltype(auto) child (I0 i0, I... i) const
    \n-
    291#endif
    \n-
    292 {
    \n-
    293 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n-
    294 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n-
    295 );
    \n-
    296 return Dune::TypeTree::child(*this,i0,i...);
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    300
    \n-
    303
    \n-
    304 protected:
    \n-
    305
    \n-
    307
    \n-
    \n-\n-
    316 {}
    \n-
    \n-
    317
    \n-
    \n-
    319 explicit PowerNode (const NodeStorage& children)
    \n-
    320 : _children(children)
    \n-
    321 {}
    \n-
    \n-
    322
    \n-
    \n-
    324 explicit PowerNode (T& t, bool distinct_objects = true)
    \n-
    325 {
    \n-
    326 if (distinct_objects)
    \n-
    327 {
    \n-
    328 for (typename NodeStorage::iterator it = _children.begin(); it != _children.end(); ++it)
    \n-
    329 *it = std::make_shared<T>(t);
    \n-
    330 }
    \n-
    331 else
    \n-
    332 {
    \n-
    333 std::shared_ptr<T> sp = stackobject_to_shared_ptr(t);
    \n-
    334 std::fill(_children.begin(),_children.end(),sp);
    \n-
    335 }
    \n-
    336 }
    \n-
    \n-
    337
    \n-
    338#ifdef DOXYGEN
    \n-
    339
    \n-
    \n-
    341 PowerNode(T& t1, T& t2, ...)
    \n-
    342 {}
    \n-
    \n-
    343
    \n-
    344#else
    \n-
    345
    \n-
    346 template<typename... Children,
    \n-
    347 std::enable_if_t<
    \n-
    348 std::conjunction<std::is_same<ChildType, std::decay_t<Children>>...>::value
    \n-
    349 ,int> = 0>
    \n-
    350 PowerNode (Children&&... children)
    \n-
    351 {
    \n-
    352 static_assert(degree() == sizeof...(Children), "PowerNode constructor is called with incorrect number of children");
    \n-
    353 _children = NodeStorage{convert_arg(std::forward<Children>(children))...};
    \n-
    354 }
    \n-
    355
    \n-
    356 template<typename... Children,
    \n-
    357 std::enable_if_t<
    \n-
    358 std::conjunction<std::is_same<ChildType, Children>...>::value
    \n-
    359 ,int> = 0>
    \n-
    360 PowerNode (std::shared_ptr<Children>... children)
    \n-
    361 {
    \n-
    362 static_assert(degree() == sizeof...(Children), "PowerNode constructor is called with incorrect number of children");
    \n-
    363 _children = NodeStorage{children...};
    \n-
    364 }
    \n-
    365
    \n-
    366#endif // DOXYGEN
    \n-
    367
    \n-
    369
    \n-
    370 private:
    \n-
    371 NodeStorage _children;
    \n-
    372 };
    \n-
    \n-
    373
    \n-
    375
    \n-
    376 } // namespace TypeTree
    \n-
    377} //namespace Dune
    \n-
    378
    \n-
    379#endif // DUNE_TYPETREE_POWERNODE_HH
    \n-\n-\n-\n-\n-
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n+
    259 private:
    \n+
    260 std::shared_ptr<Node> _node;
    \n+
    261 };
    \n+
    \n+
    262
    \n+
    264
    \n+
    265 } // namespace TypeTree
    \n+
    266} //namespace Dune
    \n+
    267
    \n+
    268#endif // DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n+\n+\n
    Definition accumulate_static.hh:16
    \n-
    Tag designating a power node.
    Definition nodetags.hh:21
    \n-
    Collect k instances of type T within a dune-typetree.
    Definition powernode.hh:52
    \n-
    void setChild(T &t, index_constant< i >={})
    Sets the i-th child to the passed-in value.
    Definition powernode.hh:143
    \n-
    T & child(std::size_t i)
    Returns the i-th child.
    Definition powernode.hh:175
    \n-
    const T & child(index_constant< i >={}) const
    Returns the i-th child (const version).
    Definition powernode.hh:113
    \n-
    void setChild(std::shared_ptr< T > st, index_constant< i >={})
    Sets the stored value representing the i-th child to the passed-in value.
    Definition powernode.hh:159
    \n-
    std::shared_ptr< T > childStorage(index_constant< i >={})
    Returns the storage of the i-th child.
    Definition powernode.hh:124
    \n-
    PowerNode(T &t1, T &t2,...)
    Initialize all children with the passed-in objects.
    Definition powernode.hh:341
    \n-
    const NodeStorage & nodeStorage() const
    Definition powernode.hh:232
    \n-
    std::array< std::shared_ptr< T >, k > NodeStorage
    The type used for storing the children.
    Definition powernode.hh:77
    \n-
    std::shared_ptr< const T > childStorage(index_constant< i >={}) const
    Returns the storage of the i-th child (const version).
    Definition powernode.hh:135
    \n-
    PowerNode(T &t, bool distinct_objects=true)
    Initialize all children with copies of a storage object constructed from the parameter t.
    Definition powernode.hh:324
    \n-
    PowerNodeTag NodeTag
    The type tag that describes a PowerNode.
    Definition powernode.hh:71
    \n-
    const T & child(std::size_t i) const
    Returns the i-th child (const version).
    Definition powernode.hh:185
    \n-
    static constexpr auto degree()
    Definition powernode.hh:65
    \n-
    std::shared_ptr< const T > childStorage(std::size_t i) const
    Returns the storage of the i-th child (const version).
    Definition powernode.hh:205
    \n-
    void setChild(std::size_t i, std::shared_ptr< T > st)
    Sets the stored value representing the i-th child to the passed-in value.
    Definition powernode.hh:226
    \n-
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition powernode.hh:63
    \n-
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition powernode.hh:57
    \n-
    static const bool isPower
    Mark this class as a power in the dune-typetree.
    Definition powernode.hh:60
    \n-
    PowerNode(const NodeStorage &children)
    Initialize the PowerNode with a copy of the passed-in storage type.
    Definition powernode.hh:319
    \n-
    T ChildType
    The type of each child.
    Definition powernode.hh:74
    \n-
    T & child(index_constant< i >={})
    Returns the i-th child.
    Definition powernode.hh:102
    \n-
    ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition powernode.hh:266
    \n-
    void setChild(std::size_t i, T &&t)
    Store the passed value in i-th child.
    Definition powernode.hh:219
    \n-
    void setChild(T &&t, index_constant< i >={})
    Store the passed value in i-th child.
    Definition powernode.hh:151
    \n-
    PowerNode()
    Default constructor.
    Definition powernode.hh:315
    \n-
    const ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition powernode.hh:286
    \n-
    void setChild(std::size_t i, T &t)
    Sets the i-th child to the passed-in value.
    Definition powernode.hh:212
    \n-
    std::shared_ptr< T > childStorage(std::size_t i)
    Returns the storage of the i-th child.
    Definition powernode.hh:195
    \n-
    Access to the type and storage type of the i-th child.
    Definition powernode.hh:83
    \n-
    T type
    The type of the child.
    Definition powernode.hh:91
    \n-
    T Type
    The type of the child.
    Definition powernode.hh:88
    \n-
    Check if type represents a tree path.
    Definition typetraits.hh:184
    \n+
    Base class for composite nodes representing a filtered view on an underlying composite node.
    Definition filteredcompositenode.hh:83
    \n+
    auto childStorage(index_constant< k >={}) const
    Returns the storage of the k-th child (const version).
    Definition filteredcompositenode.hh:181
    \n+
    static constexpr auto degree()
    Definition filteredcompositenode.hh:117
    \n+
    mapped_children::NodeStorage NodeStorage
    The type used for storing the children.
    Definition filteredcompositenode.hh:103
    \n+
    void setChild(ChildType &&child, typename std::enable_if< lazy_enable< k >::value, void * >::type=0)
    Sets the k-th child to the passed-in value.
    Definition filteredcompositenode.hh:188
    \n+
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition filteredcompositenode.hh:109
    \n+
    const Node & unfiltered() const
    Returns the unfiltered node (const version).
    Definition filteredcompositenode.hh:215
    \n+
    static const bool isComposite
    Mark this class as a composite in the dune-typetree.
    Definition filteredcompositenode.hh:115
    \n+
    std::enable_if< enabled, std::shared_ptr< Node > >::type unfilteredStorage()
    Returns the storage object of the unfiltered node.
    Definition filteredcompositenode.hh:226
    \n+
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition filteredcompositenode.hh:112
    \n+
    FilteredCompositeNode(Node &node)
    Initialize the CompositeNode with a copy of the passed-in storage type.
    Definition filteredcompositenode.hh:253
    \n+
    FilteredCompositeNode(std::shared_ptr< Node > node)
    Initialize the CompositeNode with copies of the passed in Storage objects.
    Definition filteredcompositenode.hh:248
    \n+
    auto childStorage(index_constant< k >={})
    Returns the storage of the k-th child.
    Definition filteredcompositenode.hh:171
    \n+
    const auto & child(index_constant< k >={}) const
    Returns the k-th child (const version).
    Definition filteredcompositenode.hh:160
    \n+
    auto & child(index_constant< k >={})
    Returns the k-th child.
    Definition filteredcompositenode.hh:150
    \n+
    CompositeNodeTag NodeTag
    The type tag that describes a CompositeNode.
    Definition filteredcompositenode.hh:100
    \n+
    mapped_children::ChildTypes ChildTypes
    A tuple storing the types of all children.
    Definition filteredcompositenode.hh:106
    \n+
    std::enable_if< enabled, Node & >::type unfiltered()
    Returns the unfiltered node.
    Definition filteredcompositenode.hh:206
    \n+
    std::shared_ptr< const Node > unfilteredStorage() const
    Returns the storage object of the unfiltered node (const version).
    Definition filteredcompositenode.hh:235
    \n+
    Access to the type and storage type of the i-th child.
    Definition filteredcompositenode.hh:124
    \n+
    OriginalChild::type type
    The type of the child.
    Definition filteredcompositenode.hh:138
    \n+
    OriginalChild::Type Type
    The type of the child.
    Definition filteredcompositenode.hh:135
    \n+
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,463 +1,333 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-powernode.hh\n+filteredcompositenode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_POWERNODE_HH\n-7#define DUNE_TYPETREE_POWERNODE_HH\n+6#ifndef DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n+7#define DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n 8\n-9#include \n-10#include \n-11#include \n-12#include \n-13\n-14#include \n-15#include \n-16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+9#include \n+10#include \n+11#include \n+12\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n+15#include \n+16#include \n+17#include \n+18\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n 21\n 22namespace _\bD_\bu_\bn_\be {\n 23 namespace TypeTree {\n 24\n-31#ifndef DOXYGEN\n+30#ifndef DOXYGEN\n+31 namespace {\n 32\n-34 template\n-35 struct AssertPowerNodeChildCount\n-36 : public std::enable_if::value &&\n-39 PowerNode::degree() == k,\n-40 T>\n-41 {};\n-42\n-43#endif\n+33 /\n+/\n+********************************************************************************\n+34 // Utility structs for filter construction and application\n+35 /\n+/\n+********************************************************************************\n+36\n+37 // Gets the filter and wraps it in case of a SimpleFilter.\n+38 template\n+39 struct get_filter;\n+40\n+41 // Helper struct to extract the child template parameter pack from the\n+ChildTypes tuple.\n+42 template\n+43 struct apply_filter_wrapper;\n 44\n-50 template\n-_\b5_\b1 class _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-52 {\n-53\n-54 public:\n-55\n-_\b5_\b7 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n-58\n-_\b6_\b0 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = true;\n-61\n-_\b6_\b3 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n-64\n-_\b6_\b5 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+45 template\n+46 struct apply_filter_wrapper >\n+47 : public Filter::template apply\n+48 {};\n+49\n+50 // specialization for SimpleFilter\n+51 template\n+52 struct get_filter\n+53 {\n+54 struct type\n+55 {\n+56 template\n+57 struct apply\n+58 : public apply_filter_wrapper,Node,ChildTypes>\n+59 {};\n+60 };\n+61 };\n+62\n+63 // specialization for AdvancedFilter\n+64 template\n+65 struct get_filter\n 66 {\n-67 return std::integral_constant{};\n-68 }\n-69\n-_\b7_\b1 typedef _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-72\n-_\b7_\b4 typedef T _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n+67 struct type\n+68 {\n+69 template\n+70 struct apply\n+71 : public apply_filter_wrapper\n+72 {};\n+73 };\n+74 };\n 75\n-_\b7_\b7 typedef std::array,k> _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+76 } // anonymous namespace\n+77#endif // DOXYGEN\n 78\n 79\n-81 template\n-_\b8_\b2 struct _\bC_\bh_\bi_\bl_\bd\n+81 template\n+_\b8_\b2 class _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n 83 {\n 84\n-85 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-86\n-_\b8_\b8 typedef T _\bT_\by_\bp_\be;\n-89\n-_\b9_\b1 typedef T _\bt_\by_\bp_\be;\n-92 };\n-93\n+85 typedef typename get_filter::type filter;\n+86 typedef typename filter::template apply::\n+type filter_result;\n+87 typedef typename filter_result::template apply mapped_children;\n+88\n+89 static const bool nodeIsConst = std::is_const::type>::value;\n+90\n+91 template\n+92 struct lazy_enable\n+93 {\n+94 static const bool value = !nodeIsConst;\n+95 };\n 96\n+97 public:\n 98\n-101 template\n-_\b1_\b0_\b2 T& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n-103 {\n-104 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-105 return *_children[i];\n-106 }\n+_\b1_\b0_\b0 typedef _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+101\n+_\b1_\b0_\b3 typedef typename mapped_children::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+104\n+_\b1_\b0_\b6 typedef typename mapped_children::ChildTypes _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n 107\n-109\n-112 template\n-_\b1_\b1_\b3 const T& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n-114 {\n-115 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-116 return *_children[i];\n-117 }\n-118\n-120\n-123 template\n-_\b1_\b2_\b4 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n-125 {\n-126 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-127 return _children[i];\n-128 }\n+_\b1_\b0_\b9 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n+110\n+_\b1_\b1_\b2 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n+113\n+_\b1_\b1_\b5 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = true;\n+116\n+_\b1_\b1_\b7 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+118 {\n+119 return std::integral_constant{};\n+120 }\n+121\n+123 template\n+_\b1_\b2_\b4 struct _\bC_\bh_\bi_\bl_\bd {\n+125\n+126#ifndef DOXYGEN\n+127\n+128 typedef typename std::tuple_element::\n+type OriginalChild;\n 129\n+130 static const std::size_t mapped_index = std::tuple_element::type::original_index;\n 131\n-134 template\n-_\b1_\b3_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n-136 {\n-137 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-138 return _children[i];\n-139 }\n+132#endif // DOXYGEN\n+133\n+_\b1_\b3_\b5 typedef typename OriginalChild::Type _\bT_\by_\bp_\be;\n+136\n+_\b1_\b3_\b8 typedef typename OriginalChild::type _\bt_\by_\bp_\be;\n+139 };\n 140\n-142 template\n-_\b1_\b4_\b3 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (T& t, index_constant = {})\n-144 {\n-145 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-146 _children[i] = stackobject_to_shared_ptr(t);\n-147 }\n-148\n-150 template\n-_\b1_\b5_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (T&& t, index_constant = {})\n-152 {\n-153 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-154 _children[i] = convert_arg(std::move(t));\n-155 }\n+143\n+145\n+148 template::value, int>::type = 0>\n+_\b1_\b5_\b0 auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n+151 {\n+152 return _node->template child::mapped_index>();\n+153 }\n+154\n 156\n-158 template\n-_\b1_\b5_\b9 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::shared_ptr st, index_constant = {})\n-160 {\n-161 static_assert((i < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n-162 _children[i] = std::move(st);\n+159 template\n+_\b1_\b6_\b0 const auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n+161 {\n+162 return _node->template child::mapped_index>();\n 163 }\n 164\n 166\n-167\n-170\n-172\n-_\b1_\b7_\b5 T& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n-176 {\n-177 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-178 return *_children[i];\n-179 }\n-180\n-182\n-_\b1_\b8_\b5 const T& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n-186 {\n-187 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-188 return *_children[i];\n-189 }\n-190\n+169 template::value, int>::type = 0>\n+_\b1_\b7_\b1 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n+172 {\n+173 return _node->template childStorage::mapped_index>();\n+174 }\n+175\n+177\n+180 template\n+_\b1_\b8_\b1 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n+182 {\n+183 return _node->template childStorage::mapped_index>();\n+184 }\n+185\n+187 template\n+_\b1_\b8_\b8 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (ChildType&& _\bc_\bh_\bi_\bl_\bd, typename std::enable_if::\n+value,void*>::type = 0)\n+189 {\n+190 _node->template setChild::mapped_index>(std::forward\n+(_\bc_\bh_\bi_\bl_\bd));\n+191 }\n 192\n-_\b1_\b9_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n-196 {\n-197 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-198 return _children[i];\n-199 }\n-200\n-202\n-_\b2_\b0_\b5 std::shared_ptr _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n-206 {\n-207 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-208 return _children[i];\n+194\n+197\n+198 protected:\n+199\n+201\n+204 template\n+205 typename std::enable_if::type\n+_\b2_\b0_\b6 _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd ()\n+207 {\n+208 return *_node;\n 209 }\n 210\n-_\b2_\b1_\b2 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, T& t)\n-213 {\n-214 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-215 _children[i] = stackobject_to_shared_ptr(t);\n-216 }\n-217\n-_\b2_\b1_\b9 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, T&& t)\n-220 {\n-221 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-222 _children[i] = convert_arg(std::move(t));\n-223 }\n-224\n-_\b2_\b2_\b6 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, std::shared_ptr st)\n+212\n+_\b2_\b1_\b5 const Node& _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd () const\n+216 {\n+217 return *_node;\n+218 }\n+219\n+221\n+224 template\n+225 typename std::enable_if >::type\n+_\b2_\b2_\b6 _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be ()\n 227 {\n-228 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-229 _children[i] = std::move(st);\n-230 }\n-231\n-_\b2_\b3_\b2 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-233 {\n-234 return _children;\n-235 }\n-236\n-238\n+228 return _node;\n+229 }\n+230\n+232\n+_\b2_\b3_\b5 std::shared_ptr _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+236 {\n+237 return _node;\n+238 }\n+239\n 241\n-242 // The following two methods require a little bit of SFINAE trickery to\n-work correctly:\n-243 // We have to make sure that they don't shadow the methods for direct child\n-access because\n-244 // those get called by the generic child() machinery. If that machinery\n-picks up the methods\n-245 // defined below, we have an infinite recursion.\n-246 // So the methods make sure that either\n-247 //\n-248 // * there are more than one argument. In that case, we got multiple\n-indices and can forward\n-249 // to the general machine.\n-250 //\n-251 // * the first argument is not a valid flat index, i.e. either a std::\n-size_t or an index_constant.\n-252 // The argument thus has to be some kind of TreePath instance that we can\n-also pass to the\n-253 // generic machine.\n-254 //\n-255 // The above SFINAE logic works, but there is still a problem with the\n-return type deduction.\n-256 // We have to do a lazy lookup of the return type after SFINAE has\n-succeeded, otherwise the return\n-257 // type deduction will trigger the infinite recursion.\n+242 public:\n+243\n+246\n+_\b2_\b4_\b8 _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (std::shared_ptr node)\n+249 : _node(std::move(node))\n+250 {}\n+251\n+_\b2_\b5_\b3 _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (Node& node)\n+254 : _node(stackobject_to_shared_ptr(node))\n+255 {}\n+256\n 258\n-260\n-264#ifdef DOXYGEN\n-265 template\n-_\b2_\b6_\b6 ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n-267#else\n-268 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n-270 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i)\n-271#endif\n-272 {\n-273 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n-274 \"You cannot use the member function child() with an empty TreePath, use the\n-freestanding version child(node,treePath) instead.\"\n-275 );\n-276 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n-277 }\n-278\n-280\n-284#ifdef DOXYGEN\n-285 template\n-_\b2_\b8_\b6 const ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n-287#else\n-288 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n-290 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i) const\n-291#endif\n-292 {\n-293 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n-294 \"You cannot use the member function child() with an empty TreePath, use the\n-freestanding version child(node,treePath) instead.\"\n-295 );\n-296 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n-297 }\n-298\n-300\n-303\n-304 protected:\n-305\n-307\n-_\b3_\b1_\b5 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be ()\n-316 {}\n-317\n-_\b3_\b1_\b9 explicit _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& children)\n-320 : _children(children)\n-321 {}\n-322\n-_\b3_\b2_\b4 explicit _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (T& t, bool distinct_objects = true)\n-325 {\n-326 if (distinct_objects)\n-327 {\n-328 for (typename NodeStorage::iterator it = _children.begin(); it !=\n-_children.end(); ++it)\n-329 *it = std::make_shared(t);\n-330 }\n-331 else\n-332 {\n-333 std::shared_ptr sp = stackobject_to_shared_ptr(t);\n-334 std::fill(_children.begin(),_children.end(),sp);\n-335 }\n-336 }\n-337\n-338#ifdef DOXYGEN\n-339\n-_\b3_\b4_\b1 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be(T& t1, T& t2, ...)\n-342 {}\n-343\n-344#else\n-345\n-346 template>...>::value\n-349 ,int> = 0>\n-350 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (Children&&... children)\n-351 {\n-352 static_assert(_\bd_\be_\bg_\br_\be_\be() == sizeof...(Children), \"PowerNode constructor is\n-called with incorrect number of children\");\n-353 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{convert_arg(std::forward(children))...};\n-354 }\n-355\n-356 template...>::value\n-359 ,int> = 0>\n-360 _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::shared_ptr... children)\n-361 {\n-362 static_assert(_\bd_\be_\bg_\br_\be_\be() == sizeof...(Children), \"PowerNode constructor is\n-called with incorrect number of children\");\n-363 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{children...};\n-364 }\n-365\n-366#endif // DOXYGEN\n-367\n-369\n-370 private:\n-371 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n-372 };\n-373\n-375\n-376 } // namespace TypeTree\n-377} //namespace Dune\n-378\n-379#endif // DUNE_TYPETREE_POWERNODE_HH\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n-_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+259 private:\n+260 std::shared_ptr _node;\n+261 };\n+262\n+264\n+265 } // namespace TypeTree\n+266} //namespace Dune\n+267\n+268#endif // DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ImplementationDefined child(Node &&node, Indices... indices)\n-Extracts the child of a node given by a sequence of compile-time and run-time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n+_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-Collect k instances of type T within a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(T &t, index_constant< i >={})\n-Sets the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-T & child(std::size_t i)\n-Returns the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const T & child(index_constant< i >={}) const\n-Returns the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::shared_ptr< T > st, index_constant< i >={})\n-Sets the stored value representing the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< T > childStorage(index_constant< i >={})\n-Returns the storage of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-PowerNode(T &t1, T &t2,...)\n-Initialize all children with the passed-in objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:341\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-const NodeStorage & nodeStorage() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::array< std::shared_ptr< T >, k > NodeStorage\n-The type used for storing the children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< const T > childStorage(index_constant< i >={}) const\n-Returns the storage of the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-PowerNode(T &t, bool distinct_objects=true)\n-Initialize all children with copies of a storage object constructed from the\n-parameter t.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:324\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-PowerNodeTag NodeTag\n-The type tag that describes a PowerNode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const T & child(std::size_t i) const\n-Returns the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+Base class for composite nodes representing a filtered view on an underlying\n+composite node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(index_constant< k >={}) const\n+Returns the storage of the k-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n static constexpr auto degree()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< const T > childStorage(std::size_t i) const\n-Returns the storage of the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, std::shared_ptr< T > st)\n-Sets the stored value representing the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a non composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+mapped_children::NodeStorage NodeStorage\n+The type used for storing the children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(ChildType &&child, typename std::enable_if< lazy_enable< k >::\n+value, void * >::type=0)\n+Sets the k-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n static const bool isLeaf\n Mark this class as non leaf in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:109\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd\n+const Node & unfiltered() const\n+Returns the unfiltered node (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::enable_if< enabled, std::shared_ptr< Node > >::type unfilteredStorage()\n+Returns the storage object of the unfiltered node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n static const bool isPower\n-Mark this class as a power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-PowerNode(const NodeStorage &children)\n-Initialize the PowerNode with a copy of the passed-in storage type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n-T ChildType\n-The type of each child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-T & child(index_constant< i >={})\n-Returns the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ImplementationDefined & child(Indices... indices)\n-Returns the child given by the list of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, T &&t)\n-Store the passed value in i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(T &&t, index_constant< i >={})\n-Store the passed value in i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-PowerNode()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const ImplementationDefined & child(Indices... indices)\n-Returns the child given by the list of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, T &t)\n-Sets the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< T > childStorage(std::size_t i)\n-Returns the storage of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:195\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+Mark this class as a non power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+FilteredCompositeNode(Node &node)\n+Initialize the CompositeNode with a copy of the passed-in storage type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+FilteredCompositeNode(std::shared_ptr< Node > node)\n+Initialize the CompositeNode with copies of the passed in Storage objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+auto childStorage(index_constant< k >={})\n+Returns the storage of the k-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const auto & child(index_constant< k >={}) const\n+Returns the k-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+auto & child(index_constant< k >={})\n+Returns the k-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+CompositeNodeTag NodeTag\n+The type tag that describes a CompositeNode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n+mapped_children::ChildTypes ChildTypes\n+A tuple storing the types of all children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd\n+std::enable_if< enabled, Node & >::type unfiltered()\n+Returns the unfiltered node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< const Node > unfilteredStorage() const\n+Returns the storage object of the unfiltered node (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n Access to the type and storage type of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n-T type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n+OriginalChild::type type\n The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n-T Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n+OriginalChild::Type Type\n The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powernode.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-Check if type represents a tree path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:184\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a composite node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00041.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00041.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: treepath.hh File Reference\n+dune-typetree: transformationutilities.hh File Reference\n \n \n \n \n \n \n \n@@ -69,193 +69,21 @@\n \n
    \n \n
    \n
    \n
    \n- \n-
    treepath.hh File Reference
    \n+
    transformationutilities.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n-#include <cassert>
    \n-#include <iostream>
    \n-#include <type_traits>
    \n-#include <dune/common/documentation.hh>
    \n-#include <dune/common/version.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/typelist.hh>
    \n-#include <dune/typetree/fixedcapacitystack.hh>
    \n-#include <dune/typetree/utility.hh>
    \n+\n

    Go to the source code of this file.

    \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::TypeTree::HybridTreePath< T >
     A hybrid version of TreePath that supports both compile time and run time indices. More...
     
    struct  Dune::TypeTree::TreePathSize< HybridTreePath< index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathPushBack< HybridTreePath< index_constant< i >... >, k >
     
    struct  Dune::TypeTree::TreePathPushFront< HybridTreePath< index_constant< i >... >, k >
     
    struct  Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< k > > >
     
    struct  Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... > >
     
    struct  Dune::TypeTree::TreePathFront< HybridTreePath< index_constant< k >, index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< k > >, i... >
     
    struct  Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... >, i... >
     
    struct  Dune::TypeTree::TreePathPopFront< HybridTreePath< index_constant< k >, index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathConcat< HybridTreePath< index_constant< i >... >, HybridTreePath< index_constant< k >... > >
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::TreePathType
     
    namespace  Dune::TypeTree::Literals
     
    \n-\n-\n-\n-\n-

    \n-Typedefs

    template<std::size_t... i>
    using Dune::TypeTree::StaticTreePath = HybridTreePath< Dune::index_constant< i >... >
     
    \n-\n-\n-\n-

    \n-Enumerations

    enum  Dune::TypeTree::TreePathType::Type { Dune::TypeTree::TreePathType::fullyStatic\n-, Dune::TypeTree::TreePathType::dynamic\n- }
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<std::size_t... i>
    void Dune::TypeTree::print_tree_path (std::ostream &os)
     
    template<std::size_t k, std::size_t... i>
    void Dune::TypeTree::print_tree_path (std::ostream &os)
     
    template<typename... T>
    constexpr auto Dune::TypeTree::makeTreePath (const T... t)
     helper function to construct a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::hybridTreePath (const T &... t)
     Constructs a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::treePath (const T &... t)
     Constructs a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr std::size_t Dune::TypeTree::treePathSize (const HybridTreePath< T... > &)
     Returns the size (number of components) of the given HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr auto Dune::TypeTree::treePathEntry (const HybridTreePath< T... > &tp, index_constant< i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type
     Returns a copy of the i-th element of the HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr std::size_t Dune::TypeTree::treePathIndex (const HybridTreePath< T... > &tp, index_constant< i >={})
     Returns the index value of the i-th element of the HybridTreePath.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::back (const HybridTreePath< T... > &tp) -> decltype(tp.back())
     Returns a copy of the last element of the HybridTreePath.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::front (const HybridTreePath< T... > &tp) -> decltype(tp.front())
     Returns a copy of the first element of the HybridTreePath.
     
    template<typename... T>
    constexpr HybridTreePath< T..., std::size_t > Dune::TypeTree::push_back (const HybridTreePath< T... > &tp, std::size_t i)
     Appends a run time index to a HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr HybridTreePath< T..., index_constant< i > > Dune::TypeTree::push_back (const HybridTreePath< T... > &tp, index_constant< i > i_={})
     Appends a compile time index to a HybridTreePath.
     
    template<typename... T>
    constexpr HybridTreePath< std::size_t, T... > Dune::TypeTree::push_front (const HybridTreePath< T... > &tp, std::size_t element)
     Prepends a run time index to a HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr HybridTreePath< index_constant< i >, T... > Dune::TypeTree::push_front (const HybridTreePath< T... > &tp, index_constant< i > _i={})
     Prepends a compile time index to a HybridTreePath.
     
    template<typename I , typename... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::accumulate_back (const HybridTreePath< T... > &tp, I i)
     Hybrid utility that accumulates to the back of a multi-index.
     
    template<typename I , typename... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::accumulate_front (const HybridTreePath< T... > &tp, I i)
     Hybrid utility that accumulates to the front of a multi-index.
     
    template<class... Head, class... Other>
    constexpr auto Dune::TypeTree::join (const HybridTreePath< Head... > &head, const Other &... tail)
     Join two tree paths into one.
     
    template<class... T>
    constexpr auto Dune::TypeTree::reverse (const HybridTreePath< T... > &tp)
     Reverses the order of the elements in the path.
     
    template<class... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::pop_front (const HybridTreePath< T... > &tp)
     Removes first index on a HybridTreePath.
     
    template<class... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::pop_back (const HybridTreePath< T... > &tp)
     Removes last index on a HybridTreePath.
     
    template<class... S, class... T>
    constexpr bool Dune::TypeTree::operator== (const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
     Compare two HybridTreePaths for value equality.
     
    template<class S , S... lhs, class T , T... rhs>
    constexpr auto Dune::TypeTree::operator== (const HybridTreePath< std::integral_constant< S, lhs >... > &, const HybridTreePath< std::integral_constant< T, rhs >... > &)
     Overload for purely static HybridTreePaths.
     
    template<class... S, class... T>
    constexpr auto Dune::TypeTree::operator!= (const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
     Compare two HybridTreePaths for unequality.
     
    template<class S , S... lhs, class T , T... rhs>
    constexpr auto Dune::TypeTree::operator!= (const HybridTreePath< std::integral_constant< S, lhs >... > &, const HybridTreePath< std::integral_constant< T, rhs >... > &)
     Compare two static HybridTreePaths for unequality.
     
    template<char... digits>
    constexpr auto Dune::TypeTree::Literals::operator""_tp ()
     Literal to create treepath.
     
    template<typename... T>
    std::ostream & Dune::TypeTree::operator<< (std::ostream &os, const HybridTreePath< T... > &tp)
     Dumps a HybridTreePath to a stream.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,242 +1,12 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-treepath.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+transformationutilities.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bT_\b _\b>\n-\u00a0 A hybrid version of TreePath that supports both compile time and run\n- time indices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi\n- _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi\n- _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bj_\b _\b>_\b,\n- _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bl_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n- _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>\n- _\b>_\b,_\b _\bi_\b._\b._\b._\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bj_\b _\b>_\b,\n- _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bl_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bi_\b._\b._\b._\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n- _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b.\n- _\b>_\b,_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< Dune::index_constant< i\n- >... >\n-\u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:\n- _\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc , _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc }\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh (std::\n- ostream &os)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh (std::\n- ostream &os)\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T...\n- t)\n-\u00a0 helper function to construct a new\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the given indices.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T\n- &... t)\n-\u00a0 Constructs a new _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the\n- given indices.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh (const T &...\n- t)\n-\u00a0 Constructs a new _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the\n- given indices.\n-\u00a0\n-template\n- constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &)\n-\u00a0 Returns the size (number of components)\n- of the given _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n- index_constant< i >={}) -> typename\n- std::decay< decltype(std::get< i >\n- (tp._data))>::type\n-\u00a0 Returns a copy of the i-th element of\n- the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n- index_constant< i >={})\n-\u00a0 Returns the index value of the i-th\n- element of the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bb_\ba_\bc_\bk (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp) -> decltype\n- (tp.back())\n-\u00a0 Returns a copy of the last element of\n- the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp) -> decltype\n- (tp.front())\n-\u00a0 Returns a copy of the first element of\n- the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T..., std:: _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk (const\n- size_t >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, std::size_t\n- i)\n-\u00a0 Appends a run time index to a\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T..., _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk (const\n- index_constant< i > >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n- index_constant< i > i_={})\n-\u00a0 Appends a compile time index to a\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n-constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::size_t, _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt (const\n- T... >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, std::size_t\n- element)\n-\u00a0 Prepends a run time index to a\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt (const\n- index_constant< i >, T... >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n- index_constant< i > _i={})\n-\u00a0 Prepends a compile time index to a\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template 0), bool\n-> = true>\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, I i)\n-\u00a0 Hybrid utility that accumulates to the\n- back of a multi-index.\n-\u00a0\n-template 0), bool\n-> = true>\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, I i)\n-\u00a0 Hybrid utility that accumulates to the\n- front of a multi-index.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bj_\bo_\bi_\bn (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< Head... > &head, const\n- Other &... tail)\n-\u00a0 Join two tree paths into one.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bv_\be_\br_\bs_\be (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n-\u00a0 Reverses the order of the elements in\n- the path.\n-\u00a0\n-template 0), bool > = true>\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n-\u00a0 Removes first index on a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template 0), bool > = true>\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n-\u00a0 Removes last index on a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n-\u00a0\n-template\n- constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< S... > &lhs, const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &rhs)\n-\u00a0 Compare two _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for value\n- equality.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::integral_constant<\n- S, lhs >... > &, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n- std::integral_constant< T, rhs >... > &)\n-\u00a0 Overload for purely static\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< S... > &lhs, const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &rhs)\n-\u00a0 Compare two _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for\n- unequality.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::integral_constant<\n- S, lhs >... > &, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n- std::integral_constant< T, rhs >... > &)\n-\u00a0 Compare two static _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for\n- unequality.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b\"_\b\"_\b__\bt_\bp\n- ()\n-\u00a0 Literal to create treepath.\n-\u00a0\n-template\n- std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n- &os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n-\u00a0 Dumps a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh to a stream.\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00041_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00041_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: treepath.hh Source File\n+dune-typetree: transformationutilities.hh Source File\n \n \n \n \n \n \n \n@@ -74,734 +74,31 @@\n \n
    \n \n
    \n
    \n
    \n-
    treepath.hh
    \n+
    transformationutilities.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=8 sw=2 sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_TREEPATH_HH
    \n-
    7#define DUNE_TYPETREE_TREEPATH_HH
    \n+
    6#ifndef DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n+
    7#define DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n
    8
    \n-
    9#include <cstddef>
    \n-
    10#include <cassert>
    \n-
    11#include <iostream>
    \n-
    12#include <type_traits>
    \n-
    13
    \n-
    14#include <dune/common/documentation.hh>
    \n-
    15#include <dune/common/version.hh>
    \n-
    16#include <dune/common/typetraits.hh>
    \n-
    17#include <dune/common/indices.hh>
    \n-
    18#include <dune/common/hybridutilities.hh>
    \n-
    19#include <dune/common/typelist.hh>
    \n-
    20
    \n-\n-\n-
    23
    \n-
    24namespace Dune {
    \n-
    25 namespace TypeTree {
    \n-
    26
    \n-
    27 // The Impl namespace collects some free standing functions helper functions
    \n-
    28 namespace Impl {
    \n-
    29 template<typename T>
    \n-
    30 struct check_size_t_impl
    \n-
    31 {
    \n-
    32 static constexpr auto check() {
    \n-
    33 return std::is_same_v<T, std::size_t>;
    \n-
    34 }
    \n-
    35 };
    \n-
    36
    \n-
    37 template<class T, T v>
    \n-
    38 struct check_size_t_impl<std::integral_constant<T,v>>
    \n-
    39 {
    \n-
    40 static constexpr auto check() {
    \n-
    41 return std::is_same_v<T, std::size_t>;
    \n-
    42 }
    \n-
    43 };
    \n-
    44
    \n-
    45 template<typename T>
    \n-
    46 constexpr auto check_size_t() {
    \n-
    47 return check_size_t_impl<T>::check();
    \n-
    48 }
    \n-
    49
    \n-
    50 template<typename T>
    \n-
    51 constexpr auto cast_size_t(const T & v) {
    \n-
    52 // check that T is an integral type that can be cast to std::size_t
    \n-
    53 static_assert(
    \n-
    54 std::is_convertible_v<T,std::size_t> &&
    \n-
    55 std::is_integral_v<T>,
    \n-
    56 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n-
    57 // positivity can only be checked at run-time
    \n-
    58 assert(v >= 0 &&
    \n-
    59 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n-
    60 return std::size_t(v);
    \n-
    61 }
    \n-
    62
    \n-
    63 template<class T, T v>
    \n-
    64 constexpr auto cast_size_t(std::integral_constant<T,v>) {
    \n-
    65 // check that T is an intergal type that can be cast to std::size_t
    \n-
    66 // and that v is positive
    \n-
    67 static_assert(
    \n-
    68 std::is_convertible_v<T,std::size_t> &&
    \n-
    69 std::is_integral_v<T> &&
    \n-
    70 v >= 0,
    \n-
    71 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n-
    72 return std::integral_constant<std::size_t,v>();
    \n-
    73 }
    \n-
    74
    \n-
    75 // these are helper functions that help triggering a deprecation warning
    \n-
    76 template<typename T>
    \n-
    77 [[deprecated("HybridTreePath index storage should be std::size_t or std::integral_constant<std::size_t,v>!\\n"
    \n-
    78 "Using anything else is deprecated and will not possible after the 2.10 release.\\n"
    \n-
    79 "It is adviced not to specify the template parameters expicitly,\\n"
    \n-
    80 "but to use the helper functions `hybridTreePath` or `treePath`."
    \n-
    81 "These take care of converting indices to the appropriate storage.")]]
    \n-
    82 constexpr bool check_storage_type(MetaType<T>) {
    \n-
    83 return false;
    \n-
    84 }
    \n-
    85
    \n-
    86 // specialization of valid index type
    \n-
    87 template<std::size_t v>
    \n-
    88 constexpr bool check_storage_type(MetaType<std::integral_constant<std::size_t,v>>) {
    \n-
    89 return true;
    \n-
    90 }
    \n-
    91
    \n-
    92 // specialization of valid index type
    \n-
    93 constexpr bool check_storage_type(MetaType<std::size_t>) {
    \n-
    94 return true;
    \n-
    95 }
    \n-
    96 }
    \n-
    97
    \n-
    98 template<typename... T>
    \n-
    99 class HybridTreePath;
    \n-
    100
    \n-
    104
    \n-
    \n-
    105 namespace TreePathType {
    \n-\n-
    107 }
    \n-
    \n-
    108
    \n-
    109 template<typename>
    \n-\n-
    111
    \n-
    112 template<typename,std::size_t>
    \n-\n-
    114
    \n-
    115 template<typename,std::size_t>
    \n-\n-
    117
    \n-
    118 template<typename>
    \n-\n-
    120
    \n-
    121 template<typename>
    \n-\n-
    123
    \n-
    124 template<typename, std::size_t...>
    \n-\n-
    126
    \n-
    127 template<typename>
    \n-\n-
    129
    \n-
    130 template<typename, typename>
    \n-\n-
    132
    \n-
    133 template<std::size_t... i>
    \n-
    \n-
    134 void print_tree_path(std::ostream& os)
    \n-
    135 {}
    \n-
    \n-
    136
    \n-
    137 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    138 void print_tree_path(std::ostream& os)
    \n-
    139 {
    \n-
    140 os << k << " ";
    \n-
    141 print_tree_path<i...>(os);
    \n-
    142 }
    \n-
    \n-
    143
    \n-
    145
    \n-
    156 template<typename... T>
    \n-
    \n-\n-
    158 {
    \n-
    159
    \n-
    160 // enable check for dune-typetree 2.10 and above
    \n-
    161#if DUNE_VERSION_GTE(TYPETREE,2,10)
    \n-
    162 // make sure that all indices use std::size_t as the underlying number type
    \n-
    163 static_assert((... && Impl::check_size_t<T>()),
    \n-
    164 "HybridTreePath index storage must be std::size_t or std::integral_constant<std::size_t,v>");
    \n-
    165#endif
    \n-
    166
    \n-
    167 public:
    \n-
    168
    \n-
    170 using index_sequence = std::index_sequence_for<T...>;
    \n-
    171
    \n-
    \n-
    173 constexpr HybridTreePath()
    \n-
    174 {
    \n-
    175 [[maybe_unused]] constexpr bool check =
    \n-
    176 (... && Impl::check_storage_type(MetaType<T>()) );
    \n-
    177 }
    \n-
    \n-
    178
    \n-
    179 constexpr HybridTreePath(const HybridTreePath& tp) = default;
    \n-
    180 constexpr HybridTreePath(HybridTreePath&& tp) = default;
    \n-
    181
    \n-
    182 constexpr HybridTreePath& operator=(const HybridTreePath& tp) = default;
    \n-
    183 constexpr HybridTreePath& operator=(HybridTreePath&& tp) = default;
    \n-
    184
    \n-
    \n-
    186 explicit constexpr HybridTreePath(std::tuple<T...> t)
    \n-
    187 : _data(t)
    \n-
    188 {
    \n-
    189 [[maybe_unused]] constexpr bool check =
    \n-
    190 (... && Impl::check_storage_type(MetaType<T>()) );
    \n-
    191 }
    \n-
    \n-
    192
    \n-
    194 template<typename... U,
    \n-
    195 typename std::enable_if_t<(sizeof...(T) > 0 && sizeof...(U) == sizeof...(T)),bool> = true>
    \n-
    \n-
    196 explicit constexpr HybridTreePath(U... t)
    \n-
    197 : _data(t...) // we assume that all arguments are convertible to the types T...
    \n-
    198 {
    \n-
    199 [[maybe_unused]] constexpr bool check =
    \n-
    200 (... && Impl::check_storage_type(MetaType<T>()) );
    \n-
    201 }
    \n-
    \n-
    202
    \n-
    \n-
    204 [[nodiscard]] constexpr static index_sequence enumerate()
    \n-
    205 {
    \n-
    206 return {};
    \n-
    207 }
    \n-
    \n-
    208
    \n-
    \n-
    210 [[nodiscard]] constexpr static std::size_t size()
    \n-
    211 {
    \n-
    212 return sizeof...(T);
    \n-
    213 }
    \n-
    \n-
    214
    \n-
    \n-
    216 [[nodiscard]] constexpr static std::size_t max_size()
    \n-
    217 {
    \n-
    218 return size();
    \n-
    219 }
    \n-
    \n-
    220
    \n-
    222 template<std::size_t i,
    \n-
    223 std::enable_if_t<(sizeof...(T) > i),bool> = true>
    \n-
    \n-
    224 [[nodiscard]] constexpr auto operator[](Dune::index_constant<i>) const
    \n-
    225 {
    \n-
    226 return std::get<i>(_data);
    \n-
    227 }
    \n-
    \n-
    228
    \n-
    \n-
    230 [[nodiscard]] constexpr std::size_t operator[](std::size_t pos) const
    \n-
    231 {
    \n-
    232 std::size_t entry = 0;
    \n-
    233 Dune::Hybrid::forEach(enumerate(), [&] (auto i) {
    \n-
    234 if (i==pos)
    \n-
    235 entry = this->element(i);
    \n-
    236 });
    \n-
    237 return entry;
    \n-
    238 }
    \n-
    \n-
    239
    \n-
    241 template<std::size_t i,
    \n-
    242 std::enable_if_t<(sizeof...(T) > i),bool> = true>
    \n-
    \n-
    243 [[nodiscard]] constexpr auto element(Dune::index_constant<i> pos = {}) const
    \n-
    244 {
    \n-
    245 return std::get<i>(_data);
    \n-
    246 }
    \n-
    \n-
    247
    \n-
    \n-
    249 [[nodiscard]] constexpr std::size_t element(std::size_t pos) const
    \n-
    250 {
    \n-
    251 std::size_t entry = 0;
    \n-
    252 Dune::Hybrid::forEach(enumerate(), [&] (auto i) {
    \n-
    253 if (i==pos)
    \n-
    254 entry = this->element(i);
    \n-
    255 });
    \n-
    256 return entry;
    \n-
    257 }
    \n-
    \n-
    258
    \n-
    260 template<std::size_t n = sizeof...(T),
    \n-
    261 std::enable_if_t<(n > 0 && n == sizeof...(T)),bool> = true>
    \n-
    \n-
    262 [[nodiscard]] constexpr auto front() const
    \n-
    263 {
    \n-
    264 return std::get<0>(_data);
    \n-
    265 }
    \n-
    \n-
    266
    \n-
    268 template<std::size_t n = sizeof...(T),
    \n-
    269 std::enable_if_t<(n > 0 && n == sizeof...(T)),bool> = true>
    \n-
    \n-
    270 [[nodiscard]] constexpr auto back() const
    \n-
    271 {
    \n-
    272 return std::get<n-1>(_data);
    \n-
    273 }
    \n-
    \n-
    274
    \n-
    275#ifndef DOXYGEN
    \n-
    276
    \n-
    277 // I can't be bothered to make all the external accessors friends of HybridTreePath,
    \n-
    278 // so we'll only hide the data tuple from the user in Doxygen.
    \n-
    279
    \n-
    280 using Data = std::tuple<T...>;
    \n-
    281 Data _data;
    \n-
    282
    \n-
    283#endif // DOXYGEN
    \n-
    284
    \n-
    285 };
    \n-
    \n-
    286
    \n-
    288
    \n-
    294 template<typename... T>
    \n-
    \n-
    295 [[nodiscard]] constexpr auto makeTreePath(const T... t)
    \n-
    296 {
    \n-
    297 // check that all entries are based on std::size_t
    \n-
    298 static_assert((... && Impl::check_size_t<T>()),
    \n-
    299 "HybridTreePath indices must be of type std::size_t or std::integral_constant<std::size_t,v>");
    \n-
    300 return HybridTreePath<T...>(t...);
    \n-
    301 }
    \n-
    \n-
    302
    \n-
    304
    \n-
    311 template<typename... T>
    \n-
    \n-
    312 [[nodiscard]] constexpr auto hybridTreePath(const T&... t)
    \n-
    313 {
    \n-
    314 return makeTreePath(Impl::cast_size_t(t)...);
    \n-
    315 }
    \n-
    \n-
    316
    \n-
    318
    \n-
    325 template<typename... T>
    \n-
    \n-
    326 [[nodiscard]] constexpr auto treePath(const T&... t)
    \n-
    327 {
    \n-
    328 return makeTreePath(Impl::cast_size_t(t)...);
    \n-
    329 }
    \n-
    \n-
    330
    \n-
    331
    \n-
    333 template<typename... T>
    \n-
    \n-
    334 [[nodiscard]] constexpr std::size_t treePathSize(const HybridTreePath<T...>&)
    \n-
    335 {
    \n-
    336 return sizeof...(T);
    \n-
    337 }
    \n-
    \n-
    338
    \n-
    340
    \n-
    356 template<std::size_t i, typename... T>
    \n-
    \n-
    357 [[nodiscard]] constexpr auto treePathEntry(const HybridTreePath<T...>& tp, index_constant<i> = {})
    \n-
    358 -> typename std::decay<decltype(std::get<i>(tp._data))>::type
    \n-
    359 {
    \n-
    360 return std::get<i>(tp._data);
    \n-
    361 }
    \n-
    \n-
    362
    \n-
    364
    \n-
    379 template<std::size_t i,typename... T>
    \n-
    \n-
    380 [[nodiscard]] constexpr std::size_t treePathIndex(const HybridTreePath<T...>& tp, index_constant<i> = {})
    \n-
    381 {
    \n-
    382 return std::get<i>(tp._data);
    \n-
    383 }
    \n-
    \n-
    384
    \n-
    386
    \n-
    391 template<typename... T>
    \n-
    \n-
    392 [[nodiscard]] constexpr auto back(const HybridTreePath<T...>& tp)
    \n-
    393 -> decltype(tp.back())
    \n-
    394 {
    \n-
    395 return tp.back();
    \n-
    396 }
    \n-
    \n-
    397
    \n-
    399
    \n-
    404 template<typename... T>
    \n-
    \n-
    405 [[nodiscard]] constexpr auto front(const HybridTreePath<T...>& tp)
    \n-
    406 -> decltype(tp.front())
    \n-
    407 {
    \n-
    408 return tp.front();
    \n-
    409 }
    \n-
    \n-
    410
    \n-
    412
    \n-
    415 template<typename... T>
    \n-
    \n-
    416 [[nodiscard]] constexpr HybridTreePath<T...,std::size_t> push_back(const HybridTreePath<T...>& tp, std::size_t i)
    \n-
    417 {
    \n-
    418 return HybridTreePath<T...,std::size_t>(std::tuple_cat(tp._data,std::make_tuple(i)));
    \n-
    419 }
    \n-
    \n-
    420
    \n-
    422
    \n-
    436 template<std::size_t i, typename... T>
    \n-
    \n-
    437 [[nodiscard]] constexpr HybridTreePath<T...,index_constant<i>> push_back(const HybridTreePath<T...>& tp, index_constant<i> i_ = {})
    \n-
    438 {
    \n-
    439 return HybridTreePath<T...,index_constant<i> >(std::tuple_cat(tp._data,std::make_tuple(i_)));
    \n-
    440 }
    \n-
    \n-
    441
    \n-
    443
    \n-
    446 template<typename... T>
    \n-
    \n-
    447 [[nodiscard]] constexpr HybridTreePath<std::size_t,T...> push_front(const HybridTreePath<T...>& tp, std::size_t element)
    \n-
    448 {
    \n-
    449 return HybridTreePath<std::size_t,T...>(std::tuple_cat(std::make_tuple(element),tp._data));
    \n-
    450 }
    \n-
    \n-
    451
    \n-
    453
    \n-
    467 template<std::size_t i, typename... T>
    \n-
    \n-
    468 [[nodiscard]] constexpr HybridTreePath<index_constant<i>,T...> push_front(const HybridTreePath<T...>& tp, index_constant<i> _i = {})
    \n-
    469 {
    \n-
    470 return HybridTreePath<index_constant<i>,T...>(std::tuple_cat(std::make_tuple(_i),tp._data));
    \n-
    471 }
    \n-
    \n-
    472
    \n-
    474
    \n-
    485 template<typename I, typename... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n-
    \n-
    486 [[nodiscard]] constexpr auto accumulate_back(const HybridTreePath<T...>& tp, I i) {
    \n-
    487 using ::Dune::Hybrid::plus;
    \n-
    488 return push_back(pop_back(tp), plus(back(tp), i));
    \n-
    489 }
    \n-
    \n-
    490
    \n-
    491
    \n-
    493
    \n-
    504 template<typename I, typename... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n-
    \n-
    505 [[nodiscard]] constexpr auto accumulate_front(const HybridTreePath<T...>& tp, I i) {
    \n-
    506 using ::Dune::Hybrid::plus;
    \n-
    507 return push_front(pop_front(tp), plus(front(tp), i));
    \n-
    508 }
    \n-
    \n-
    509
    \n-
    511 template<class... Head, class... Other>
    \n-
    \n-
    512 [[nodiscard]] constexpr auto join(const HybridTreePath<Head...>& head, const Other&... tail) {
    \n-
    513 return TypeTree::HybridTreePath{std::tuple_cat(head._data, tail._data...)};
    \n-
    514 }
    \n-
    \n-
    515
    \n-
    517 template<class... T>
    \n-
    \n-
    518 [[nodiscard]] constexpr auto reverse(const HybridTreePath<T...>& tp) {
    \n-
    519 constexpr std::size_t size = sizeof...(T);
    \n-
    520 return unpackIntegerSequence([&](auto... i){
    \n-
    521 return treePath(tp[index_constant<size-i-1>{}] ...);
    \n-
    522 }, std::make_index_sequence<size>{});
    \n-
    523 }
    \n-
    \n-
    524
    \n-
    526
    \n-
    529 template <class... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n-
    \n-
    530 [[nodiscard]] constexpr auto pop_front(const HybridTreePath<T...>& tp)
    \n-
    531 {
    \n-
    532 return unpackIntegerSequence([&](auto... i){
    \n-
    533 return HybridTreePath{std::make_tuple(std::get<i+1>(tp._data)...)};
    \n-
    534 }, std::make_index_sequence<(sizeof...(T) - 1)>{});
    \n-
    535 }
    \n-
    \n-
    536
    \n-
    538
    \n-
    541 template <class... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n-
    \n-
    542 [[nodiscard]] constexpr auto pop_back(const HybridTreePath<T...>& tp)
    \n-
    543 {
    \n-
    544 return unpackIntegerSequence([&](auto... i){
    \n-
    545 return HybridTreePath{std::make_tuple(std::get<i>(tp._data)...)};
    \n-
    546 }, std::make_index_sequence<(sizeof...(T) - 1)>{});
    \n-
    547 }
    \n-
    \n-
    548
    \n-
    550
    \n-
    558 template <class... S, class... T>
    \n-
    \n-
    559 [[nodiscard]] constexpr bool operator==(
    \n-
    560 const HybridTreePath<S...>& lhs,
    \n-
    561 const HybridTreePath<T...>& rhs)
    \n-
    562 {
    \n-
    563 if constexpr (sizeof...(S) == sizeof...(T)) {
    \n-
    564 if constexpr ((Dune::IsInteroperable<S,T>::value &&...)) {
    \n-
    565 return unpackIntegerSequence([&](auto... i){
    \n-
    566 return ((std::get<i>(lhs._data) == std::get<i>(rhs._data)) &&...);
    \n-
    567 }, std::make_index_sequence<(sizeof...(S))>{});
    \n-
    568 } else {
    \n-
    569 return false;
    \n-
    570 }
    \n-
    571 } else {
    \n-
    572 return false;
    \n-
    573 }
    \n-
    574 }
    \n-
    \n-
    575
    \n-
    577
    \n-
    582 template <class S, S... lhs, class T, T... rhs>
    \n-
    \n-
    583 [[nodiscard]] constexpr auto operator==(
    \n-
    584 const HybridTreePath<std::integral_constant<S,lhs>...>&,
    \n-
    585 const HybridTreePath<std::integral_constant<T,rhs>...>&)
    \n-
    586 {
    \n-
    587 return std::bool_constant<hybridTreePath(lhs...) == hybridTreePath(rhs...)>{};
    \n-
    588 }
    \n-
    \n-
    589
    \n-
    590
    \n-
    592 template <class... S, class... T>
    \n-
    \n-
    593 [[nodiscard]] constexpr auto operator!=(
    \n-
    594 const HybridTreePath<S...>& lhs,
    \n-
    595 const HybridTreePath<T...>& rhs)
    \n-
    596 {
    \n-
    597 return !(lhs == rhs);
    \n-
    598 }
    \n-
    \n-
    599
    \n-
    601 template <class S, S... lhs, class T, T... rhs>
    \n-
    \n-
    602 [[nodiscard]] constexpr auto operator!=(
    \n-
    603 const HybridTreePath<std::integral_constant<S,lhs>...>&,
    \n-
    604 const HybridTreePath<std::integral_constant<T,rhs>...>&)
    \n-
    605 {
    \n-
    606 return std::bool_constant<hybridTreePath(lhs...) != hybridTreePath(rhs...)>{};
    \n-
    607 }
    \n-
    \n-
    608
    \n-
    609
    \n-
    \n-
    610 inline namespace Literals {
    \n-
    611
    \n-
    613
    \n-
    617 template <char... digits>
    \n-
    \n-
    618 constexpr auto operator"" _tp()
    \n-
    619 {
    \n-
    620 using namespace Dune::Indices::Literals;
    \n-
    621 return hybridTreePath(operator""_ic<digits...>());
    \n-
    622 }
    \n-
    \n-
    623
    \n-
    624 } // end namespace Literals
    \n-
    \n-
    625
    \n-
    626
    \n-
    627 template<std::size_t... i>
    \n-
    \n-
    628 struct TreePathSize<HybridTreePath<index_constant<i>...> >
    \n-
    629 : public index_constant<sizeof...(i)>
    \n-
    630 {};
    \n-
    \n-
    631
    \n-
    632
    \n-
    633 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    634 struct TreePathPushBack<HybridTreePath<index_constant<i>...>,k>
    \n-
    635 {
    \n-
    636 typedef HybridTreePath<index_constant<i>...,index_constant<k>> type;
    \n-
    637 };
    \n-
    \n-
    638
    \n-
    639 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    640 struct TreePathPushFront<HybridTreePath<index_constant<i>...>,k>
    \n-
    641 {
    \n-
    642 typedef HybridTreePath<index_constant<k>,index_constant<i>...> type;
    \n-
    643 };
    \n-
    \n-
    644
    \n-
    645 template<std::size_t k>
    \n-
    \n-
    646 struct TreePathBack<HybridTreePath<index_constant<k>>>
    \n-
    647 : public index_constant<k>
    \n-
    648 {};
    \n-
    \n-
    649
    \n-
    650 template<std::size_t j, std::size_t k, std::size_t... l>
    \n-
    \n-
    651 struct TreePathBack<HybridTreePath<index_constant<j>,index_constant<k>,index_constant<l>...>>
    \n-
    652 : public TreePathBack<HybridTreePath<index_constant<k>,index_constant<l>...>>
    \n-
    653 {};
    \n-
    \n-
    654
    \n-
    655 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    656 struct TreePathFront<HybridTreePath<index_constant<k>,index_constant<i>...>>
    \n-
    657 : public index_constant<k>
    \n-
    658 {};
    \n-
    \n-
    659
    \n-
    660 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    661 struct TreePathPopBack<HybridTreePath<index_constant<k>>,i...>
    \n-
    662 {
    \n-\n-
    664 };
    \n-
    \n-
    665
    \n-
    666 template<std::size_t j,
    \n-
    667 std::size_t k,
    \n-
    668 std::size_t... l,
    \n-
    669 std::size_t... i>
    \n-
    \n-
    670 struct TreePathPopBack<HybridTreePath<index_constant<j>,index_constant<k>,index_constant<l>...>,i...>
    \n-
    671 : public TreePathPopBack<HybridTreePath<index_constant<k>,index_constant<l>...>,i...,j>
    \n-
    672 {};
    \n-
    \n-
    673
    \n-
    674 template<std::size_t k, std::size_t... i>
    \n-
    \n-
    675 struct TreePathPopFront<HybridTreePath<index_constant<k>,index_constant<i>...> >
    \n-
    676 {
    \n-\n-
    678 };
    \n-
    \n-
    679
    \n-
    680 template<std::size_t... i, std::size_t... k>
    \n-
    \n-
    681 struct TreePathConcat<HybridTreePath<index_constant<i>...>,HybridTreePath<index_constant<k>...> >
    \n-
    682 {
    \n-
    683 typedef HybridTreePath<index_constant<i>...,index_constant<k>...> type;
    \n-
    684 };
    \n-
    \n-
    685
    \n-
    686#ifndef DOXYGEN
    \n-
    687
    \n-
    688 namespace impl {
    \n-
    689
    \n-
    690 // end of recursion
    \n-
    691 template<std::size_t i, typename... T>
    \n-
    692 typename std::enable_if<
    \n-
    693 (i == sizeof...(T))
    \n-
    694 >::type
    \n-
    695 print_hybrid_tree_path(std::ostream& os, const HybridTreePath<T...>& tp, index_constant<i> _i)
    \n-
    696 {}
    \n-
    697
    \n-
    698 // print current entry and recurse
    \n-
    699 template<std::size_t i, typename... T>
    \n-
    700 typename std::enable_if<
    \n-
    701 (i < sizeof...(T))
    \n-
    702 >::type
    \n-
    703 print_hybrid_tree_path(std::ostream& os, const HybridTreePath<T...>& tp, index_constant<i> _i)
    \n-
    704 {
    \n-
    705 os << treePathIndex(tp,_i) << " ";
    \n-
    706 print_hybrid_tree_path(os,tp,index_constant<i+1>{});
    \n-
    707 }
    \n-
    708
    \n-
    709 } // namespace impl
    \n-
    710
    \n-
    711#endif // DOXYGEN
    \n-
    712
    \n-
    714 template<typename... T>
    \n-
    \n-
    715 std::ostream& operator<<(std::ostream& os, const HybridTreePath<T...>& tp)
    \n-
    716 {
    \n-
    717 os << "HybridTreePath< ";
    \n-
    718 impl::print_hybrid_tree_path(os, tp, index_constant<0>{});
    \n-
    719 os << ">";
    \n-
    720 return os;
    \n-
    721 }
    \n-
    \n-
    722
    \n-
    723 template<std::size_t... i>
    \n-\n-
    725
    \n-
    727
    \n-
    728 } // namespace TypeTree
    \n-
    729} //namespace Dune
    \n-
    730
    \n-
    731#endif // DUNE_TYPETREE_TREEPATH_HH
    \n-\n-\n-
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n-
    std::ostream & operator<<(std::ostream &os, const HybridTreePath< T... > &tp)
    Dumps a HybridTreePath to a stream.
    Definition treepath.hh:715
    \n-
    constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
    Returns the size (number of components) of the given HybridTreePath.
    Definition treepath.hh:334
    \n-
    constexpr auto back(const HybridTreePath< T... > &tp) -> decltype(tp.back())
    Returns a copy of the last element of the HybridTreePath.
    Definition treepath.hh:392
    \n-
    constexpr HybridTreePath< std::size_t, T... > push_front(const HybridTreePath< T... > &tp, std::size_t element)
    Prepends a run time index to a HybridTreePath.
    Definition treepath.hh:447
    \n-
    constexpr auto accumulate_front(const HybridTreePath< T... > &tp, I i)
    Hybrid utility that accumulates to the front of a multi-index.
    Definition treepath.hh:505
    \n-
    constexpr auto pop_front(const HybridTreePath< T... > &tp)
    Removes first index on a HybridTreePath.
    Definition treepath.hh:530
    \n-
    constexpr auto reverse(const HybridTreePath< T... > &tp)
    Reverses the order of the elements in the path.
    Definition treepath.hh:518
    \n-
    constexpr auto accumulate_back(const HybridTreePath< T... > &tp, I i)
    Hybrid utility that accumulates to the back of a multi-index.
    Definition treepath.hh:486
    \n-
    constexpr auto join(const HybridTreePath< Head... > &head, const Other &... tail)
    Join two tree paths into one.
    Definition treepath.hh:512
    \n-
    constexpr auto treePathEntry(const HybridTreePath< T... > &tp, index_constant< i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type
    Returns a copy of the i-th element of the HybridTreePath.
    Definition treepath.hh:357
    \n-
    constexpr auto pop_back(const HybridTreePath< T... > &tp)
    Removes last index on a HybridTreePath.
    Definition treepath.hh:542
    \n-
    constexpr auto operator!=(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
    Compare two HybridTreePaths for unequality.
    Definition treepath.hh:593
    \n-
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n-
    constexpr std::size_t treePathIndex(const HybridTreePath< T... > &tp, index_constant< i >={})
    Returns the index value of the i-th element of the HybridTreePath.
    Definition treepath.hh:380
    \n-
    constexpr auto makeTreePath(const T... t)
    helper function to construct a new HybridTreePath from the given indices.
    Definition treepath.hh:295
    \n-
    constexpr bool operator==(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
    Compare two HybridTreePaths for value equality.
    Definition treepath.hh:559
    \n-
    void print_tree_path(std::ostream &os)
    Definition treepath.hh:134
    \n-
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n-
    constexpr auto front(const HybridTreePath< T... > &tp) -> decltype(tp.front())
    Returns a copy of the first element of the HybridTreePath.
    Definition treepath.hh:405
    \n-
    Definition accumulate_static.hh:16
    \n-
    Type
    Definition treepath.hh:106
    \n-
    @ fullyStatic
    Definition treepath.hh:106
    \n-
    @ dynamic
    Definition treepath.hh:106
    \n-
    Statically combine two values of type result_type using +.
    Definition accumulate_static.hh:49
    \n-
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n-
    constexpr HybridTreePath(HybridTreePath &&tp)=default
    \n-
    constexpr auto back() const
    Get the last index value. Only available in non-empty paths.
    Definition treepath.hh:270
    \n-
    constexpr HybridTreePath & operator=(const HybridTreePath &tp)=default
    \n-
    constexpr std::size_t element(std::size_t pos) const
    Get the index value at position pos.
    Definition treepath.hh:249
    \n-
    constexpr HybridTreePath(std::tuple< T... > t)
    Constructor from a std::tuple
    Definition treepath.hh:186
    \n-
    constexpr HybridTreePath & operator=(HybridTreePath &&tp)=default
    \n-
    constexpr HybridTreePath(U... t)
    Constructor from arguments.
    Definition treepath.hh:196
    \n-
    constexpr HybridTreePath()
    Default constructor.
    Definition treepath.hh:173
    \n-
    constexpr auto element(Dune::index_constant< i > pos={}) const
    Get the last index value.
    Definition treepath.hh:243
    \n-
    static constexpr std::size_t size()
    Get the size (length) of this path.
    Definition treepath.hh:210
    \n-
    constexpr auto operator[](Dune::index_constant< i >) const
    Get the index value at position pos.
    Definition treepath.hh:224
    \n-
    constexpr auto front() const
    Get the first index value. Only available in non-empty paths.
    Definition treepath.hh:262
    \n-
    static constexpr index_sequence enumerate()
    Returns an index_sequence for enumerating the components of this HybridTreePath.
    Definition treepath.hh:204
    \n-
    constexpr HybridTreePath(const HybridTreePath &tp)=default
    \n-
    constexpr std::size_t operator[](std::size_t pos) const
    Get the index value at position pos.
    Definition treepath.hh:230
    \n-
    static constexpr std::size_t max_size()
    Get the size (length) of this path.
    Definition treepath.hh:216
    \n-
    std::index_sequence_for< T... > index_sequence
    An index_sequence for the entries in this HybridTreePath.
    Definition treepath.hh:170
    \n-
    Definition treepath.hh:110
    \n-
    Definition treepath.hh:113
    \n-
    Definition treepath.hh:116
    \n-
    Definition treepath.hh:119
    \n-
    Definition treepath.hh:122
    \n-
    Definition treepath.hh:125
    \n-
    Definition treepath.hh:128
    \n-
    Definition treepath.hh:131
    \n-
    HybridTreePath< index_constant< i >..., index_constant< k > > type
    Definition treepath.hh:636
    \n-
    HybridTreePath< index_constant< k >, index_constant< i >... > type
    Definition treepath.hh:642
    \n-
    HybridTreePath< index_constant< i >... > type
    Definition treepath.hh:663
    \n-
    HybridTreePath< index_constant< i >... > type
    Definition treepath.hh:677
    \n-
    HybridTreePath< index_constant< i >..., index_constant< k >... > type
    Definition treepath.hh:683
    \n+\n+\n+
    11
    \n+
    12#endif // DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n+\n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,812 +1,26 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-treepath.hh\n+transformationutilities.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=8 sw=2 sts=2:\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TREEPATH_HH\n-7#define DUNE_TYPETREE_TREEPATH_HH\n+6#ifndef DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n+7#define DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n 8\n-9#include \n-10#include \n-11#include \n-12#include \n-13\n-14#include \n-15#include \n-16#include \n-17#include \n-18#include \n-19#include \n-20\n-21#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-23\n-24namespace _\bD_\bu_\bn_\be {\n-25 namespace TypeTree {\n-26\n-27 // The Impl namespace collects some free standing functions helper functions\n-28 namespace Impl {\n-29 template\n-30 struct check_size_t_impl\n-31 {\n-32 static constexpr auto check() {\n-33 return std::is_same_v;\n-34 }\n-35 };\n-36\n-37 template\n-38 struct check_size_t_impl>\n-39 {\n-40 static constexpr auto check() {\n-41 return std::is_same_v;\n-42 }\n-43 };\n-44\n-45 template\n-46 constexpr auto check_size_t() {\n-47 return check_size_t_impl::check();\n-48 }\n-49\n-50 template\n-51 constexpr auto cast_size_t(const T & v) {\n-52 // check that T is an integral type that can be cast to std::size_t\n-53 static_assert(\n-54 std::is_convertible_v &&\n-55 std::is_integral_v,\n-56 \"HybridTreePath indices must be convertible to std::size_t or std::\n-integral_constant\");\n-57 // positivity can only be checked at run-time\n-58 assert(v >= 0 &&\n-59 \"HybridTreePath indices must be convertible to std::size_t or std::\n-integral_constant\");\n-60 return std::size_t(v);\n-61 }\n-62\n-63 template\n-64 constexpr auto cast_size_t(std::integral_constant) {\n-65 // check that T is an intergal type that can be cast to std::size_t\n-66 // and that v is positive\n-67 static_assert(\n-68 std::is_convertible_v &&\n-69 std::is_integral_v &&\n-70 v >= 0,\n-71 \"HybridTreePath indices must be convertible to std::size_t or std::\n-integral_constant\");\n-72 return std::integral_constant();\n-73 }\n-74\n-75 // these are helper functions that help triggering a deprecation warning\n-76 template\n-77 [[deprecated(\"HybridTreePath index storage should be std::size_t or std::\n-integral_constant!\\n\"\n-78 \"Using anything else is deprecated and will not possible after the 2.10\n-release.\\n\"\n-79 \"It is adviced not to specify the template parameters expicitly,\\n\"\n-80 \"but to use the helper functions `hybridTreePath` or `treePath`.\"\n-81 \"These take care of converting indices to the appropriate storage.\")]]\n-82 constexpr bool check_storage_type(MetaType) {\n-83 return false;\n-84 }\n-85\n-86 // specialization of valid index type\n-87 template\n-88 constexpr bool check_storage_type(MetaType>) {\n-89 return true;\n-90 }\n-91\n-92 // specialization of valid index type\n-93 constexpr bool check_storage_type(MetaType) {\n-94 return true;\n-95 }\n-96 }\n-97\n-98 template\n-99 class HybridTreePath;\n-100\n-104\n-_\b1_\b0_\b5 namespace TreePathType {\n-_\b1_\b0_\b6 enum _\bT_\by_\bp_\be { _\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc, _\bd_\by_\bn_\ba_\bm_\bi_\bc };\n-107 }\n-108\n-109 template\n-_\b1_\b1_\b0 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be;\n-111\n-112 template\n-_\b1_\b1_\b3 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk;\n-114\n-115 template\n-_\b1_\b1_\b6 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt;\n-117\n-118 template\n-_\b1_\b1_\b9 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk;\n-120\n-121 template\n-_\b1_\b2_\b2 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt;\n-123\n-124 template\n-_\b1_\b2_\b5 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk;\n-126\n-127 template\n-_\b1_\b2_\b8 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt;\n-129\n-130 template\n-_\b1_\b3_\b1 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt;\n-132\n-133 template\n-_\b1_\b3_\b4 void _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(std::ostream& os)\n-135 {}\n-136\n-137 template\n-_\b1_\b3_\b8 void _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(std::ostream& os)\n-139 {\n-140 os << k << \" \";\n-141 _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(os);\n-142 }\n-143\n-145\n-156 template\n-_\b1_\b5_\b7 class _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-158 {\n-159\n-160 // enable check for dune-typetree 2.10 and above\n-161#if DUNE_VERSION_GTE(TYPETREE,2,10)\n-162 // make sure that all indices use std::size_t as the underlying number type\n-163 static_assert((... && Impl::check_size_t()),\n-164 \"HybridTreePath index storage must be std::size_t or std::\n-integral_constant\");\n-165#endif\n-166\n-167 public:\n-168\n-_\b1_\b7_\b0 using _\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be = std::index_sequence_for;\n-171\n-_\b1_\b7_\b3 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh()\n-174 {\n-175 [[maybe_unused]] constexpr bool check =\n-176 (... && Impl::check_storage_type(MetaType()) );\n-177 }\n-178\n-_\b1_\b7_\b9 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& tp) = default;\n-_\b1_\b8_\b0 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh&& tp) = default;\n-181\n-_\b1_\b8_\b2 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& tp) = default;\n-_\b1_\b8_\b3 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh&& tp) = default;\n-184\n-_\b1_\b8_\b6 explicit constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple t)\n-187 : _data(t)\n-188 {\n-189 [[maybe_unused]] constexpr bool check =\n-190 (... && Impl::check_storage_type(MetaType()) );\n-191 }\n-192\n-194 template 0 && sizeof...(U) == sizeof...\n-(T)),bool> = true>\n-_\b1_\b9_\b6 explicit constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(U... t)\n-197 : _data(t...) // we assume that all arguments are convertible to the types\n-T...\n-198 {\n-199 [[maybe_unused]] constexpr bool check =\n-200 (... && Impl::check_storage_type(MetaType()) );\n-201 }\n-202\n-_\b2_\b0_\b4 [[nodiscard]] constexpr static _\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be _\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be()\n-205 {\n-206 return {};\n-207 }\n-208\n-_\b2_\b1_\b0 [[nodiscard]] constexpr static std::size_t _\bs_\bi_\bz_\be()\n-211 {\n-212 return sizeof...(T);\n-213 }\n-214\n-_\b2_\b1_\b6 [[nodiscard]] constexpr static std::size_t _\bm_\ba_\bx_\b__\bs_\bi_\bz_\be()\n-217 {\n-218 return _\bs_\bi_\bz_\be();\n-219 }\n-220\n-222 template i),bool> = true>\n-_\b2_\b2_\b4 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](Dune::index_constant) const\n-225 {\n-226 return std::get(_data);\n-227 }\n-228\n-_\b2_\b3_\b0 [[nodiscard]] constexpr std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t pos) const\n-231 {\n-232 std::size_t entry = 0;\n-233 Dune::Hybrid::forEach(_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be(), [&] (auto i) {\n-234 if (i==pos)\n-235 entry = this->_\be_\bl_\be_\bm_\be_\bn_\bt(i);\n-236 });\n-237 return entry;\n-238 }\n-239\n-241 template i),bool> = true>\n-_\b2_\b4_\b3 [[nodiscard]] constexpr auto _\be_\bl_\be_\bm_\be_\bn_\bt(Dune::index_constant pos = {})\n-const\n-244 {\n-245 return std::get(_data);\n-246 }\n-247\n-_\b2_\b4_\b9 [[nodiscard]] constexpr std::size_t _\be_\bl_\be_\bm_\be_\bn_\bt(std::size_t pos) const\n-250 {\n-251 std::size_t entry = 0;\n-252 Dune::Hybrid::forEach(_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be(), [&] (auto i) {\n-253 if (i==pos)\n-254 entry = this->_\be_\bl_\be_\bm_\be_\bn_\bt(i);\n-255 });\n-256 return entry;\n-257 }\n-258\n-260 template 0 && n == sizeof...(T)),bool> = true>\n-_\b2_\b6_\b2 [[nodiscard]] constexpr auto _\bf_\br_\bo_\bn_\bt() const\n-263 {\n-264 return std::get<0>(_data);\n-265 }\n-266\n-268 template 0 && n == sizeof...(T)),bool> = true>\n-_\b2_\b7_\b0 [[nodiscard]] constexpr auto _\bb_\ba_\bc_\bk() const\n-271 {\n-272 return std::get(_data);\n-273 }\n-274\n-275#ifndef DOXYGEN\n-276\n-277 // I can't be bothered to make all the external accessors friends of\n-HybridTreePath,\n-278 // so we'll only hide the data tuple from the user in Doxygen.\n-279\n-280 using Data = std::tuple;\n-281 Data _data;\n-282\n-283#endif // DOXYGEN\n-284\n-285 };\n-286\n-288\n-294 template\n-_\b2_\b9_\b5 [[nodiscard]] constexpr auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T... t)\n-296 {\n-297 // check that all entries are based on std::size_t\n-298 static_assert((... && Impl::check_size_t()),\n-299 \"HybridTreePath indices must be of type std::size_t or std::\n-integral_constant\");\n-300 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(t...);\n-301 }\n-302\n-304\n-311 template\n-_\b3_\b1_\b2 [[nodiscard]] constexpr auto _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T&... t)\n-313 {\n-314 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(Impl::cast_size_t(t)...);\n-315 }\n-316\n-318\n-325 template\n-_\b3_\b2_\b6 [[nodiscard]] constexpr auto _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(const T&... t)\n-327 {\n-328 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(Impl::cast_size_t(t)...);\n-329 }\n-330\n-331\n-333 template\n-_\b3_\b3_\b4 [[nodiscard]] constexpr std::size_t _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&)\n-335 {\n-336 return sizeof...(T);\n-337 }\n-338\n-340\n-356 template\n-_\b3_\b5_\b7 [[nodiscard]] constexpr auto _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp,\n-index_constant = {})\n-358 -> typename std::decay(tp._data))>::type\n-359 {\n-360 return std::get(tp._data);\n-361 }\n-362\n-364\n-379 template\n-_\b3_\b8_\b0 [[nodiscard]] constexpr std::size_t _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx(const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant = {})\n-381 {\n-382 return std::get(tp._data);\n-383 }\n-384\n-386\n-391 template\n-_\b3_\b9_\b2 [[nodiscard]] constexpr auto _\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n-393 -> decltype(tp._\bb_\ba_\bc_\bk())\n-394 {\n-395 return tp._\bb_\ba_\bc_\bk();\n-396 }\n-397\n-399\n-404 template\n-_\b4_\b0_\b5 [[nodiscard]] constexpr auto _\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n-406 -> decltype(tp._\bf_\br_\bo_\bn_\bt())\n-407 {\n-408 return tp._\bf_\br_\bo_\bn_\bt();\n-409 }\n-410\n-412\n-415 template\n-_\b4_\b1_\b6 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, std::size_t i)\n-417 {\n-418 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple_cat(tp._data,std::\n-make_tuple(i)));\n-419 }\n-420\n-422\n-436 template\n-_\b4_\b3_\b7 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh> _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant i_ = {})\n-438 {\n-439 return HybridTreePath >(std::tuple_cat\n-(tp._data,std::make_tuple(i_)));\n-440 }\n-441\n-443\n-446 template\n-_\b4_\b4_\b7 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(const\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, std::size_t element)\n-448 {\n-449 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple_cat(std::make_tuple\n-(element),tp._data));\n-450 }\n-451\n-453\n-467 template\n-_\b4_\b6_\b8 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>,T...> _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt\n-(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant _i = {})\n-469 {\n-470 return HybridTreePath,T...>(std::tuple_cat(std::\n-make_tuple(_i),tp._data));\n-471 }\n-472\n-474\n-485 template\n-0),bool> = true>\n-_\b4_\b8_\b6 [[nodiscard]] constexpr auto _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&\n-tp, I i) {\n-487 using ::Dune::Hybrid::plus;\n-488 return _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk(tp), _\bp_\bl_\bu_\bs(_\bb_\ba_\bc_\bk(tp), i));\n-489 }\n-490\n-491\n-493\n-504 template\n-0),bool> = true>\n-_\b5_\b0_\b5 [[nodiscard]] constexpr auto _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&\n-tp, I i) {\n-506 using ::Dune::Hybrid::plus;\n-507 return _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt(tp), _\bp_\bl_\bu_\bs(_\bf_\br_\bo_\bn_\bt(tp), i));\n-508 }\n-509\n-511 template\n-_\b5_\b1_\b2 [[nodiscard]] constexpr auto _\bj_\bo_\bi_\bn(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bH_\be_\ba_\bd_\b._\b._\b._\b>& head,\n-const Other&... tail) {\n-513 return _\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::tuple_cat(head._data, tail._data...)};\n-514 }\n-515\n-517 template\n-_\b5_\b1_\b8 [[nodiscard]] constexpr auto _\br_\be_\bv_\be_\br_\bs_\be(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp) {\n-519 constexpr std::size_t size = sizeof...(T);\n-520 return unpackIntegerSequence([&](auto... i){\n-521 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(tp[index_constant{}] ...);\n-522 }, std::make_index_sequence{});\n-523 }\n-524\n-526\n-529 template 0),bool> = true>\n-_\b5_\b3_\b0 [[nodiscard]] constexpr auto _\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n-531 {\n-532 return unpackIntegerSequence([&](auto... i){\n-533 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::make_tuple(std::get(tp._data)...)};\n-534 }, std::make_index_sequence<(sizeof...(T) - 1)>{});\n-535 }\n-536\n-538\n-541 template 0),bool> = true>\n-_\b5_\b4_\b2 [[nodiscard]] constexpr auto _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n-543 {\n-544 return unpackIntegerSequence([&](auto... i){\n-545 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::make_tuple(std::get(tp._data)...)};\n-546 }, std::make_index_sequence<(sizeof...(T) - 1)>{});\n-547 }\n-548\n-550\n-558 template \n-_\b5_\b5_\b9 [[nodiscard]] constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(\n-560 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bS_\b._\b._\b._\b>& lhs,\n-561 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& rhs)\n-562 {\n-563 if constexpr (sizeof...(S) == sizeof...(T)) {\n-564 if constexpr ((Dune::IsInteroperable::value &&...)) {\n-565 return unpackIntegerSequence([&](auto... i){\n-566 return ((std::get(lhs._data) == std::get(rhs._data)) &&...);\n-567 }, std::make_index_sequence<(sizeof...(S))>{});\n-568 } else {\n-569 return false;\n-570 }\n-571 } else {\n-572 return false;\n-573 }\n-574 }\n-575\n-577\n-582 template \n-_\b5_\b8_\b3 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(\n-584 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&,\n-585 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&)\n-586 {\n-587 return std::bool_constant<_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(lhs...) == _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(rhs...)>\n-{};\n-588 }\n-589\n-590\n-592 template \n-_\b5_\b9_\b3 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(\n-594 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bS_\b._\b._\b._\b>& lhs,\n-595 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& rhs)\n-596 {\n-597 return !(lhs == rhs);\n-598 }\n-599\n-601 template \n-_\b6_\b0_\b2 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(\n-603 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&,\n-604 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&)\n-605 {\n-606 return std::bool_constant<_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(lhs...) != _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(rhs...)>\n-{};\n-607 }\n-608\n-609\n-_\b6_\b1_\b0 inline namespace Literals {\n-611\n-613\n-617 template \n-_\b6_\b1_\b8 constexpr auto operator\"\" _tp()\n-619 {\n-620 using namespace Dune::Indices::Literals;\n-621 return _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(operator\"\"_ic());\n-622 }\n-623\n-624 } // end namespace Literals\n-625\n-626\n-627 template\n-_\b6_\b2_\b8 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...> >\n-629 : public index_constant\n-630 {};\n-631\n-632\n-633 template\n-_\b6_\b3_\b4 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,k>\n-635 {\n-_\b6_\b3_\b6 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...,index_constant> _\bt_\by_\bp_\be;\n-637 };\n-638\n-639 template\n-_\b6_\b4_\b0 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,k>\n-641 {\n-_\b6_\b4_\b2 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bk_\b>,index_constant...> _\bt_\by_\bp_\be;\n-643 };\n-644\n-645 template\n-_\b6_\b4_\b6 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh>>\n-647 : public index_constant\n-648 {};\n-649\n-650 template\n-_\b6_\b5_\b1 struct\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant,index_constant...>>\n-652 : public\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk,index_constant...>>\n-653 {};\n-654\n-655 template\n-_\b6_\b5_\b6 struct\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant...>>\n-657 : public index_constant\n-658 {};\n-659\n-660 template\n-_\b6_\b6_\b1 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh>,i...>\n-662 {\n-_\b6_\b6_\b3 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...> _\bt_\by_\bp_\be;\n-664 };\n-665\n-666 template\n-_\b6_\b7_\b0 struct\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant,index_constant...>,i...>\n-671 : public\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk,index_constant...>,i...,j>\n-672 {};\n-673\n-674 template\n-_\b6_\b7_\b5 struct\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant...> >\n-676 {\n-_\b6_\b7_\b7 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...> _\bt_\by_\bp_\be;\n-678 };\n-679\n-680 template\n-_\b6_\b8_\b1 struct\n-_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>\n->\n-682 {\n-_\b6_\b8_\b3 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...,index_constant...> _\bt_\by_\bp_\be;\n-684 };\n-685\n-686#ifndef DOXYGEN\n-687\n-688 namespace impl {\n-689\n-690 // end of recursion\n-691 template\n-692 typename std::enable_if<\n-693 (i == sizeof...(T))\n-694 >::type\n-695 print_hybrid_tree_path(std::ostream& os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp,\n-index_constant _i)\n-696 {}\n-697\n-698 // print current entry and recurse\n-699 template\n-700 typename std::enable_if<\n-701 (i < sizeof...(T))\n-702 >::type\n-703 print_hybrid_tree_path(std::ostream& os, const HybridTreePath& tp,\n-index_constant _i)\n-704 {\n-705 os << _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx(tp,_i) << \" \";\n-706 print_hybrid_tree_path(os,tp,index_constant{});\n-707 }\n-708\n-709 } // namespace impl\n-710\n-711#endif // DOXYGEN\n-712\n-714 template\n-_\b7_\b1_\b5 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n-716 {\n-717 os << \"HybridTreePath< \";\n-718 impl::print_hybrid_tree_path(os, tp, index_constant<0>{});\n-719 os << \">\";\n-720 return os;\n-721 }\n-722\n-723 template\n-_\b7_\b2_\b4 using _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...>;\n-725\n-727\n-728 } // namespace TypeTree\n-729} //namespace Dune\n-730\n-731#endif // DUNE_TYPETREE_TREEPATH_HH\n-_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n-T... > &tp, std::size_t i)\n-Appends a run time index to a HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &os, const HybridTreePath< T... > &tp)\n-Dumps a HybridTreePath to a stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:715\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n-constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n-Returns the size (number of components) of the given HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bb_\ba_\bc_\bk\n-constexpr auto back(const HybridTreePath< T... > &tp) -> decltype(tp.back())\n-Returns a copy of the last element of the HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt\n-constexpr HybridTreePath< std::size_t, T... > push_front(const HybridTreePath<\n-T... > &tp, std::size_t element)\n-Prepends a run time index to a HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:447\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt\n-constexpr auto accumulate_front(const HybridTreePath< T... > &tp, I i)\n-Hybrid utility that accumulates to the front of a multi-index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:505\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt\n-constexpr auto pop_front(const HybridTreePath< T... > &tp)\n-Removes first index on a HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:530\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bv_\be_\br_\bs_\be\n-constexpr auto reverse(const HybridTreePath< T... > &tp)\n-Reverses the order of the elements in the path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:518\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk\n-constexpr auto accumulate_back(const HybridTreePath< T... > &tp, I i)\n-Hybrid utility that accumulates to the back of a multi-index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bj_\bo_\bi_\bn\n-constexpr auto join(const HybridTreePath< Head... > &head, const Other &...\n-tail)\n-Join two tree paths into one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by\n-constexpr auto treePathEntry(const HybridTreePath< T... > &tp, index_constant<\n-i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type\n-Returns a copy of the i-th element of the HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:357\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n-constexpr auto pop_back(const HybridTreePath< T... > &tp)\n-Removes last index on a HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:542\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-constexpr auto operator!=(const HybridTreePath< S... > &lhs, const\n-HybridTreePath< T... > &rhs)\n-Compare two HybridTreePaths for unequality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:593\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto hybridTreePath(const T &... t)\n-Constructs a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx\n-constexpr std::size_t treePathIndex(const HybridTreePath< T... > &tp,\n-index_constant< i >={})\n-Returns the index value of the i-th element of the HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto makeTreePath(const T... t)\n-helper function to construct a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-constexpr bool operator==(const HybridTreePath< S... > &lhs, const\n-HybridTreePath< T... > &rhs)\n-Compare two HybridTreePaths for value equality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:559\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh\n-void print_tree_path(std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:134\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto treePath(const T &... t)\n-Constructs a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-constexpr auto front(const HybridTreePath< T... > &tp) -> decltype(tp.front())\n-Returns a copy of the first element of the HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:405\n-_\bD_\bu_\bn_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n-Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc\n-@ fullyStatic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n-@ dynamic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs\n-Statically combine two values of type result_type using +.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-A hybrid version of TreePath that supports both compile time and run time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr HybridTreePath(HybridTreePath &&tp)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bb_\ba_\bc_\bk\n-constexpr auto back() const\n-Get the last index value. Only available in non-empty paths.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-constexpr HybridTreePath & operator=(const HybridTreePath &tp)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt\n-constexpr std::size_t element(std::size_t pos) const\n-Get the index value at position pos.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:249\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr HybridTreePath(std::tuple< T... > t)\n-Constructor from a std::tuple\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-constexpr HybridTreePath & operator=(HybridTreePath &&tp)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr HybridTreePath(U... t)\n-Constructor from arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr HybridTreePath()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt\n-constexpr auto element(Dune::index_constant< i > pos={}) const\n-Get the last index value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bs_\bi_\bz_\be\n-static constexpr std::size_t size()\n-Get the size (length) of this path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:210\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-constexpr auto operator[](Dune::index_constant< i >) const\n-Get the index value at position pos.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-constexpr auto front() const\n-Get the first index value. Only available in non-empty paths.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be\n-static constexpr index_sequence enumerate()\n-Returns an index_sequence for enumerating the components of this\n-HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:204\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr HybridTreePath(const HybridTreePath &tp)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-constexpr std::size_t operator[](std::size_t pos) const\n-Get the index value at position pos.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be\n-static constexpr std::size_t max_size()\n-Get the size (length) of this path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be\n-std::index_sequence_for< T... > index_sequence\n-An index_sequence for the entries in this HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk\n-_\b>_\b:_\b:_\bt_\by_\bp_\be\n-HybridTreePath< index_constant< i >..., index_constant< k > > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:636\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk\n-_\b>_\b:_\b:_\bt_\by_\bp_\be\n-HybridTreePath< index_constant< k >, index_constant< i >... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:642\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>_\b,_\b _\bi_\b._\b._\b.\n-_\b>_\b:_\b:_\bt_\by_\bp_\be\n-HybridTreePath< index_constant< i >... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:663\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n-_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-HybridTreePath< index_constant< i >... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,\n-_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-HybridTreePath< index_constant< i >..., index_constant< k >... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:683\n+9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+11\n+12#endif // DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n+_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh\n+_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00044.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00044.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: typetraits.hh File Reference\n+dune-typetree: treecontainer.hh File Reference\n \n \n \n \n \n \n \n@@ -72,99 +72,73 @@\n
  • dune
  • typetree
  • \n
    \n \n
    \n \n-
    typetraits.hh File Reference
    \n+
    treecontainer.hh File Reference
    \n
    \n
    \n
    #include <type_traits>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/typetree/treepath.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n+#include <utility>
    \n+#include <functional>
    \n+#include <array>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/tuplevector.hh>
    \n+#include <dune/typetree/treepath.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n \n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    struct  Dune::first_type< T0, T... >
    class  Dune::TypeTree::Detail::ContainerFactory< LeafToValue >
     
    struct  Dune::TypeTree::has_node_tag< T >
    class  Dune::TypeTree::Detail::TreeContainerVectorBackend< Container >
     
    struct  Dune::TypeTree::has_node_tag< T >::yes
     
    struct  Dune::TypeTree::has_node_tag< T >::no
     
    struct  Dune::TypeTree::has_node_tag_value< T, V >
     
    struct  Dune::TypeTree::has_node_tag_value< T, V >::maybe< N >
     
    struct  Dune::TypeTree::has_node_tag_value< T, V >::yes
     
    struct  Dune::TypeTree::has_node_tag_value< T, V >::no
     
    struct  Dune::TypeTree::has_implementation_tag< T >
     
    struct  Dune::TypeTree::has_implementation_tag< T >::yes
     
    struct  Dune::TypeTree::has_implementation_tag< T >::no
     
    struct  Dune::TypeTree::has_implementation_tag_value< T, V >
     
    struct  Dune::TypeTree::has_implementation_tag_value< T, V >::maybe< N >
     
    struct  Dune::TypeTree::has_implementation_tag_value< T, V >::yes
     
    struct  Dune::TypeTree::has_implementation_tag_value< T, V >::no
     
    struct  Dune::TypeTree::AlwaysVoid< typename >
     
    struct  Dune::TypeTree::meta_function
     Marker tag declaring a meta function. More...
     
    struct  Dune::TypeTree::lazy_evaluate< F >
     Helper meta function to delay evaluation of F. More...
     
    struct  Dune::TypeTree::lazy_identity< F >
     Identity function. More...
     
    struct  Dune::TypeTree::evaluate_if_meta_function< F >
     Meta function that evaluates its argument iff it inherits from meta_function. More...
     
    struct  Dune::TypeTree::IsTreePath< T >
     Check if type represents a tree path. More...
    struct  Dune::TypeTree::Detail::LeafToDefaultConstructibleValue< LeafToValue >
     
    \n \n \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::impl
    namespace  Dune::TypeTree::Detail
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Typedefs

    template<class Value , class Tree >
    using Dune::TypeTree::UniformTreeContainer = std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >()))>
     Alias to container type generated by makeTreeContainer for given tree type and uniform value type.
     
    template<template< class Node > class LeafToValue, class Tree >
    using Dune::TypeTree::TreeContainer = std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))>
     Alias to container type generated by makeTreeContainer for give tree type and when using LeafToValue to create values.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    template<typename T >
    T * Dune::TypeTree::declptr ()
     Helper function for generating a pointer to a value of type T in an unevaluated operand setting.
     
    constexpr auto Dune::TypeTree::impl::isTreePath (void *) -> std::false_type
     
    template<class... I>
    constexpr auto Dune::TypeTree::impl::isTreePath (const HybridTreePath< I... > *) -> std::true_type
     
    template<class T >
    constexpr auto Dune::TypeTree::isTreePath (const T &) -> IsTreePath< T >
     Check if given object represents a tree path.
     
    template<class Container >
    auto Dune::TypeTree::Detail::makeTreeContainerVectorBackend (Container &&container)
     
    template<class Tree , class LeafToValue >
    auto Dune::TypeTree::makeTreeContainer (const Tree &tree, LeafToValue &&leafToValue)
     Create container havin the same structure as the given tree.
     
    template<class Value , class Tree >
    auto Dune::TypeTree::makeTreeContainer (const Tree &tree)
     Create container havin the same structure as the given tree.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,87 +1,62 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-typetraits.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+treecontainer.hh File Reference\n #include \n-#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b0_\b,_\b _\bT_\b._\b._\b._\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bL_\be_\ba_\bf_\bT_\bo_\bV_\ba_\bl_\bu_\be_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b<_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\by_\be_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\bn_\bo\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bm_\ba_\by_\bb_\be_\b<_\b _\bN_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\by_\be_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bn_\bo\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\by_\be_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b<_\b _\bT_\b _\b>_\b:_\b:_\bn_\bo\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bm_\ba_\by_\bb_\be_\b<_\b _\bN_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\by_\be_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b<_\b _\bT_\b,_\b _\bV_\b _\b>_\b:_\b:_\bn_\bo\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-\u00a0 Marker tag declaring a meta function. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b<_\b _\bF_\b _\b>\n-\u00a0 Helper meta function to delay evaluation of F. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b<_\b _\bF_\b _\b>\n-\u00a0 Identity function. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bF_\b _\b>\n-\u00a0 Meta function that evaluates its argument iff it inherits from\n- _\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bT_\b _\b>\n-\u00a0 Check if type represents a tree path. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be_\b<_\b _\bL_\be_\ba_\bf_\bT_\bo_\bV_\ba_\bl_\bu_\be_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n+\u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t< decltype\n+ (_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br< Value >(std::declval< const Tree & >()))>\n+\u00a0 Alias to container type generated by makeTreeContainer for given tree\n+ type and uniform value type.\n+\u00a0\n+template class LeafToValue, class Tree >\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t< decltype(_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+ (std::declval< const Tree & >(), std::declval< _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:\n+ _\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be< LeafToValue > >()))>\n+\u00a0 Alias to container type generated by makeTreeContainer for give tree\n+ type and when using LeafToValue to create values.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- T *\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bc_\bl_\bp_\bt_\br ()\n-\u00a0 Helper function for generating a pointer to a value of type T\n- in an unevaluated operand setting.\n-\u00a0\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (void *) -> std::false_type\n-\u00a0\n-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< I... >\n- *) -> std::true_type\n-\u00a0\n-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T &) -> _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T >\n-\u00a0 Check if given object represents a tree path.\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd (Container\n+ &&container)\n+\u00a0\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br (const Tree &tree, LeafToValue\n+ &&leafToValue)\n+\u00a0 Create container havin the same structure as the given tree.\n+\u00a0\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br (const Tree &tree)\n+\u00a0 Create container havin the same structure as the given tree.\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00044_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00044_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: typetraits.hh Source File\n+dune-typetree: treecontainer.hh Source File\n \n \n \n \n \n \n \n@@ -74,278 +74,333 @@\n \n
    \n \n
    \n \n
    \n-
    typetraits.hh
    \n+
    treecontainer.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_TYPETRAITS_HH
    \n-
    7#define DUNE_TYPETREE_TYPETRAITS_HH
    \n+
    6#ifndef DUNE_TYPETREE_TREECONTAINER_HH
    \n+
    7#define DUNE_TYPETREE_TREECONTAINER_HH
    \n
    8
    \n
    9#include <type_traits>
    \n-
    10#include <dune/common/typetraits.hh>
    \n-
    11
    \n-\n-\n-
    14
    \n-
    15namespace Dune {
    \n-
    16
    \n-
    17 // Provide some more C++11 TMP helpers.
    \n-
    18 // These should be upstreamed to dune-common ASAP.
    \n-
    19
    \n-
    20 template<typename... T>
    \n-
    21 struct first_type;
    \n-
    22
    \n-
    23 template<typename T0, typename... T>
    \n-
    \n-
    24 struct first_type<T0,T...>
    \n-
    25 {
    \n-
    26 typedef T0 type;
    \n-
    27 };
    \n-
    \n-
    28
    \n-
    29 namespace TypeTree {
    \n-
    30
    \n-
    31 template<typename T>
    \n-
    \n-\n-
    33 {
    \n-
    34 struct yes { char dummy[1]; };
    \n-
    35 struct no { char dummy[2]; };
    \n-
    36
    \n-
    37 template<typename X>
    \n-
    38 static yes test(NodeTag<X> *);
    \n-
    39 template<typename X>
    \n-
    40 static no test(...);
    \n-
    41
    \n-
    43 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
    \n-
    44 };
    \n-
    \n+
    10#include <utility>
    \n+
    11#include <functional>
    \n+
    12#include <array>
    \n+
    13
    \n+
    14#include <dune/common/indices.hh>
    \n+
    15#include <dune/common/hybridutilities.hh>
    \n+
    16#include <dune/common/rangeutilities.hh>
    \n+
    17#include <dune/common/tuplevector.hh>
    \n+
    18
    \n+\n+
    20
    \n+
    21namespace Dune {
    \n+
    22 namespace TypeTree {
    \n+
    23
    \n+
    24 namespace Detail {
    \n+
    25
    \n+
    26 /*
    \n+
    27 * \\brief A factory class creating a hybrid container compatible with a type tree
    \n+
    28 *
    \n+
    29 * This class allows to create a nested hybrid container having the same structure
    \n+
    30 * as a given type tree. Power nodes are represented as std::array's while composite
    \n+
    31 * nodes are represented as Dune::TupleVector's. The stored values for the leaf nodes
    \n+
    32 * are creating using a given predicate. Once created, the factory provides an
    \n+
    33 * operator() creating the container for the tree given as argument.
    \n+
    34 *
    \n+
    35 * \\tparam LeafToValue Type of a predicate that determines the stored values at the leafs
    \n+
    36 */
    \n+
    37 template<class LeafToValue>
    \n+
    \n+\n+
    39 {
    \n+
    40 template<class N>
    \n+
    41 using DynamicDegreeConcept = decltype((std::size_t(std::declval<N>().degree()), true));
    \n+
    42
    \n+
    43 template<class N>
    \n+
    44 using StaticDegreeConcept = decltype((std::integral_constant<std::size_t, N::degree()>{}, true));
    \n
    45
    \n-
    46 template<typename T, typename V>
    \n-
    \n-\n-
    48 {
    \n-
    49 template<int N>
    \n-
    50 struct maybe { char dummy[N+1]; };
    \n-
    51 struct yes { char dummy[2]; };
    \n-
    52 struct no { char dummy[1]; };
    \n-
    53
    \n-
    54 template<typename X>
    \n-\n-\n-
    57 template<typename X>
    \n-
    58 static no test(...);
    \n-
    59
    \n-
    61 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
    \n-
    62 };
    \n-
    \n-
    63
    \n-
    64 template<typename T>
    \n-
    \n-\n-
    66 {
    \n-
    67 struct yes { char dummy[1]; };
    \n-
    68 struct no { char dummy[2]; };
    \n+
    46 template<class N>
    \n+
    47 using DynamicChildAccessConcept = decltype((std::declval<N>().child(0u), true));
    \n+
    48
    \n+
    49 public:
    \n+
    50
    \n+
    \n+
    58 ContainerFactory(LeafToValue leafToValue) :
    \n+
    59 leafToValue_(leafToValue)
    \n+
    60 {}
    \n+
    \n+
    61
    \n+
    62 template<class Node>
    \n+
    \n+
    63 auto operator()(const Node& node)
    \n+
    64 {
    \n+
    65 return (*this)(node, Dune::PriorityTag<5>{});
    \n+
    66 }
    \n+
    \n+
    67
    \n+
    68 private:
    \n
    69
    \n-
    70 template<typename X>
    \n-\n-
    72 template<typename X>
    \n-
    73 static no test(...);
    \n-
    74
    \n-
    76 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
    \n-
    77 };
    \n-
    \n-
    78
    \n-
    79 template<typename T, typename V>
    \n-
    \n-\n-
    81 {
    \n-
    82 template<int N>
    \n-
    83 struct maybe { char dummy[N+1]; };
    \n-
    84 struct yes { char dummy[2]; };
    \n-
    85 struct no { char dummy[1]; };
    \n+
    70 template<class Node,
    \n+
    71 std::enable_if_t<Node::isLeaf, bool> = true>
    \n+
    72 auto operator()(const Node& node, Dune::PriorityTag<4>)
    \n+
    73 {
    \n+
    74 return leafToValue_(node);
    \n+
    75 }
    \n+
    76
    \n+
    77 template<class Node,
    \n+
    78 StaticDegreeConcept<Node> = true,
    \n+
    79 DynamicChildAccessConcept<Node> = true>
    \n+
    80 auto operator()(const Node& node, Dune::PriorityTag<3>)
    \n+
    81 {
    \n+
    82 return Dune::unpackIntegerSequence([&](auto... indices) {
    \n+
    83 return std::array{(*this)(node.child(indices))...};
    \n+
    84 }, std::make_index_sequence<std::size_t(Node::degree())>());
    \n+
    85 }
    \n
    86
    \n-
    87 template<typename X>
    \n-\n-\n-
    90 template<typename X>
    \n-
    91 static no test(...);
    \n-
    92
    \n-
    94 constexpr static bool value = sizeof(test<T>(0)) == sizeof(yes);
    \n-
    95 };
    \n-
    \n-
    96
    \n-
    97 template<typename>
    \n-
    \n-\n-
    99 {
    \n-
    100 typedef void type;
    \n-
    101 };
    \n-
    \n-
    102
    \n-
    103
    \n-
    105 template<typename T>
    \n-\n-
    107
    \n+
    87 template<class Node,
    \n+
    88 DynamicDegreeConcept<Node> = true,
    \n+
    89 DynamicChildAccessConcept<Node> = true>
    \n+
    90 auto operator()(const Node& node, Dune::PriorityTag<2>)
    \n+
    91 {
    \n+
    92 using TransformedChild = decltype((*this)(node.child(0)));
    \n+
    93 std::vector<TransformedChild> container;
    \n+
    94 container.reserve(node.degree());
    \n+
    95 for (std::size_t i = 0; i < node.degree(); ++i)
    \n+
    96 container.emplace_back((*this)(node.child(i)));
    \n+
    97 return container;
    \n+
    98 }
    \n+
    99
    \n+
    100 template<class Node,
    \n+
    101 StaticDegreeConcept<Node> = true>
    \n+
    102 auto operator()(const Node& node, Dune::PriorityTag<1>)
    \n+
    103 {
    \n+
    104 return Dune::unpackIntegerSequence([&](auto... indices) {
    \n+
    105 return Dune::makeTupleVector((*this)(node.child(indices))...);
    \n+
    106 }, std::make_index_sequence<std::size_t(Node::degree())>());
    \n+
    107 }
    \n
    108
    \n-
    109 // Support for lazy evaluation of meta functions. This is required when doing
    \n-
    110 // nested tag dispatch without C++11-style typedefs (based on using syntax).
    \n-
    111 // The standard struct-based meta functions cause premature evaluation in a
    \n-
    112 // context that is not SFINAE-compatible. We thus have to return the meta function
    \n-
    113 // without evaluating it, placing that burden on the caller. On the other hand,
    \n-
    114 // the lookup will often directly be the target type, so here is some helper code
    \n-
    115 // to automatically do the additional evaluation if necessary.
    \n-
    116 // Too bad that the new syntax is GCC 4.6+...
    \n-
    117
    \n-
    118
    \n-
    120
    \n-
    123 struct meta_function {};
    \n-
    124
    \n-
    126 template<typename F>
    \n-
    \n-\n-
    128 {
    \n-
    129 typedef typename F::type type;
    \n-
    130 };
    \n-
    \n-
    131
    \n-
    133 template<typename F>
    \n-
    \n-\n-
    135 {
    \n-
    136 typedef F type;
    \n-
    137 };
    \n-
    \n-
    138
    \n-
    140 template<typename F>
    \n-
    \n-\n-
    142 {
    \n-
    143 typedef typename std::conditional<
    \n-
    144 std::is_base_of<meta_function,F>::value,
    \n-\n-\n-
    147 >::type::type type;
    \n-
    148 };
    \n-
    \n-
    149
    \n-
    \n-
    150 namespace impl {
    \n-
    151
    \n-
    152 // Check if type is a or is derived from one of the tree path types
    \n-
    153
    \n-
    154 // Default overload for types not representing a tree path
    \n-
    \n-
    155 constexpr auto isTreePath(void*)
    \n-
    156 -> std::false_type
    \n-
    157 {
    \n-
    158 return std::false_type();
    \n-
    159 }
    \n-
    \n+
    109 private:
    \n+
    110 LeafToValue leafToValue_;
    \n+
    111 };
    \n+
    \n+
    112
    \n+
    113
    \n+
    114 /*
    \n+
    115 * \\brief Wrap nested container to provide a VectorBackend
    \n+
    116 */
    \n+
    117 template<class Container>
    \n+
    \n+\n+
    119 {
    \n+
    120 template<class C>
    \n+
    121 static constexpr decltype(auto) accessByTreePath(C&& container, const HybridTreePath<>& path)
    \n+
    122 {
    \n+
    123 return container;
    \n+
    124 }
    \n+
    125
    \n+
    126 template<class C, class... T>
    \n+
    127 static constexpr decltype(auto) accessByTreePath(C&& container, const HybridTreePath<T...>& path)
    \n+
    128 {
    \n+
    129 auto head = path[Dune::Indices::_0];
    \n+
    130 auto tailPath = Dune::unpackIntegerSequence([&](auto... i){
    \n+
    131 return treePath(path[Dune::index_constant<i+1>{}]...);
    \n+
    132 }, std::make_index_sequence<sizeof...(T)-1>());
    \n+
    133 return accessByTreePath(container[head], tailPath);
    \n+
    134 }
    \n+
    135
    \n+
    136 template<class C, class Tree,
    \n+
    137 std::enable_if_t<Tree::isLeaf, bool> = true>
    \n+
    138 static void resizeImpl(C& /*container*/, const Tree& /*tree*/, Dune::PriorityTag<2>)
    \n+
    139 {
    \n+
    140 /* do nothing */
    \n+
    141 }
    \n+
    142
    \n+
    143 template<class C, class Tree,
    \n+
    144 class = decltype(std::declval<C>().resize(0u))>
    \n+
    145 static void resizeImpl(C& container, const Tree& tree, Dune::PriorityTag<1>)
    \n+
    146 {
    \n+
    147 container.resize(tree.degree());
    \n+
    148 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {
    \n+
    149 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});
    \n+
    150 });
    \n+
    151 }
    \n+
    152
    \n+
    153 template<class C, class Tree>
    \n+
    154 static void resizeImpl(C& container, const Tree& tree, Dune::PriorityTag<0>)
    \n+
    155 {
    \n+
    156 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {
    \n+
    157 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});
    \n+
    158 });
    \n+
    159 }
    \n
    160
    \n-
    161 // Overload for instances of HybridTreePath<...>
    \n-
    162 template<class... I>
    \n-
    \n-
    163 constexpr auto isTreePath(const HybridTreePath<I...>*)
    \n-
    164 -> std::true_type
    \n-
    165 {
    \n-
    166 return std::true_type();
    \n-
    167 }
    \n-
    \n+
    161 template<class T>
    \n+
    162 using TypeTreeConcept = decltype((
    \n+
    163 std::declval<T>().degree(),
    \n+
    164 T::isLeaf,
    \n+
    165 T::isPower,
    \n+
    166 T::isComposite,
    \n+
    167 true));
    \n
    168
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    181 template<class T>
    \n-
    \n-
    182 struct IsTreePath :
    \n-
    183 public decltype(impl::isTreePath((typename std::decay<T>::type*)(nullptr)))
    \n-
    184 {};
    \n-
    \n-
    185
    \n-
    192 template<class T>
    \n-
    \n-
    193 constexpr auto isTreePath(const T&)
    \n-\n-
    195 {
    \n-
    196 return IsTreePath<T>();
    \n-
    197 }
    \n-
    \n-
    198
    \n-
    199
    \n-
    200 } // end namespace TypeTree
    \n-
    201} // end namespace Dune
    \n-
    202
    \n-
    203#endif // DUNE_TYPETREE_TYPETRAITS_HH
    \n-\n-\n-
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n-
    typename std::decay_t< T >::ImplementationTag ImplementationTag
    Returns the implementation tag of the given Node.
    Definition nodeinterface.hh:74
    \n+
    169 public:
    \n+
    \n+
    171 TreeContainerVectorBackend(Container&& container) :
    \n+
    172 container_(std::move(container))
    \n+
    173 {}
    \n+
    \n+
    174
    \n+
    176 template <class Tree, TypeTreeConcept<Tree> = true>
    \n+
    \n+
    177 TreeContainerVectorBackend(const Tree& tree) :
    \n+\n+
    179 {
    \n+
    180 this->resize(tree);
    \n+
    181 }
    \n+
    \n+
    182
    \n+
    184 template <class C = Container,
    \n+
    185 std::enable_if_t<std::is_default_constructible_v<C>, bool> = true>
    \n+
    \n+\n+
    187 container_()
    \n+
    188 {}
    \n+
    \n+
    189
    \n+
    190 template<class... T>
    \n+
    \n+
    191 decltype(auto) operator[](const HybridTreePath<T...>& path) const
    \n+
    192 {
    \n+
    193 return accessByTreePath(container_, path);
    \n+
    194 }
    \n+
    \n+
    195
    \n+
    196 template<class... T>
    \n+
    \n+
    197 decltype(auto) operator[](const HybridTreePath<T...>& path)
    \n+
    198 {
    \n+
    199 return accessByTreePath(container_, path);
    \n+
    200 }
    \n+
    \n+
    201
    \n+
    203 template<class Tree, TypeTreeConcept<Tree> = true>
    \n+
    \n+
    204 void resize(const Tree& tree)
    \n+
    205 {
    \n+
    206 resizeImpl(container_, tree, Dune::PriorityTag<5>{});
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    \n+
    209 const Container& data() const
    \n+
    210 {
    \n+
    211 return container_;
    \n+
    212 }
    \n+
    \n+
    213
    \n+
    \n+
    214 Container& data()
    \n+
    215 {
    \n+
    216 return container_;
    \n+
    217 }
    \n+
    \n+
    218
    \n+
    219 private:
    \n+
    220 Container container_;
    \n+
    221 };
    \n+
    \n+
    222
    \n+
    223 template<class Container>
    \n+
    \n+
    224 auto makeTreeContainerVectorBackend(Container&& container)
    \n+
    225 {
    \n+
    226 return TreeContainerVectorBackend<std::decay_t<Container>>(std::forward<Container>(container));
    \n+
    227 }
    \n+
    \n+
    228
    \n+
    229 /*
    \n+
    230 * \\brief A simple lambda for creating default constructible values from a node
    \n+
    231 *
    \n+
    232 * This simply returns LeafToValue<Node>{} for a given Node. It's needed
    \n+
    233 * because using a lambda expression in a using declaration is not allowed
    \n+
    234 * because it's an unevaluated context.
    \n+
    235 */
    \n+
    236 template<template<class Node> class LeafToValue>
    \n+
    \n+\n+
    238 {
    \n+
    239 template<class Node>
    \n+
    \n+
    240 auto operator()(const Node& node) const
    \n+
    241 {
    \n+
    242 return LeafToValue<Node>{};
    \n+
    243 }
    \n+
    \n+
    244 };
    \n+
    \n+
    245
    \n+
    246 } // namespace Detail
    \n+
    247
    \n+
    267 template<class Tree, class LeafToValue>
    \n+
    \n+
    268 auto makeTreeContainer(const Tree& tree, LeafToValue&& leafToValue)
    \n+
    269 {
    \n+
    270 auto f = std::ref(leafToValue);
    \n+\n+
    272 return Detail::makeTreeContainerVectorBackend(factory(tree));
    \n+
    273 }
    \n+
    \n+
    274
    \n+
    290 template<class Value, class Tree>
    \n+
    \n+
    291 auto makeTreeContainer(const Tree& tree)
    \n+
    292 {
    \n+
    293 return makeTreeContainer(tree, [](const auto&) {return Value{};});
    \n+
    294 }
    \n+
    \n+
    295
    \n+
    299 template<class Value, class Tree>
    \n+
    300 using UniformTreeContainer = std::decay_t<decltype(makeTreeContainer<Value>(std::declval<const Tree&>()))>;
    \n+
    301
    \n+
    305 template<template<class Node> class LeafToValue, class Tree>
    \n+
    306 using TreeContainer = std::decay_t<decltype(makeTreeContainer(std::declval<const Tree&>(), std::declval<Detail::LeafToDefaultConstructibleValue<LeafToValue>>()))>;
    \n+
    307
    \n+
    309
    \n+
    310 } // namespace TypeTree
    \n+
    311} //namespace Dune
    \n+
    312
    \n+
    313#endif // DUNE_TYPETREE_TREECONTAINER_HH
    \n+\n+
    auto makeTreeContainer(const Tree &tree, LeafToValue &&leafToValue)
    Create container havin the same structure as the given tree.
    Definition treecontainer.hh:268
    \n+
    std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >()))> UniformTreeContainer
    Alias to container type generated by makeTreeContainer for given tree type and uniform value type.
    Definition treecontainer.hh:300
    \n+
    std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))> TreeContainer
    Alias to container type generated by makeTreeContainer for give tree type and when using LeafToValue ...
    Definition treecontainer.hh:306
    \n+
    std::size_t degree(const Node &node)
    Returns the degree of node as run time information.
    Definition nodeinterface.hh:79
    \n+
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n
    Definition accumulate_static.hh:16
    \n-
    constexpr auto isTreePath(const T &) -> IsTreePath< T >
    Check if given object represents a tree path.
    Definition typetraits.hh:193
    \n-
    T * declptr()
    Helper function for generating a pointer to a value of type T in an unevaluated operand setting.
    \n-
    constexpr auto isTreePath(void *) -> std::false_type
    Definition typetraits.hh:155
    \n+
    auto makeTreeContainerVectorBackend(Container &&container)
    Definition treecontainer.hh:224
    \n+
    Definition treecontainer.hh:39
    \n+
    auto operator()(const Node &node)
    Definition treecontainer.hh:63
    \n+
    ContainerFactory(LeafToValue leafToValue)
    Create ContainerFactory.
    Definition treecontainer.hh:58
    \n+\n+
    void resize(const Tree &tree)
    Resize the (nested) container depending on the degree of the tree nodes.
    Definition treecontainer.hh:204
    \n+
    Container & data()
    Definition treecontainer.hh:214
    \n+
    const Container & data() const
    Definition treecontainer.hh:209
    \n+
    TreeContainerVectorBackend(Container &&container)
    Move the passed container into the internal storage.
    Definition treecontainer.hh:171
    \n+
    TreeContainerVectorBackend()
    Default constructor. The stored container might need to be resized before usage.
    Definition treecontainer.hh:186
    \n+
    TreeContainerVectorBackend(const Tree &tree)
    Default construct the container and perform a resize depending on the tree-node degrees.
    Definition treecontainer.hh:177
    \n+\n+
    auto operator()(const Node &node) const
    Definition treecontainer.hh:240
    \n
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n-
    Definition typetraits.hh:21
    \n-
    T0 type
    Definition typetraits.hh:26
    \n-
    Definition typetraits.hh:33
    \n-
    static constexpr bool value
    True if class T defines a NodeTag.
    Definition typetraits.hh:43
    \n-
    static yes test(NodeTag< X > *)
    \n-\n-
    Definition typetraits.hh:34
    \n-
    char dummy[1]
    Definition typetraits.hh:34
    \n-
    Definition typetraits.hh:35
    \n-
    char dummy[2]
    Definition typetraits.hh:35
    \n-
    Definition typetraits.hh:48
    \n-
    static maybe< std::is_base_of< V, NodeTag< X > >::value > test(NodeTag< X > *a)
    \n-
    static constexpr bool value
    True if class T defines a NodeTag of type V.
    Definition typetraits.hh:61
    \n-\n-\n-
    char dummy[N+1]
    Definition typetraits.hh:50
    \n-
    Definition typetraits.hh:51
    \n-
    char dummy[2]
    Definition typetraits.hh:51
    \n-
    Definition typetraits.hh:52
    \n-
    char dummy[1]
    Definition typetraits.hh:52
    \n-
    Definition typetraits.hh:66
    \n-
    static yes test(ImplementationTag< X > *)
    \n-\n-
    static constexpr bool value
    True if class T defines an ImplementationTag.
    Definition typetraits.hh:76
    \n-\n-
    char dummy[1]
    Definition typetraits.hh:67
    \n-\n-
    char dummy[2]
    Definition typetraits.hh:68
    \n-\n-
    static maybe< std::is_base_of< V, ImplementationTag< X > >::value > test(ImplementationTag< X > *a)
    \n-\n-
    static constexpr bool value
    True if class T defines an ImplementationTag of type V.
    Definition typetraits.hh:94
    \n-\n-
    char dummy[N+1]
    Definition typetraits.hh:83
    \n-\n-
    char dummy[2]
    Definition typetraits.hh:84
    \n-\n-
    char dummy[1]
    Definition typetraits.hh:85
    \n-
    Definition typetraits.hh:99
    \n-
    void type
    Definition typetraits.hh:100
    \n-
    Marker tag declaring a meta function.
    Definition typetraits.hh:123
    \n-
    Helper meta function to delay evaluation of F.
    Definition typetraits.hh:128
    \n-
    F::type type
    Definition typetraits.hh:129
    \n-
    Identity function.
    Definition typetraits.hh:135
    \n-
    F type
    Definition typetraits.hh:136
    \n-
    Meta function that evaluates its argument iff it inherits from meta_function.
    Definition typetraits.hh:142
    \n-
    std::conditional< std::is_base_of< meta_function, F >::value, lazy_evaluate< F >, lazy_identity< F > >::type::type type
    Definition typetraits.hh:147
    \n-
    Check if type represents a tree path.
    Definition typetraits.hh:184
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,346 +1,367 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-typetraits.hh\n+treecontainer.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TYPETRAITS_HH\n-7#define DUNE_TYPETREE_TYPETRAITS_HH\n+6#ifndef DUNE_TYPETREE_TREECONTAINER_HH\n+7#define DUNE_TYPETREE_TREECONTAINER_HH\n 8\n 9#include \n-10#include \n-11\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-14\n-15namespace _\bD_\bu_\bn_\be {\n-16\n-17 // Provide some more C++11 TMP helpers.\n-18 // These should be upstreamed to dune-common ASAP.\n-19\n-20 template\n-_\b2_\b1 struct _\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be;\n-22\n-23 template\n-_\b2_\b4 struct _\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be\n-25 {\n-_\b2_\b6 typedef T0 _\bt_\by_\bp_\be;\n-27 };\n-28\n-29 namespace TypeTree {\n-30\n-31 template\n-_\b3_\b2 struct _\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg\n-33 {\n-_\b3_\b4 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[1]; };\n-_\b3_\b5 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[2]; };\n-36\n-37 template\n-_\b3_\b8 static _\by_\be_\bs _\bt_\be_\bs_\bt(_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b> *);\n-39 template\n-_\b4_\b0 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n-41\n-_\b4_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n-44 };\n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15#include \n+16#include \n+17#include \n+18\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+20\n+21namespace _\bD_\bu_\bn_\be {\n+22 namespace TypeTree {\n+23\n+24 namespace Detail {\n+25\n+26 /*\n+27 * \\brief A factory class creating a hybrid container compatible with a type\n+tree\n+28 *\n+29 * This class allows to create a nested hybrid container having the same\n+structure\n+30 * as a given type tree. Power nodes are represented as std::array's while\n+composite\n+31 * nodes are represented as Dune::TupleVector's. The stored values for the\n+leaf nodes\n+32 * are creating using a given predicate. Once created, the factory provides\n+an\n+33 * operator() creating the container for the tree given as argument.\n+34 *\n+35 * \\tparam LeafToValue Type of a predicate that determines the stored values\n+at the leafs\n+36 */\n+37 template\n+_\b3_\b8 class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+39 {\n+40 template\n+41 using DynamicDegreeConcept = decltype((std::size_t(std::declval()._\bd_\be_\bg_\br_\be_\be\n+()), true));\n+42\n+43 template\n+44 using StaticDegreeConcept = decltype((std::integral_constant{}, true));\n 45\n-46 template\n-_\b4_\b7 struct _\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n-48 {\n-49 template\n-_\b5_\b0 struct _\bm_\ba_\by_\bb_\be { char _\bd_\bu_\bm_\bm_\by[N+1]; };\n-_\b5_\b1 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[2]; };\n-_\b5_\b2 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[1]; };\n-53\n-54 template\n-55 static _\bm_\ba_\by_\bb_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bb_\ba_\bs_\be_\b__\bo_\bf_\b<_\bV_\b,_\b _\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b>>_\b:_\b:_\bv_\ba_\bl_\bu_\be>\n-_\b5_\b6 _\bt_\be_\bs_\bt(_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bX_\b> * a);\n-57 template\n-_\b5_\b8 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n-59\n-_\b6_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n-62 };\n-63\n-64 template\n-_\b6_\b5 struct _\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg\n-66 {\n-_\b6_\b7 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[1]; };\n-_\b6_\b8 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[2]; };\n+46 template\n+47 using DynamicChildAccessConcept = decltype((std::declval().child(0u),\n+true));\n+48\n+49 public:\n+50\n+_\b5_\b8 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by(LeafToValue leafToValue) :\n+59 leafToValue_(leafToValue)\n+60 {}\n+61\n+62 template\n+_\b6_\b3 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node)\n+64 {\n+65 return (*this)(node, Dune::PriorityTag<5>{});\n+66 }\n+67\n+68 private:\n 69\n-70 template\n-_\b7_\b1 static _\by_\be_\bs _\bt_\be_\bs_\bt(_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b> *);\n-72 template\n-_\b7_\b3 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n-74\n-_\b7_\b6 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n-77 };\n-78\n-79 template\n-_\b8_\b0 struct _\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n+70 template = true>\n+72 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<4>)\n+73 {\n+74 return leafToValue_(node);\n+75 }\n+76\n+77 template = true,\n+79 DynamicChildAccessConcept = true>\n+80 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<3>)\n 81 {\n-82 template\n-_\b8_\b3 struct _\bm_\ba_\by_\bb_\be { char _\bd_\bu_\bm_\bm_\by[N+1]; };\n-_\b8_\b4 struct _\by_\be_\bs { char _\bd_\bu_\bm_\bm_\by[2]; };\n-_\b8_\b5 struct _\bn_\bo { char _\bd_\bu_\bm_\bm_\by[1]; };\n+82 return Dune::unpackIntegerSequence([&](auto... indices) {\n+83 return std::array{(*this)(node.child(indices))...};\n+84 }, std::make_index_sequence());\n+85 }\n 86\n-87 template\n-88 static _\bm_\ba_\by_\bb_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bb_\ba_\bs_\be_\b__\bo_\bf_\b<_\bV_\b,_\b _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b>>_\b:_\b:_\bv_\ba_\bl_\bu_\be>\n-_\b8_\b9 _\bt_\be_\bs_\bt(_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b<_\bX_\b> * a);\n-90 template\n-_\b9_\b1 static _\bn_\bo _\bt_\be_\bs_\bt(...);\n-92\n-_\b9_\b4 constexpr static bool _\bv_\ba_\bl_\bu_\be = sizeof(test(0)) == sizeof(_\by_\be_\bs);\n-95 };\n-96\n-97 template\n-_\b9_\b8 struct _\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd\n-99 {\n-_\b1_\b0_\b0 typedef void _\bt_\by_\bp_\be;\n-101 };\n-102\n-103\n-105 template\n-_\b1_\b0_\b6 T* _\bd_\be_\bc_\bl_\bp_\bt_\br();\n-107\n+87 template = true,\n+89 DynamicChildAccessConcept = true>\n+90 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<2>)\n+91 {\n+92 using TransformedChild = decltype((*this)(node.child(0)));\n+93 std::vector container;\n+94 container.reserve(node.degree());\n+95 for (std::size_t i = 0; i < node.degree(); ++i)\n+96 container.emplace_back((*this)(node.child(i)));\n+97 return container;\n+98 }\n+99\n+100 template = true>\n+102 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node, Dune::PriorityTag<1>)\n+103 {\n+104 return Dune::unpackIntegerSequence([&](auto... indices) {\n+105 return Dune::makeTupleVector((*this)(node.child(indices))...);\n+106 }, std::make_index_sequence());\n+107 }\n 108\n-109 // Support for lazy evaluation of meta functions. This is required when\n-doing\n-110 // nested tag dispatch without C++11-style typedefs (based on using\n-syntax).\n-111 // The standard struct-based meta functions cause premature evaluation in a\n-112 // context that is not SFINAE-compatible. We thus have to return the meta\n-function\n-113 // without evaluating it, placing that burden on the caller. On the other\n-hand,\n-114 // the lookup will often directly be the target type, so here is some\n-helper code\n-115 // to automatically do the additional evaluation if necessary.\n-116 // Too bad that the new syntax is GCC 4.6+...\n-117\n-118\n-120\n-_\b1_\b2_\b3 struct _\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn {};\n-124\n-126 template\n-_\b1_\b2_\b7 struct _\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n+109 private:\n+110 LeafToValue leafToValue_;\n+111 };\n+112\n+113\n+114 /*\n+115 * \\brief Wrap nested container to provide a VectorBackend\n+116 */\n+117 template\n+_\b1_\b1_\b8 class _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+119 {\n+120 template\n+121 static constexpr decltype(auto) accessByTreePath(C&& container, const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b>& path)\n+122 {\n+123 return container;\n+124 }\n+125\n+126 template\n+127 static constexpr decltype(auto) accessByTreePath(C&& container, const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path)\n 128 {\n-_\b1_\b2_\b9 typedef typename F::type _\bt_\by_\bp_\be;\n-130 };\n-131\n-133 template\n-_\b1_\b3_\b4 struct _\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n-135 {\n-_\b1_\b3_\b6 typedef F _\bt_\by_\bp_\be;\n-137 };\n-138\n-140 template\n-_\b1_\b4_\b1 struct _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-142 {\n-143 typedef typename std::conditional<\n-144 std::is_base_of::value,\n-145 _\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b<_\bF_\b>,\n-146 _\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b<_\bF_\b>\n-_\b1_\b4_\b7 >::type::type _\bt_\by_\bp_\be;\n-148 };\n-149\n-_\b1_\b5_\b0 namespace impl {\n-151\n-152 // Check if type is a or is derived from one of the tree path types\n-153\n-154 // Default overload for types not representing a tree path\n-_\b1_\b5_\b5 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(void*)\n-156 -> std::false_type\n-157 {\n-158 return std::false_type();\n+129 auto head = path[Dune::Indices::_0];\n+130 auto tailPath = Dune::unpackIntegerSequence([&](auto... i){\n+131 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(path[Dune::index_constant{}]...);\n+132 }, std::make_index_sequence());\n+133 return accessByTreePath(container[head], tailPath);\n+134 }\n+135\n+136 template = true>\n+138 static void resizeImpl(C& /*container*/, const Tree& /*tree*/, Dune::\n+PriorityTag<2>)\n+139 {\n+140 /* do nothing */\n+141 }\n+142\n+143 template().resize(0u))>\n+145 static void resizeImpl(C& container, const Tree& tree, Dune::\n+PriorityTag<1>)\n+146 {\n+147 container.resize(tree.degree());\n+148 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {\n+149 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});\n+150 });\n+151 }\n+152\n+153 template\n+154 static void resizeImpl(C& container, const Tree& tree, Dune::\n+PriorityTag<0>)\n+155 {\n+156 Dune::Hybrid::forEach(Dune::range(tree.degree()), [&](auto i) {\n+157 resizeImpl(container[i], tree.child(i), Dune::PriorityTag<5>{});\n+158 });\n 159 }\n 160\n-161 // Overload for instances of HybridTreePath<...>\n-162 template\n-_\b1_\b6_\b3 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b._\b._\b._\b>*)\n-164 -> std::true_type\n-165 {\n-166 return std::true_type();\n-167 }\n+161 template\n+162 using TypeTreeConcept = decltype((\n+163 std::declval().degree(),\n+164 T::isLeaf,\n+165 T::isPower,\n+166 T::isComposite,\n+167 true));\n 168\n-169 }\n-170\n-181 template\n-_\b1_\b8_\b2 struct _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh :\n-183 public decltype(impl::isTreePath((typename std::decay::type*)(nullptr)))\n-184 {};\n-185\n-192 template\n-_\b1_\b9_\b3 constexpr auto _\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T&)\n-194 -> _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b>\n-195 {\n-196 return _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b>();\n-197 }\n-198\n-199\n-200 } // end namespace TypeTree\n-201} // end namespace Dune\n-202\n-203#endif // DUNE_TYPETREE_TYPETRAITS_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+169 public:\n+_\b1_\b7_\b1 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(Container&& container) :\n+172 container_(std::move(container))\n+173 {}\n+174\n+176 template = true>\n+_\b1_\b7_\b7 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(const Tree& tree) :\n+178 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd()\n+179 {\n+180 this->resize(tree);\n+181 }\n+182\n+184 template , bool> = true>\n+_\b1_\b8_\b6 _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd() :\n+187 container_()\n+188 {}\n+189\n+190 template\n+_\b1_\b9_\b1 decltype(auto) operator[](const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path) const\n+192 {\n+193 return accessByTreePath(container_, path);\n+194 }\n+195\n+196 template\n+_\b1_\b9_\b7 decltype(auto) operator[](const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& path)\n+198 {\n+199 return accessByTreePath(container_, path);\n+200 }\n+201\n+203 template = true>\n+_\b2_\b0_\b4 void _\br_\be_\bs_\bi_\bz_\be(const Tree& tree)\n+205 {\n+206 resizeImpl(container_, tree, Dune::PriorityTag<5>{});\n+207 }\n+208\n+_\b2_\b0_\b9 const Container& _\bd_\ba_\bt_\ba() const\n+210 {\n+211 return container_;\n+212 }\n+213\n+_\b2_\b1_\b4 Container& _\bd_\ba_\bt_\ba()\n+215 {\n+216 return container_;\n+217 }\n+218\n+219 private:\n+220 Container container_;\n+221 };\n+222\n+223 template\n+_\b2_\b2_\b4 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd(Container&& container)\n+225 {\n+226 return _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>>(std::\n+forward(container));\n+227 }\n+228\n+229 /*\n+230 * \\brief A simple lambda for creating default constructible values from a\n+node\n+231 *\n+232 * This simply returns LeafToValue{} for a given Node. It's needed\n+233 * because using a lambda expression in a using declaration is not allowed\n+234 * because it's an unevaluated context.\n+235 */\n+236 template class LeafToValue>\n+_\b2_\b3_\b7 struct _\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be\n+238 {\n+239 template\n+_\b2_\b4_\b0 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Node& node) const\n+241 {\n+242 return LeafToValue{};\n+243 }\n+244 };\n+245\n+246 } // namespace Detail\n+247\n+267 template\n+_\b2_\b6_\b8 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(const Tree& tree, LeafToValue&& leafToValue)\n+269 {\n+270 auto f = std::ref(leafToValue);\n+271 auto factory = _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bf_\b)_\b>(f);\n+272 return Detail::makeTreeContainerVectorBackend(factory(tree));\n+273 }\n+274\n+290 template\n+_\b2_\b9_\b1 auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(const Tree& tree)\n+292 {\n+293 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br(tree, [](const auto&) {return Value{};});\n+294 }\n+295\n+299 template\n+_\b3_\b0_\b0 using _\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t\n+(std::declval()))>;\n+301\n+305 template class LeafToValue, class Tree>\n+_\b3_\b0_\b6 using _\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br = std::decay_t(), std::declval>()))>;\n+307\n+309\n+310 } // namespace TypeTree\n+311} //namespace Dune\n+312\n+313#endif // DUNE_TYPETREE_TREECONTAINER_HH\n _\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-typename std::decay_t< Node >::NodeTag NodeTag\n-Returns the node tag of the given Node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n-typename std::decay_t< T >::ImplementationTag ImplementationTag\n-Returns the implementation tag of the given Node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+auto makeTreeContainer(const Tree &tree, LeafToValue &&leafToValue)\n+Create container havin the same structure as the given tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bU_\bn_\bi_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+std::decay_t< decltype(makeTreeContainer< Value >(std::declval< const Tree & >\n+()))> UniformTreeContainer\n+Alias to container type generated by makeTreeContainer for given tree type and\n+uniform value type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+std::decay_t< decltype(makeTreeContainer(std::declval< const Tree & >(), std::\n+declval< Detail::LeafToDefaultConstructibleValue< LeafToValue > >()))>\n+TreeContainer\n+Alias to container type generated by makeTreeContainer for give tree type and\n+when using LeafToValue ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+std::size_t degree(const Node &node)\n+Returns the degree of node as run time information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto treePath(const T &... t)\n+Constructs a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto isTreePath(const T &) -> IsTreePath< T >\n-Check if given object represents a tree path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:193\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bc_\bl_\bp_\bt_\br\n-T * declptr()\n-Helper function for generating a pointer to a value of type T in an unevaluated\n-operand setting.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto isTreePath(void *) -> std::false_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+auto makeTreeContainerVectorBackend(Container &&container)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+auto operator()(const Node &node)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+ContainerFactory(LeafToValue leafToValue)\n+Create ContainerFactory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(const Tree &tree)\n+Resize the (nested) container depending on the degree of the tree nodes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bd_\ba_\bt_\ba\n+Container & data()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bd_\ba_\bt_\ba\n+const Container & data() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+TreeContainerVectorBackend(Container &&container)\n+Move the passed container into the internal storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+TreeContainerVectorBackend()\n+Default constructor. The stored container might need to be resized before\n+usage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd_\b:_\b:_\bT_\br_\be_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bV_\be_\bc_\bt_\bo_\br_\bB_\ba_\bc_\bk_\be_\bn_\bd\n+TreeContainerVectorBackend(const Tree &tree)\n+Default construct the container and perform a resize depending on the tree-node\n+degrees.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bL_\be_\ba_\bf_\bT_\bo_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bb_\bl_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+auto operator()(const Node &node) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treecontainer.hh:240\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n A hybrid version of TreePath that supports both compile time and run time\n indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:21\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b0_\b,_\b _\bT_\b._\b._\b._\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-T0 type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-True if class T defines a NodeTag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n-static yes test(NodeTag< X > *)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n-static no test(...)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[2]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n-static maybe< std::is_base_of< V, NodeTag< X > >::value > test(NodeTag< X > *a)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-True if class T defines a NodeTag of type V.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n-static no test(...)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[N+1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[2]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bn_\bo_\bd_\be_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n-static yes test(ImplementationTag< X > *)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bt_\be_\bs_\bt\n-static no test(...)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-True if class T defines an ImplementationTag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[2]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n-static maybe< std::is_base_of< V, ImplementationTag< X > >::value > test\n-(ImplementationTag< X > *a)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bt_\be_\bs_\bt\n-static no test(...)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-True if class T defines an ImplementationTag of type V.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bm_\ba_\by_\bb_\be_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[N+1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\by_\be_\bs_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[2]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\b__\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b__\bt_\ba_\bg_\b__\bv_\ba_\bl_\bu_\be_\b:_\b:_\bn_\bo_\b:_\b:_\bd_\bu_\bm_\bm_\by\n-char dummy[1]\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bV_\bo_\bi_\bd_\b:_\b:_\bt_\by_\bp_\be\n-void type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Marker tag declaring a meta function.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:123\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n-Helper meta function to delay evaluation of F.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b:_\b:_\bt_\by_\bp_\be\n-F::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n-Identity function.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\ba_\bz_\by_\b__\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b:_\b:_\bt_\by_\bp_\be\n-F type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Meta function that evaluates its argument iff it inherits from meta_function.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\by_\bp_\be\n-std::conditional< std::is_base_of< meta_function, F >::value, lazy_evaluate< F\n->, lazy_identity< F > >::type::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-Check if type represents a tree path.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:184\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00047.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00047.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: utility.hh File Reference\n+dune-typetree: powercompositenodetransformationtemplates.hh File Reference\n \n \n \n \n \n \n \n@@ -72,33 +72,35 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    utility.hh File Reference
    \n+
    powercompositenodetransformationtemplates.hh File Reference
    \n
    \n
    \n-
    #include <memory>
    \n-#include <tuple>
    \n-#include <type_traits>
    \n-#include <utility>
    \n-#include <algorithm>
    \n-#include <dune/common/shared_ptr.hh>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n+
    #include <cstddef>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::TreeInfo< Tree, Tag >
     Struct for obtaining some basic structural information about a TypeTree. More...
    struct  Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
     
    struct  Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC >
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,29 +1,36 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-utility.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+powercompositenodetransformationtemplates.hh File Reference\n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bT_\ba_\bg_\b _\b>\n-\u00a0 Struct for obtaining some basic structural information about a\n- _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00047_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00047_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: utility.hh Source File\n+dune-typetree: powercompositenodetransformationtemplates.hh Source File\n \n \n \n \n \n \n \n@@ -74,236 +74,91 @@\n \n
    \n \n
    \n \n
    \n-
    utility.hh
    \n+
    powercompositenodetransformationtemplates.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_UTILITY_HH
    \n-
    7#define DUNE_TYPETREE_UTILITY_HH
    \n+
    6#ifndef DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n+
    7#define DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n
    8
    \n-
    9#include <memory>
    \n-
    10#include <tuple>
    \n-
    11#include <type_traits>
    \n-
    12#include <utility>
    \n-
    13#include <algorithm>
    \n-
    14
    \n-
    15#include <dune/common/shared_ptr.hh>
    \n-
    16#include <dune/common/indices.hh>
    \n-\n-\n-
    19
    \n-
    20namespace Dune {
    \n-
    21 namespace TypeTree {
    \n-
    22
    \n-
    27#ifndef DOXYGEN
    \n-
    28
    \n-
    29 template<typename T>
    \n-
    30 std::shared_ptr<T> convert_arg(const T& t)
    \n-
    31 {
    \n-
    32 return std::make_shared<T>(t);
    \n-
    33 }
    \n-
    34
    \n-
    35 template<typename T>
    \n-
    36 std::shared_ptr<T> convert_arg(T& t)
    \n-
    37 {
    \n-
    38 return stackobject_to_shared_ptr(t);
    \n-
    39 }
    \n-
    40
    \n-
    41 template<typename BaseType, typename T>
    \n-
    42 T& assertGridViewType(T& t)
    \n-
    43 {
    \n-
    44 static_assert((std::is_same<typename BaseType::Traits::GridViewType,
    \n-
    45 typename T::Traits::GridViewType>::value),
    \n-
    46 "GridViewType must be equal in all components of composite type");
    \n-
    47 return t;
    \n-
    48 }
    \n-
    49
    \n-
    50 // only bind to real rvalues
    \n-
    51 template<typename T>
    \n-
    52 typename std::enable_if<!std::is_lvalue_reference<T>::value,std::shared_ptr<T> >::type convert_arg(T&& t)
    \n-
    53 {
    \n-
    54 return std::make_shared<T>(std::forward<T>(t));
    \n-
    55 }
    \n+
    9#include <cstddef>
    \n+
    10
    \n+\n+
    12
    \n+
    13namespace Dune {
    \n+
    14 namespace TypeTree {
    \n+
    15
    \n+
    21 template<typename SourceNode, typename Transformation, template<typename,typename,std::size_t> class TransformedNode>
    \n+
    \n+\n+
    23 {
    \n+
    24 template<typename TC>
    \n+
    \n+
    25 struct result
    \n+
    26 {
    \n+
    27 typedef TransformedNode<SourceNode,TC,StaticDegree<SourceNode>::value> type;
    \n+
    28 };
    \n+
    \n+
    29 };
    \n+
    \n+
    30
    \n+
    31
    \n+
    32 template<typename SourceNode, typename Transformation, template<typename,typename> class TransformedNode>
    \n+
    \n+\n+
    34 {
    \n+
    35 template<typename TC>
    \n+
    \n+
    36 struct result
    \n+
    37 {
    \n+
    38 typedef TransformedNode<SourceNode,TC> type;
    \n+
    39 };
    \n+
    \n+
    40 };
    \n+
    \n+
    41
    \n+
    42 template<typename SourceNode, typename Transformation, template<typename,typename...> class TransformedNode>
    \n+
    \n+\n+
    44 {
    \n+
    45 template<typename... TC>
    \n+
    \n+
    46 struct result
    \n+
    47 {
    \n+
    48 typedef TransformedNode<SourceNode,TC...> type;
    \n+
    49 };
    \n+
    \n+
    50 };
    \n+
    \n+
    51
    \n+
    53
    \n+
    54 } // namespace TypeTree
    \n+
    55} //namespace Dune
    \n
    56
    \n-
    57
    \n-
    58 namespace Experimental {
    \n-
    59
    \n-
    68 template<class BinaryOp, class Arg>
    \n-
    69 constexpr decltype(auto)
    \n-
    70 left_fold(const BinaryOp& binary_op, Arg&& arg)
    \n-
    71 {
    \n-
    72 return std::forward<Arg>(arg);
    \n-
    73 }
    \n-
    74
    \n-
    96 template<class BinaryOp, class Init, class Arg0, class... Args>
    \n-
    97 constexpr decltype(auto)
    \n-
    98 left_fold(const BinaryOp& binary_op, Init&& init, Arg0&& arg_0, Args&&... args)
    \n-
    99 {
    \n-
    100 return left_fold(
    \n-
    101 binary_op,
    \n-
    102 binary_op(std::forward<Init>(init), std::forward<Arg0>(arg_0)),
    \n-
    103 std::forward<Args>(args)...);
    \n-
    104 }
    \n-
    105
    \n-
    106 } // namespace Experimental
    \n-
    107
    \n-
    108
    \n-
    109#endif // DOXYGEN
    \n-
    110
    \n-
    112
    \n-
    119 template<typename Tree, typename Tag = StartTag>
    \n-
    \n-
    120 struct TreeInfo
    \n-
    121 {
    \n-
    122
    \n-
    123 private:
    \n-
    124 // Start the tree traversal
    \n-\n-
    126
    \n-
    127 public:
    \n-
    128
    \n-
    130 static const std::size_t depth = NodeInfo::depth;
    \n-
    131
    \n-
    133 static const std::size_t nodeCount = NodeInfo::nodeCount;
    \n-
    134
    \n-
    136 static const std::size_t leafCount = NodeInfo::leafCount;
    \n-
    137
    \n-
    138 };
    \n-
    \n-
    139
    \n-
    140
    \n-
    141#ifndef DOXYGEN
    \n-
    142
    \n-
    143 // ********************************************************************************
    \n-
    144 // TreeInfo specializations for the different node types
    \n-
    145 // ********************************************************************************
    \n-
    146
    \n-
    147
    \n-
    148 // leaf node
    \n-
    149 template<typename Node>
    \n-
    150 struct TreeInfo<Node,LeafNodeTag>
    \n-
    151 {
    \n-
    152
    \n-
    153 static const std::size_t depth = 1;
    \n-
    154
    \n-
    155 static const std::size_t nodeCount = 1;
    \n-
    156
    \n-
    157 static const std::size_t leafCount = 1;
    \n-
    158
    \n-
    159 };
    \n-
    160
    \n-
    161
    \n-
    162 // power node - exploit the fact that all children are identical
    \n-
    163 template<typename Node>
    \n-
    164 struct TreeInfo<Node,PowerNodeTag>
    \n-
    165 {
    \n-
    166
    \n-
    167 typedef TreeInfo<typename Node::ChildType,NodeTag<typename Node::ChildType>> ChildInfo;
    \n-
    168
    \n-
    169 static const std::size_t depth = 1 + ChildInfo::depth;
    \n-
    170
    \n-
    171 static const std::size_t nodeCount = 1 + StaticDegree<Node>::value * ChildInfo::nodeCount;
    \n-
    172
    \n-
    173 static const std::size_t leafCount = StaticDegree<Node>::value * ChildInfo::leafCount;
    \n-
    174
    \n-
    175 };
    \n-
    176
    \n-
    177
    \n-
    178 namespace {
    \n-
    179
    \n-
    180 // TMP for iterating over the children of a composite node
    \n-
    181 // identical for both composite node implementations
    \n-
    182 template<typename Node, std::size_t k, std::size_t n>
    \n-
    183 struct generic_compositenode_children_info
    \n-
    184 {
    \n-
    185
    \n-
    186 typedef generic_compositenode_children_info<Node,k+1,n> NextChild;
    \n-
    187
    \n-
    188 // extract child info
    \n-
    189 typedef typename Node::template Child<k>::Type Child;
    \n-
    190 typedef NodeTag<Child> ChildTag;
    \n-
    191 typedef TreeInfo<Child,ChildTag> ChildInfo;
    \n-
    192
    \n-
    193 // combine information of current child with info about following children
    \n-
    194 static const std::size_t maxDepth = ChildInfo::depth > NextChild::maxDepth ? ChildInfo::depth : NextChild::maxDepth;
    \n-
    195
    \n-
    196 static const std::size_t nodeCount = ChildInfo::nodeCount + NextChild::nodeCount;
    \n-
    197
    \n-
    198 static const std::size_t leafCount = ChildInfo::leafCount + NextChild::leafCount;
    \n-
    199
    \n-
    200 };
    \n-
    201
    \n-
    202 // End of recursion
    \n-
    203 template<typename Node, std::size_t n>
    \n-
    204 struct generic_compositenode_children_info<Node,n,n>
    \n-
    205 {
    \n-
    206 static const std::size_t maxDepth = 0;
    \n-
    207
    \n-
    208 static const std::size_t nodeCount = 0;
    \n-
    209
    \n-
    210 static const std::size_t leafCount = 0;
    \n-
    211 };
    \n-
    212
    \n-
    213 } // anonymous namespace
    \n-
    214
    \n-
    215
    \n-
    216 // Struct for building information about composite node
    \n-
    217 template<typename Node>
    \n-
    218 struct GenericCompositeNodeInfo
    \n-
    219 {
    \n-
    220
    \n-
    221 typedef generic_compositenode_children_info<Node,0,StaticDegree<Node>::value> Children;
    \n-
    222
    \n-
    223 static const std::size_t depth = 1 + Children::maxDepth;
    \n-
    224
    \n-
    225 static const std::size_t nodeCount = 1 + Children::nodeCount;
    \n-
    226
    \n-
    227 static const std::size_t leafCount = Children::leafCount;
    \n-
    228
    \n-
    229 };
    \n-
    230
    \n-
    231
    \n-
    232 // CompositeNode: delegate to GenericCompositeNodeInfo
    \n-
    233 template<typename Node>
    \n-
    234 struct TreeInfo<Node,CompositeNodeTag>
    \n-
    235 : public GenericCompositeNodeInfo<Node>
    \n-
    236 {};
    \n-
    237
    \n-
    238
    \n-
    239#endif // DOXYGEN
    \n-
    240
    \n-
    241
    \n-
    242 using Dune::index_constant;
    \n-
    243 namespace Indices = Dune::Indices;
    \n-
    244
    \n-
    246
    \n-
    247 } // namespace TypeTree
    \n-
    248} //namespace Dune
    \n-
    249
    \n-
    250#endif // DUNE_TYPETREE_UTILITY_HH
    \n-\n-\n+
    57#endif // DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH
    \n+\n
    Definition accumulate_static.hh:16
    \n-
    auto leafCount(const Tree &tree)
    The number of leaf nodes in the Tree.
    Definition visitor.hh:532
    \n-
    auto nodeCount(const Tree &tree)
    The total number of nodes in the Tree.
    Definition visitor.hh:524
    \n-
    auto depth(const Tree &tree)
    The depth of the TypeTree.
    Definition visitor.hh:508
    \n-
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n-
    Struct for obtaining some basic structural information about a TypeTree.
    Definition utility.hh:121
    \n-
    static const std::size_t leafCount
    The number of leaf nodes in the TypeTree.
    Definition utility.hh:136
    \n-
    static const std::size_t depth
    The depth of the TypeTree.
    Definition utility.hh:130
    \n-
    static const std::size_t nodeCount
    The total number of nodes in the TypeTree.
    Definition utility.hh:133
    \n+
    Definition powercompositenodetransformationtemplates.hh:23
    \n+
    Definition powercompositenodetransformationtemplates.hh:26
    \n+
    TransformedNode< SourceNode, TC, StaticDegree< SourceNode >::value > type
    Definition powercompositenodetransformationtemplates.hh:27
    \n+
    Definition powercompositenodetransformationtemplates.hh:34
    \n+
    Definition powercompositenodetransformationtemplates.hh:37
    \n+
    TransformedNode< SourceNode, TC > type
    Definition powercompositenodetransformationtemplates.hh:38
    \n+
    Definition powercompositenodetransformationtemplates.hh:44
    \n+
    Definition powercompositenodetransformationtemplates.hh:47
    \n+
    TransformedNode< SourceNode, TC... > type
    Definition powercompositenodetransformationtemplates.hh:48
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,265 +1,90 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-utility.hh\n+powercompositenodetransformationtemplates.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_UTILITY_HH\n-7#define DUNE_TYPETREE_UTILITY_HH\n+6#ifndef DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n+7#define DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n 8\n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14\n-15#include \n-16#include \n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-19\n-20namespace _\bD_\bu_\bn_\be {\n-21 namespace TypeTree {\n-22\n-27#ifndef DOXYGEN\n-28\n-29 template\n-30 std::shared_ptr convert_arg(const T& t)\n-31 {\n-32 return std::make_shared(t);\n-33 }\n-34\n-35 template\n-36 std::shared_ptr convert_arg(T& t)\n+9#include \n+10\n+11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+12\n+13namespace _\bD_\bu_\bn_\be {\n+14 namespace TypeTree {\n+15\n+21 template class TransformedNode>\n+_\b2_\b2 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+23 {\n+24 template\n+_\b2_\b5 struct _\br_\be_\bs_\bu_\bl_\bt\n+26 {\n+_\b2_\b7 typedef TransformedNode::value> _\bt_\by_\bp_\be;\n+28 };\n+29 };\n+30\n+31\n+32 template class TransformedNode>\n+_\b3_\b3 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+34 {\n+35 template\n+_\b3_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n 37 {\n-38 return stackobject_to_shared_ptr(t);\n-39 }\n-40\n-41 template\n-42 T& assertGridViewType(T& t)\n-43 {\n-44 static_assert((std::is_same::value),\n-46 \"GridViewType must be equal in all components of composite type\");\n-47 return t;\n-48 }\n-49\n-50 // only bind to real rvalues\n-51 template\n-52 typename std::enable_if::value,std::\n-shared_ptr >::type convert_arg(T&& t)\n-53 {\n-54 return std::make_shared(std::forward(t));\n-55 }\n+_\b3_\b8 typedef TransformedNode _\bt_\by_\bp_\be;\n+39 };\n+40 };\n+41\n+42 template class TransformedNode>\n+_\b4_\b3 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+44 {\n+45 template\n+_\b4_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n+47 {\n+_\b4_\b8 typedef TransformedNode _\bt_\by_\bp_\be;\n+49 };\n+50 };\n+51\n+53\n+54 } // namespace TypeTree\n+55} //namespace Dune\n 56\n-57\n-58 namespace Experimental {\n-59\n-68 template\n-69 constexpr decltype(auto)\n-70 left_fold(const BinaryOp& binary_op, Arg&& arg)\n-71 {\n-72 return std::forward(arg);\n-73 }\n-74\n-96 template\n-97 constexpr decltype(auto)\n-98 left_fold(const BinaryOp& binary_op, Init&& init, Arg0&& arg_0, Args&&...\n-args)\n-99 {\n-100 return left_fold(\n-101 binary_op,\n-102 binary_op(std::forward(init), std::forward(arg_0)),\n-103 std::forward(args)...);\n-104 }\n-105\n-106 } // namespace Experimental\n-107\n-108\n-109#endif // DOXYGEN\n-110\n-112\n-119 template\n-_\b1_\b2_\b0 struct _\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n-121 {\n-122\n-123 private:\n-124 // Start the tree traversal\n-125 typedef _\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b<_\bT_\br_\be_\be_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>> _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo;\n-126\n-127 public:\n-128\n-_\b1_\b3_\b0 static const std::size_t _\bd_\be_\bp_\bt_\bh = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh;\n-131\n-_\b1_\b3_\b3 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt;\n-134\n-_\b1_\b3_\b6 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = _\bN_\bo_\bd_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt;\n-137\n-138 };\n-139\n-140\n-141#ifndef DOXYGEN\n-142\n-143 /\n-/\n-********************************************************************************\n-144 // TreeInfo specializations for the different node types\n-145 /\n-/\n-********************************************************************************\n-146\n-147\n-148 // leaf node\n-149 template\n-150 struct _\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n-151 {\n-152\n-153 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1;\n-154\n-155 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1;\n-156\n-157 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = 1;\n-158\n-159 };\n-160\n-161\n-162 // power node - exploit the fact that all children are identical\n-163 template\n-164 struct TreeInfo\n-165 {\n-166\n-167 typedef TreeInfo> ChildInfo;\n-168\n-169 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1 + ChildInfo::depth;\n-170\n-171 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1 + StaticDegree::value *\n-ChildInfo::nodeCount;\n-172\n-173 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = StaticDegree::value *\n-ChildInfo::leafCount;\n-174\n-175 };\n-176\n-177\n-178 namespace {\n-179\n-180 // TMP for iterating over the children of a composite node\n-181 // identical for both composite node implementations\n-182 template\n-183 struct generic_compositenode_children_info\n-184 {\n-185\n-186 typedef generic_compositenode_children_info NextChild;\n-187\n-188 // extract child info\n-189 typedef typename Node::template Child::Type Child;\n-190 typedef NodeTag ChildTag;\n-191 typedef TreeInfo ChildInfo;\n-192\n-193 // combine information of current child with info about following children\n-194 static const std::size_t maxDepth = ChildInfo::depth > NextChild::maxDepth\n-? ChildInfo::depth : NextChild::maxDepth;\n-195\n-196 static const std::size_t nodeCount = ChildInfo::nodeCount + NextChild::\n-nodeCount;\n-197\n-198 static const std::size_t leafCount = ChildInfo::leafCount + NextChild::\n-leafCount;\n-199\n-200 };\n-201\n-202 // End of recursion\n-203 template\n-204 struct generic_compositenode_children_info\n-205 {\n-206 static const std::size_t maxDepth = 0;\n-207\n-208 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 0;\n-209\n-210 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = 0;\n-211 };\n-212\n-213 } // anonymous namespace\n-214\n-215\n-216 // Struct for building information about composite node\n-217 template\n-218 struct GenericCompositeNodeInfo\n-219 {\n-220\n-221 typedef generic_compositenode_children_info::\n-value> Children;\n-222\n-223 static const std::size_t _\bd_\be_\bp_\bt_\bh = 1 + Children::maxDepth;\n-224\n-225 static const std::size_t _\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt = 1 + Children::nodeCount;\n-226\n-227 static const std::size_t _\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt = Children::leafCount;\n-228\n-229 };\n-230\n-231\n-232 // CompositeNode: delegate to GenericCompositeNodeInfo\n-233 template\n-234 struct TreeInfo\n-235 : public GenericCompositeNodeInfo\n-236 {};\n-237\n-238\n-239#endif // DOXYGEN\n-240\n-241\n-242 using Dune::index_constant;\n-243 namespace Indices = Dune::Indices;\n-244\n-246\n-247 } // namespace TypeTree\n-248} //namespace Dune\n-249\n-250#endif // DUNE_TYPETREE_UTILITY_HH\n+57#endif // DUNE_TYPETREE_POWERCOMPOSITENODETRANSFORMATIONTEMPLATES_HH\n _\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n-auto leafCount(const Tree &tree)\n-The number of leaf nodes in the Tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:532\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n-auto nodeCount(const Tree &tree)\n-The total number of nodes in the Tree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n-auto depth(const Tree &tree)\n-The depth of the TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visitor.hh:508\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a leaf node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo\n-Struct for obtaining some basic structural information about a TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bl_\be_\ba_\bf_\bC_\bo_\bu_\bn_\bt\n-static const std::size_t leafCount\n-The number of leaf nodes in the TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bd_\be_\bp_\bt_\bh\n-static const std::size_t depth\n-The depth of the TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bI_\bn_\bf_\bo_\b:_\b:_\bn_\bo_\bd_\be_\bC_\bo_\bu_\bn_\bt\n-static const std::size_t nodeCount\n-The total number of nodes in the TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn utility.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< SourceNode, TC, StaticDegree< SourceNode >::value > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< SourceNode, TC > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNode< SourceNode, TC... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn powercompositenodetransformationtemplates.hh:48\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00050.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00050.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: transformationutilities.hh File Reference\n+dune-typetree: treepath.hh File Reference\n \n \n \n \n \n \n \n@@ -69,21 +69,193 @@\n \n
    \n \n
    \n \n
    \n-
    transformationutilities.hh File Reference
    \n+ \n+
    treepath.hh File Reference
    \n
    \n
    \n-
    #include <dune/typetree/simpletransformationdescriptors.hh>
    \n-#include <dune/typetree/generictransformationdescriptors.hh>
    \n+
    #include <cstddef>
    \n+#include <cassert>
    \n+#include <iostream>
    \n+#include <type_traits>
    \n+#include <dune/common/documentation.hh>
    \n+#include <dune/common/version.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/typelist.hh>
    \n+#include <dune/typetree/fixedcapacitystack.hh>
    \n+#include <dune/typetree/utility.hh>
    \n
    \n

    Go to the source code of this file.

    \n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::TypeTree::HybridTreePath< T >
     A hybrid version of TreePath that supports both compile time and run time indices. More...
     
    struct  Dune::TypeTree::TreePathSize< HybridTreePath< index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathPushBack< HybridTreePath< index_constant< i >... >, k >
     
    struct  Dune::TypeTree::TreePathPushFront< HybridTreePath< index_constant< i >... >, k >
     
    struct  Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< k > > >
     
    struct  Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... > >
     
    struct  Dune::TypeTree::TreePathFront< HybridTreePath< index_constant< k >, index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< k > >, i... >
     
    struct  Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... >, i... >
     
    struct  Dune::TypeTree::TreePathPopFront< HybridTreePath< index_constant< k >, index_constant< i >... > >
     
    struct  Dune::TypeTree::TreePathConcat< HybridTreePath< index_constant< i >... >, HybridTreePath< index_constant< k >... > >
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::TreePathType
     
    namespace  Dune::TypeTree::Literals
     
    \n+\n+\n+\n+\n+

    \n+Typedefs

    template<std::size_t... i>
    using Dune::TypeTree::StaticTreePath = HybridTreePath< Dune::index_constant< i >... >
     
    \n+\n+\n+\n+

    \n+Enumerations

    enum  Dune::TypeTree::TreePathType::Type { Dune::TypeTree::TreePathType::fullyStatic\n+, Dune::TypeTree::TreePathType::dynamic\n+ }
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Functions

    template<std::size_t... i>
    void Dune::TypeTree::print_tree_path (std::ostream &os)
     
    template<std::size_t k, std::size_t... i>
    void Dune::TypeTree::print_tree_path (std::ostream &os)
     
    template<typename... T>
    constexpr auto Dune::TypeTree::makeTreePath (const T... t)
     helper function to construct a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::hybridTreePath (const T &... t)
     Constructs a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::treePath (const T &... t)
     Constructs a new HybridTreePath from the given indices.
     
    template<typename... T>
    constexpr std::size_t Dune::TypeTree::treePathSize (const HybridTreePath< T... > &)
     Returns the size (number of components) of the given HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr auto Dune::TypeTree::treePathEntry (const HybridTreePath< T... > &tp, index_constant< i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type
     Returns a copy of the i-th element of the HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr std::size_t Dune::TypeTree::treePathIndex (const HybridTreePath< T... > &tp, index_constant< i >={})
     Returns the index value of the i-th element of the HybridTreePath.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::back (const HybridTreePath< T... > &tp) -> decltype(tp.back())
     Returns a copy of the last element of the HybridTreePath.
     
    template<typename... T>
    constexpr auto Dune::TypeTree::front (const HybridTreePath< T... > &tp) -> decltype(tp.front())
     Returns a copy of the first element of the HybridTreePath.
     
    template<typename... T>
    constexpr HybridTreePath< T..., std::size_t > Dune::TypeTree::push_back (const HybridTreePath< T... > &tp, std::size_t i)
     Appends a run time index to a HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr HybridTreePath< T..., index_constant< i > > Dune::TypeTree::push_back (const HybridTreePath< T... > &tp, index_constant< i > i_={})
     Appends a compile time index to a HybridTreePath.
     
    template<typename... T>
    constexpr HybridTreePath< std::size_t, T... > Dune::TypeTree::push_front (const HybridTreePath< T... > &tp, std::size_t element)
     Prepends a run time index to a HybridTreePath.
     
    template<std::size_t i, typename... T>
    constexpr HybridTreePath< index_constant< i >, T... > Dune::TypeTree::push_front (const HybridTreePath< T... > &tp, index_constant< i > _i={})
     Prepends a compile time index to a HybridTreePath.
     
    template<typename I , typename... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::accumulate_back (const HybridTreePath< T... > &tp, I i)
     Hybrid utility that accumulates to the back of a multi-index.
     
    template<typename I , typename... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::accumulate_front (const HybridTreePath< T... > &tp, I i)
     Hybrid utility that accumulates to the front of a multi-index.
     
    template<class... Head, class... Other>
    constexpr auto Dune::TypeTree::join (const HybridTreePath< Head... > &head, const Other &... tail)
     Join two tree paths into one.
     
    template<class... T>
    constexpr auto Dune::TypeTree::reverse (const HybridTreePath< T... > &tp)
     Reverses the order of the elements in the path.
     
    template<class... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::pop_front (const HybridTreePath< T... > &tp)
     Removes first index on a HybridTreePath.
     
    template<class... T, std::enable_if_t<(sizeof...(T) > 0), bool > = true>
    constexpr auto Dune::TypeTree::pop_back (const HybridTreePath< T... > &tp)
     Removes last index on a HybridTreePath.
     
    template<class... S, class... T>
    constexpr bool Dune::TypeTree::operator== (const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
     Compare two HybridTreePaths for value equality.
     
    template<class S , S... lhs, class T , T... rhs>
    constexpr auto Dune::TypeTree::operator== (const HybridTreePath< std::integral_constant< S, lhs >... > &, const HybridTreePath< std::integral_constant< T, rhs >... > &)
     Overload for purely static HybridTreePaths.
     
    template<class... S, class... T>
    constexpr auto Dune::TypeTree::operator!= (const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
     Compare two HybridTreePaths for unequality.
     
    template<class S , S... lhs, class T , T... rhs>
    constexpr auto Dune::TypeTree::operator!= (const HybridTreePath< std::integral_constant< S, lhs >... > &, const HybridTreePath< std::integral_constant< T, rhs >... > &)
     Compare two static HybridTreePaths for unequality.
     
    template<char... digits>
    constexpr auto Dune::TypeTree::Literals::operator""_tp ()
     Literal to create treepath.
     
    template<typename... T>
    std::ostream & Dune::TypeTree::operator<< (std::ostream &os, const HybridTreePath< T... > &tp)
     Dumps a HybridTreePath to a stream.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,12 +1,242 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-transformationutilities.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+treepath.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bT_\b _\b>\n+\u00a0 A hybrid version of TreePath that supports both compile time and run\n+ time indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi\n+ _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi\n+ _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bj_\b _\b>_\b,\n+ _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bl_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n+ _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>\n+ _\b>_\b,_\b _\bi_\b._\b._\b._\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bj_\b _\b>_\b,\n+ _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bl_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bi_\b._\b._\b._\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n+ _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b.\n+ _\b>_\b,_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs\n+\u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< Dune::index_constant< i\n+ >... >\n+\u00a0\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:\n+ _\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc , _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc }\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh (std::\n+ ostream &os)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh (std::\n+ ostream &os)\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T...\n+ t)\n+\u00a0 helper function to construct a new\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the given indices.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh (const T\n+ &... t)\n+\u00a0 Constructs a new _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the\n+ given indices.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh (const T &...\n+ t)\n+\u00a0 Constructs a new _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh from the\n+ given indices.\n+\u00a0\n+template\n+ constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &)\n+\u00a0 Returns the size (number of components)\n+ of the given _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n+ index_constant< i >={}) -> typename\n+ std::decay< decltype(std::get< i >\n+ (tp._data))>::type\n+\u00a0 Returns a copy of the i-th element of\n+ the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n+ index_constant< i >={})\n+\u00a0 Returns the index value of the i-th\n+ element of the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bb_\ba_\bc_\bk (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp) -> decltype\n+ (tp.back())\n+\u00a0 Returns a copy of the last element of\n+ the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp) -> decltype\n+ (tp.front())\n+\u00a0 Returns a copy of the first element of\n+ the _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T..., std:: _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk (const\n+ size_t >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, std::size_t\n+ i)\n+\u00a0 Appends a run time index to a\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T..., _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk (const\n+ index_constant< i > >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n+ index_constant< i > i_={})\n+\u00a0 Appends a compile time index to a\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::size_t, _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt (const\n+ T... >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, std::size_t\n+ element)\n+\u00a0 Prepends a run time index to a\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt (const\n+ index_constant< i >, T... >\u00a0 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp,\n+ index_constant< i > _i={})\n+\u00a0 Prepends a compile time index to a\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template 0), bool\n+> = true>\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, I i)\n+\u00a0 Hybrid utility that accumulates to the\n+ back of a multi-index.\n+\u00a0\n+template 0), bool\n+> = true>\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp, I i)\n+\u00a0 Hybrid utility that accumulates to the\n+ front of a multi-index.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bj_\bo_\bi_\bn (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< Head... > &head, const\n+ Other &... tail)\n+\u00a0 Join two tree paths into one.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bv_\be_\br_\bs_\be (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n+\u00a0 Reverses the order of the elements in\n+ the path.\n+\u00a0\n+template 0), bool > = true>\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n+\u00a0 Removes first index on a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template 0), bool > = true>\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n+\u00a0 Removes last index on a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh.\n+\u00a0\n+template\n+ constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< S... > &lhs, const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &rhs)\n+\u00a0 Compare two _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for value\n+ equality.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::integral_constant<\n+ S, lhs >... > &, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n+ std::integral_constant< T, rhs >... > &)\n+\u00a0 Overload for purely static\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< S... > &lhs, const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &rhs)\n+\u00a0 Compare two _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for\n+ unequality.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n+ _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< std::integral_constant<\n+ S, lhs >... > &, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n+ std::integral_constant< T, rhs >... > &)\n+\u00a0 Compare two static _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bhs for\n+ unequality.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b\"_\b\"_\b__\bt_\bp\n+ ()\n+\u00a0 Literal to create treepath.\n+\u00a0\n+template\n+ std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n+ &os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh< T... > &tp)\n+\u00a0 Dumps a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh to a stream.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00050_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00050_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: transformationutilities.hh Source File\n+dune-typetree: treepath.hh Source File\n \n \n \n \n \n \n \n@@ -74,31 +74,734 @@\n \n
    \n \n
    \n
    \n
    \n-
    transformationutilities.hh
    \n+
    treepath.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=8 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n-
    7#define DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n+
    6#ifndef DUNE_TYPETREE_TREEPATH_HH
    \n+
    7#define DUNE_TYPETREE_TREEPATH_HH
    \n
    8
    \n-\n-\n-
    11
    \n-
    12#endif // DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH
    \n-\n-\n+
    9#include <cstddef>
    \n+
    10#include <cassert>
    \n+
    11#include <iostream>
    \n+
    12#include <type_traits>
    \n+
    13
    \n+
    14#include <dune/common/documentation.hh>
    \n+
    15#include <dune/common/version.hh>
    \n+
    16#include <dune/common/typetraits.hh>
    \n+
    17#include <dune/common/indices.hh>
    \n+
    18#include <dune/common/hybridutilities.hh>
    \n+
    19#include <dune/common/typelist.hh>
    \n+
    20
    \n+\n+\n+
    23
    \n+
    24namespace Dune {
    \n+
    25 namespace TypeTree {
    \n+
    26
    \n+
    27 // The Impl namespace collects some free standing functions helper functions
    \n+
    28 namespace Impl {
    \n+
    29 template<typename T>
    \n+
    30 struct check_size_t_impl
    \n+
    31 {
    \n+
    32 static constexpr auto check() {
    \n+
    33 return std::is_same_v<T, std::size_t>;
    \n+
    34 }
    \n+
    35 };
    \n+
    36
    \n+
    37 template<class T, T v>
    \n+
    38 struct check_size_t_impl<std::integral_constant<T,v>>
    \n+
    39 {
    \n+
    40 static constexpr auto check() {
    \n+
    41 return std::is_same_v<T, std::size_t>;
    \n+
    42 }
    \n+
    43 };
    \n+
    44
    \n+
    45 template<typename T>
    \n+
    46 constexpr auto check_size_t() {
    \n+
    47 return check_size_t_impl<T>::check();
    \n+
    48 }
    \n+
    49
    \n+
    50 template<typename T>
    \n+
    51 constexpr auto cast_size_t(const T & v) {
    \n+
    52 // check that T is an integral type that can be cast to std::size_t
    \n+
    53 static_assert(
    \n+
    54 std::is_convertible_v<T,std::size_t> &&
    \n+
    55 std::is_integral_v<T>,
    \n+
    56 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n+
    57 // positivity can only be checked at run-time
    \n+
    58 assert(v >= 0 &&
    \n+
    59 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n+
    60 return std::size_t(v);
    \n+
    61 }
    \n+
    62
    \n+
    63 template<class T, T v>
    \n+
    64 constexpr auto cast_size_t(std::integral_constant<T,v>) {
    \n+
    65 // check that T is an intergal type that can be cast to std::size_t
    \n+
    66 // and that v is positive
    \n+
    67 static_assert(
    \n+
    68 std::is_convertible_v<T,std::size_t> &&
    \n+
    69 std::is_integral_v<T> &&
    \n+
    70 v >= 0,
    \n+
    71 "HybridTreePath indices must be convertible to std::size_t or std::integral_constant<std::size_t,v>");
    \n+
    72 return std::integral_constant<std::size_t,v>();
    \n+
    73 }
    \n+
    74
    \n+
    75 // these are helper functions that help triggering a deprecation warning
    \n+
    76 template<typename T>
    \n+
    77 [[deprecated("HybridTreePath index storage should be std::size_t or std::integral_constant<std::size_t,v>!\\n"
    \n+
    78 "Using anything else is deprecated and will not possible after the 2.10 release.\\n"
    \n+
    79 "It is adviced not to specify the template parameters expicitly,\\n"
    \n+
    80 "but to use the helper functions `hybridTreePath` or `treePath`."
    \n+
    81 "These take care of converting indices to the appropriate storage.")]]
    \n+
    82 constexpr bool check_storage_type(MetaType<T>) {
    \n+
    83 return false;
    \n+
    84 }
    \n+
    85
    \n+
    86 // specialization of valid index type
    \n+
    87 template<std::size_t v>
    \n+
    88 constexpr bool check_storage_type(MetaType<std::integral_constant<std::size_t,v>>) {
    \n+
    89 return true;
    \n+
    90 }
    \n+
    91
    \n+
    92 // specialization of valid index type
    \n+
    93 constexpr bool check_storage_type(MetaType<std::size_t>) {
    \n+
    94 return true;
    \n+
    95 }
    \n+
    96 }
    \n+
    97
    \n+
    98 template<typename... T>
    \n+
    99 class HybridTreePath;
    \n+
    100
    \n+
    104
    \n+
    \n+
    105 namespace TreePathType {
    \n+\n+
    107 }
    \n+
    \n+
    108
    \n+
    109 template<typename>
    \n+\n+
    111
    \n+
    112 template<typename,std::size_t>
    \n+\n+
    114
    \n+
    115 template<typename,std::size_t>
    \n+\n+
    117
    \n+
    118 template<typename>
    \n+\n+
    120
    \n+
    121 template<typename>
    \n+\n+
    123
    \n+
    124 template<typename, std::size_t...>
    \n+\n+
    126
    \n+
    127 template<typename>
    \n+\n+
    129
    \n+
    130 template<typename, typename>
    \n+\n+
    132
    \n+
    133 template<std::size_t... i>
    \n+
    \n+
    134 void print_tree_path(std::ostream& os)
    \n+
    135 {}
    \n+
    \n+
    136
    \n+
    137 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    138 void print_tree_path(std::ostream& os)
    \n+
    139 {
    \n+
    140 os << k << " ";
    \n+
    141 print_tree_path<i...>(os);
    \n+
    142 }
    \n+
    \n+
    143
    \n+
    145
    \n+
    156 template<typename... T>
    \n+
    \n+\n+
    158 {
    \n+
    159
    \n+
    160 // enable check for dune-typetree 2.10 and above
    \n+
    161#if DUNE_VERSION_GTE(TYPETREE,2,10)
    \n+
    162 // make sure that all indices use std::size_t as the underlying number type
    \n+
    163 static_assert((... && Impl::check_size_t<T>()),
    \n+
    164 "HybridTreePath index storage must be std::size_t or std::integral_constant<std::size_t,v>");
    \n+
    165#endif
    \n+
    166
    \n+
    167 public:
    \n+
    168
    \n+
    170 using index_sequence = std::index_sequence_for<T...>;
    \n+
    171
    \n+
    \n+
    173 constexpr HybridTreePath()
    \n+
    174 {
    \n+
    175 [[maybe_unused]] constexpr bool check =
    \n+
    176 (... && Impl::check_storage_type(MetaType<T>()) );
    \n+
    177 }
    \n+
    \n+
    178
    \n+
    179 constexpr HybridTreePath(const HybridTreePath& tp) = default;
    \n+
    180 constexpr HybridTreePath(HybridTreePath&& tp) = default;
    \n+
    181
    \n+
    182 constexpr HybridTreePath& operator=(const HybridTreePath& tp) = default;
    \n+
    183 constexpr HybridTreePath& operator=(HybridTreePath&& tp) = default;
    \n+
    184
    \n+
    \n+
    186 explicit constexpr HybridTreePath(std::tuple<T...> t)
    \n+
    187 : _data(t)
    \n+
    188 {
    \n+
    189 [[maybe_unused]] constexpr bool check =
    \n+
    190 (... && Impl::check_storage_type(MetaType<T>()) );
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    194 template<typename... U,
    \n+
    195 typename std::enable_if_t<(sizeof...(T) > 0 && sizeof...(U) == sizeof...(T)),bool> = true>
    \n+
    \n+
    196 explicit constexpr HybridTreePath(U... t)
    \n+
    197 : _data(t...) // we assume that all arguments are convertible to the types T...
    \n+
    198 {
    \n+
    199 [[maybe_unused]] constexpr bool check =
    \n+
    200 (... && Impl::check_storage_type(MetaType<T>()) );
    \n+
    201 }
    \n+
    \n+
    202
    \n+
    \n+
    204 [[nodiscard]] constexpr static index_sequence enumerate()
    \n+
    205 {
    \n+
    206 return {};
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    \n+
    210 [[nodiscard]] constexpr static std::size_t size()
    \n+
    211 {
    \n+
    212 return sizeof...(T);
    \n+
    213 }
    \n+
    \n+
    214
    \n+
    \n+
    216 [[nodiscard]] constexpr static std::size_t max_size()
    \n+
    217 {
    \n+
    218 return size();
    \n+
    219 }
    \n+
    \n+
    220
    \n+
    222 template<std::size_t i,
    \n+
    223 std::enable_if_t<(sizeof...(T) > i),bool> = true>
    \n+
    \n+
    224 [[nodiscard]] constexpr auto operator[](Dune::index_constant<i>) const
    \n+
    225 {
    \n+
    226 return std::get<i>(_data);
    \n+
    227 }
    \n+
    \n+
    228
    \n+
    \n+
    230 [[nodiscard]] constexpr std::size_t operator[](std::size_t pos) const
    \n+
    231 {
    \n+
    232 std::size_t entry = 0;
    \n+
    233 Dune::Hybrid::forEach(enumerate(), [&] (auto i) {
    \n+
    234 if (i==pos)
    \n+
    235 entry = this->element(i);
    \n+
    236 });
    \n+
    237 return entry;
    \n+
    238 }
    \n+
    \n+
    239
    \n+
    241 template<std::size_t i,
    \n+
    242 std::enable_if_t<(sizeof...(T) > i),bool> = true>
    \n+
    \n+
    243 [[nodiscard]] constexpr auto element(Dune::index_constant<i> pos = {}) const
    \n+
    244 {
    \n+
    245 return std::get<i>(_data);
    \n+
    246 }
    \n+
    \n+
    247
    \n+
    \n+
    249 [[nodiscard]] constexpr std::size_t element(std::size_t pos) const
    \n+
    250 {
    \n+
    251 std::size_t entry = 0;
    \n+
    252 Dune::Hybrid::forEach(enumerate(), [&] (auto i) {
    \n+
    253 if (i==pos)
    \n+
    254 entry = this->element(i);
    \n+
    255 });
    \n+
    256 return entry;
    \n+
    257 }
    \n+
    \n+
    258
    \n+
    260 template<std::size_t n = sizeof...(T),
    \n+
    261 std::enable_if_t<(n > 0 && n == sizeof...(T)),bool> = true>
    \n+
    \n+
    262 [[nodiscard]] constexpr auto front() const
    \n+
    263 {
    \n+
    264 return std::get<0>(_data);
    \n+
    265 }
    \n+
    \n+
    266
    \n+
    268 template<std::size_t n = sizeof...(T),
    \n+
    269 std::enable_if_t<(n > 0 && n == sizeof...(T)),bool> = true>
    \n+
    \n+
    270 [[nodiscard]] constexpr auto back() const
    \n+
    271 {
    \n+
    272 return std::get<n-1>(_data);
    \n+
    273 }
    \n+
    \n+
    274
    \n+
    275#ifndef DOXYGEN
    \n+
    276
    \n+
    277 // I can't be bothered to make all the external accessors friends of HybridTreePath,
    \n+
    278 // so we'll only hide the data tuple from the user in Doxygen.
    \n+
    279
    \n+
    280 using Data = std::tuple<T...>;
    \n+
    281 Data _data;
    \n+
    282
    \n+
    283#endif // DOXYGEN
    \n+
    284
    \n+
    285 };
    \n+
    \n+
    286
    \n+
    288
    \n+
    294 template<typename... T>
    \n+
    \n+
    295 [[nodiscard]] constexpr auto makeTreePath(const T... t)
    \n+
    296 {
    \n+
    297 // check that all entries are based on std::size_t
    \n+
    298 static_assert((... && Impl::check_size_t<T>()),
    \n+
    299 "HybridTreePath indices must be of type std::size_t or std::integral_constant<std::size_t,v>");
    \n+
    300 return HybridTreePath<T...>(t...);
    \n+
    301 }
    \n+
    \n+
    302
    \n+
    304
    \n+
    311 template<typename... T>
    \n+
    \n+
    312 [[nodiscard]] constexpr auto hybridTreePath(const T&... t)
    \n+
    313 {
    \n+
    314 return makeTreePath(Impl::cast_size_t(t)...);
    \n+
    315 }
    \n+
    \n+
    316
    \n+
    318
    \n+
    325 template<typename... T>
    \n+
    \n+
    326 [[nodiscard]] constexpr auto treePath(const T&... t)
    \n+
    327 {
    \n+
    328 return makeTreePath(Impl::cast_size_t(t)...);
    \n+
    329 }
    \n+
    \n+
    330
    \n+
    331
    \n+
    333 template<typename... T>
    \n+
    \n+
    334 [[nodiscard]] constexpr std::size_t treePathSize(const HybridTreePath<T...>&)
    \n+
    335 {
    \n+
    336 return sizeof...(T);
    \n+
    337 }
    \n+
    \n+
    338
    \n+
    340
    \n+
    356 template<std::size_t i, typename... T>
    \n+
    \n+
    357 [[nodiscard]] constexpr auto treePathEntry(const HybridTreePath<T...>& tp, index_constant<i> = {})
    \n+
    358 -> typename std::decay<decltype(std::get<i>(tp._data))>::type
    \n+
    359 {
    \n+
    360 return std::get<i>(tp._data);
    \n+
    361 }
    \n+
    \n+
    362
    \n+
    364
    \n+
    379 template<std::size_t i,typename... T>
    \n+
    \n+
    380 [[nodiscard]] constexpr std::size_t treePathIndex(const HybridTreePath<T...>& tp, index_constant<i> = {})
    \n+
    381 {
    \n+
    382 return std::get<i>(tp._data);
    \n+
    383 }
    \n+
    \n+
    384
    \n+
    386
    \n+
    391 template<typename... T>
    \n+
    \n+
    392 [[nodiscard]] constexpr auto back(const HybridTreePath<T...>& tp)
    \n+
    393 -> decltype(tp.back())
    \n+
    394 {
    \n+
    395 return tp.back();
    \n+
    396 }
    \n+
    \n+
    397
    \n+
    399
    \n+
    404 template<typename... T>
    \n+
    \n+
    405 [[nodiscard]] constexpr auto front(const HybridTreePath<T...>& tp)
    \n+
    406 -> decltype(tp.front())
    \n+
    407 {
    \n+
    408 return tp.front();
    \n+
    409 }
    \n+
    \n+
    410
    \n+
    412
    \n+
    415 template<typename... T>
    \n+
    \n+
    416 [[nodiscard]] constexpr HybridTreePath<T...,std::size_t> push_back(const HybridTreePath<T...>& tp, std::size_t i)
    \n+
    417 {
    \n+
    418 return HybridTreePath<T...,std::size_t>(std::tuple_cat(tp._data,std::make_tuple(i)));
    \n+
    419 }
    \n+
    \n+
    420
    \n+
    422
    \n+
    436 template<std::size_t i, typename... T>
    \n+
    \n+
    437 [[nodiscard]] constexpr HybridTreePath<T...,index_constant<i>> push_back(const HybridTreePath<T...>& tp, index_constant<i> i_ = {})
    \n+
    438 {
    \n+
    439 return HybridTreePath<T...,index_constant<i> >(std::tuple_cat(tp._data,std::make_tuple(i_)));
    \n+
    440 }
    \n+
    \n+
    441
    \n+
    443
    \n+
    446 template<typename... T>
    \n+
    \n+
    447 [[nodiscard]] constexpr HybridTreePath<std::size_t,T...> push_front(const HybridTreePath<T...>& tp, std::size_t element)
    \n+
    448 {
    \n+
    449 return HybridTreePath<std::size_t,T...>(std::tuple_cat(std::make_tuple(element),tp._data));
    \n+
    450 }
    \n+
    \n+
    451
    \n+
    453
    \n+
    467 template<std::size_t i, typename... T>
    \n+
    \n+
    468 [[nodiscard]] constexpr HybridTreePath<index_constant<i>,T...> push_front(const HybridTreePath<T...>& tp, index_constant<i> _i = {})
    \n+
    469 {
    \n+
    470 return HybridTreePath<index_constant<i>,T...>(std::tuple_cat(std::make_tuple(_i),tp._data));
    \n+
    471 }
    \n+
    \n+
    472
    \n+
    474
    \n+
    485 template<typename I, typename... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n+
    \n+
    486 [[nodiscard]] constexpr auto accumulate_back(const HybridTreePath<T...>& tp, I i) {
    \n+
    487 using ::Dune::Hybrid::plus;
    \n+
    488 return push_back(pop_back(tp), plus(back(tp), i));
    \n+
    489 }
    \n+
    \n+
    490
    \n+
    491
    \n+
    493
    \n+
    504 template<typename I, typename... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n+
    \n+
    505 [[nodiscard]] constexpr auto accumulate_front(const HybridTreePath<T...>& tp, I i) {
    \n+
    506 using ::Dune::Hybrid::plus;
    \n+
    507 return push_front(pop_front(tp), plus(front(tp), i));
    \n+
    508 }
    \n+
    \n+
    509
    \n+
    511 template<class... Head, class... Other>
    \n+
    \n+
    512 [[nodiscard]] constexpr auto join(const HybridTreePath<Head...>& head, const Other&... tail) {
    \n+
    513 return TypeTree::HybridTreePath{std::tuple_cat(head._data, tail._data...)};
    \n+
    514 }
    \n+
    \n+
    515
    \n+
    517 template<class... T>
    \n+
    \n+
    518 [[nodiscard]] constexpr auto reverse(const HybridTreePath<T...>& tp) {
    \n+
    519 constexpr std::size_t size = sizeof...(T);
    \n+
    520 return unpackIntegerSequence([&](auto... i){
    \n+
    521 return treePath(tp[index_constant<size-i-1>{}] ...);
    \n+
    522 }, std::make_index_sequence<size>{});
    \n+
    523 }
    \n+
    \n+
    524
    \n+
    526
    \n+
    529 template <class... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n+
    \n+
    530 [[nodiscard]] constexpr auto pop_front(const HybridTreePath<T...>& tp)
    \n+
    531 {
    \n+
    532 return unpackIntegerSequence([&](auto... i){
    \n+
    533 return HybridTreePath{std::make_tuple(std::get<i+1>(tp._data)...)};
    \n+
    534 }, std::make_index_sequence<(sizeof...(T) - 1)>{});
    \n+
    535 }
    \n+
    \n+
    536
    \n+
    538
    \n+
    541 template <class... T, std::enable_if_t<(sizeof...(T) > 0),bool> = true>
    \n+
    \n+
    542 [[nodiscard]] constexpr auto pop_back(const HybridTreePath<T...>& tp)
    \n+
    543 {
    \n+
    544 return unpackIntegerSequence([&](auto... i){
    \n+
    545 return HybridTreePath{std::make_tuple(std::get<i>(tp._data)...)};
    \n+
    546 }, std::make_index_sequence<(sizeof...(T) - 1)>{});
    \n+
    547 }
    \n+
    \n+
    548
    \n+
    550
    \n+
    558 template <class... S, class... T>
    \n+
    \n+
    559 [[nodiscard]] constexpr bool operator==(
    \n+
    560 const HybridTreePath<S...>& lhs,
    \n+
    561 const HybridTreePath<T...>& rhs)
    \n+
    562 {
    \n+
    563 if constexpr (sizeof...(S) == sizeof...(T)) {
    \n+
    564 if constexpr ((Dune::IsInteroperable<S,T>::value &&...)) {
    \n+
    565 return unpackIntegerSequence([&](auto... i){
    \n+
    566 return ((std::get<i>(lhs._data) == std::get<i>(rhs._data)) &&...);
    \n+
    567 }, std::make_index_sequence<(sizeof...(S))>{});
    \n+
    568 } else {
    \n+
    569 return false;
    \n+
    570 }
    \n+
    571 } else {
    \n+
    572 return false;
    \n+
    573 }
    \n+
    574 }
    \n+
    \n+
    575
    \n+
    577
    \n+
    582 template <class S, S... lhs, class T, T... rhs>
    \n+
    \n+
    583 [[nodiscard]] constexpr auto operator==(
    \n+
    584 const HybridTreePath<std::integral_constant<S,lhs>...>&,
    \n+
    585 const HybridTreePath<std::integral_constant<T,rhs>...>&)
    \n+
    586 {
    \n+
    587 return std::bool_constant<hybridTreePath(lhs...) == hybridTreePath(rhs...)>{};
    \n+
    588 }
    \n+
    \n+
    589
    \n+
    590
    \n+
    592 template <class... S, class... T>
    \n+
    \n+
    593 [[nodiscard]] constexpr auto operator!=(
    \n+
    594 const HybridTreePath<S...>& lhs,
    \n+
    595 const HybridTreePath<T...>& rhs)
    \n+
    596 {
    \n+
    597 return !(lhs == rhs);
    \n+
    598 }
    \n+
    \n+
    599
    \n+
    601 template <class S, S... lhs, class T, T... rhs>
    \n+
    \n+
    602 [[nodiscard]] constexpr auto operator!=(
    \n+
    603 const HybridTreePath<std::integral_constant<S,lhs>...>&,
    \n+
    604 const HybridTreePath<std::integral_constant<T,rhs>...>&)
    \n+
    605 {
    \n+
    606 return std::bool_constant<hybridTreePath(lhs...) != hybridTreePath(rhs...)>{};
    \n+
    607 }
    \n+
    \n+
    608
    \n+
    609
    \n+
    \n+
    610 inline namespace Literals {
    \n+
    611
    \n+
    613
    \n+
    617 template <char... digits>
    \n+
    \n+
    618 constexpr auto operator"" _tp()
    \n+
    619 {
    \n+
    620 using namespace Dune::Indices::Literals;
    \n+
    621 return hybridTreePath(operator""_ic<digits...>());
    \n+
    622 }
    \n+
    \n+
    623
    \n+
    624 } // end namespace Literals
    \n+
    \n+
    625
    \n+
    626
    \n+
    627 template<std::size_t... i>
    \n+
    \n+
    628 struct TreePathSize<HybridTreePath<index_constant<i>...> >
    \n+
    629 : public index_constant<sizeof...(i)>
    \n+
    630 {};
    \n+
    \n+
    631
    \n+
    632
    \n+
    633 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    634 struct TreePathPushBack<HybridTreePath<index_constant<i>...>,k>
    \n+
    635 {
    \n+
    636 typedef HybridTreePath<index_constant<i>...,index_constant<k>> type;
    \n+
    637 };
    \n+
    \n+
    638
    \n+
    639 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    640 struct TreePathPushFront<HybridTreePath<index_constant<i>...>,k>
    \n+
    641 {
    \n+
    642 typedef HybridTreePath<index_constant<k>,index_constant<i>...> type;
    \n+
    643 };
    \n+
    \n+
    644
    \n+
    645 template<std::size_t k>
    \n+
    \n+
    646 struct TreePathBack<HybridTreePath<index_constant<k>>>
    \n+
    647 : public index_constant<k>
    \n+
    648 {};
    \n+
    \n+
    649
    \n+
    650 template<std::size_t j, std::size_t k, std::size_t... l>
    \n+
    \n+
    651 struct TreePathBack<HybridTreePath<index_constant<j>,index_constant<k>,index_constant<l>...>>
    \n+
    652 : public TreePathBack<HybridTreePath<index_constant<k>,index_constant<l>...>>
    \n+
    653 {};
    \n+
    \n+
    654
    \n+
    655 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    656 struct TreePathFront<HybridTreePath<index_constant<k>,index_constant<i>...>>
    \n+
    657 : public index_constant<k>
    \n+
    658 {};
    \n+
    \n+
    659
    \n+
    660 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    661 struct TreePathPopBack<HybridTreePath<index_constant<k>>,i...>
    \n+
    662 {
    \n+\n+
    664 };
    \n+
    \n+
    665
    \n+
    666 template<std::size_t j,
    \n+
    667 std::size_t k,
    \n+
    668 std::size_t... l,
    \n+
    669 std::size_t... i>
    \n+
    \n+
    670 struct TreePathPopBack<HybridTreePath<index_constant<j>,index_constant<k>,index_constant<l>...>,i...>
    \n+
    671 : public TreePathPopBack<HybridTreePath<index_constant<k>,index_constant<l>...>,i...,j>
    \n+
    672 {};
    \n+
    \n+
    673
    \n+
    674 template<std::size_t k, std::size_t... i>
    \n+
    \n+
    675 struct TreePathPopFront<HybridTreePath<index_constant<k>,index_constant<i>...> >
    \n+
    676 {
    \n+\n+
    678 };
    \n+
    \n+
    679
    \n+
    680 template<std::size_t... i, std::size_t... k>
    \n+
    \n+
    681 struct TreePathConcat<HybridTreePath<index_constant<i>...>,HybridTreePath<index_constant<k>...> >
    \n+
    682 {
    \n+
    683 typedef HybridTreePath<index_constant<i>...,index_constant<k>...> type;
    \n+
    684 };
    \n+
    \n+
    685
    \n+
    686#ifndef DOXYGEN
    \n+
    687
    \n+
    688 namespace impl {
    \n+
    689
    \n+
    690 // end of recursion
    \n+
    691 template<std::size_t i, typename... T>
    \n+
    692 typename std::enable_if<
    \n+
    693 (i == sizeof...(T))
    \n+
    694 >::type
    \n+
    695 print_hybrid_tree_path(std::ostream& os, const HybridTreePath<T...>& tp, index_constant<i> _i)
    \n+
    696 {}
    \n+
    697
    \n+
    698 // print current entry and recurse
    \n+
    699 template<std::size_t i, typename... T>
    \n+
    700 typename std::enable_if<
    \n+
    701 (i < sizeof...(T))
    \n+
    702 >::type
    \n+
    703 print_hybrid_tree_path(std::ostream& os, const HybridTreePath<T...>& tp, index_constant<i> _i)
    \n+
    704 {
    \n+
    705 os << treePathIndex(tp,_i) << " ";
    \n+
    706 print_hybrid_tree_path(os,tp,index_constant<i+1>{});
    \n+
    707 }
    \n+
    708
    \n+
    709 } // namespace impl
    \n+
    710
    \n+
    711#endif // DOXYGEN
    \n+
    712
    \n+
    714 template<typename... T>
    \n+
    \n+
    715 std::ostream& operator<<(std::ostream& os, const HybridTreePath<T...>& tp)
    \n+
    716 {
    \n+
    717 os << "HybridTreePath< ";
    \n+
    718 impl::print_hybrid_tree_path(os, tp, index_constant<0>{});
    \n+
    719 os << ">";
    \n+
    720 return os;
    \n+
    721 }
    \n+
    \n+
    722
    \n+
    723 template<std::size_t... i>
    \n+\n+
    725
    \n+
    727
    \n+
    728 } // namespace TypeTree
    \n+
    729} //namespace Dune
    \n+
    730
    \n+
    731#endif // DUNE_TYPETREE_TREEPATH_HH
    \n+\n+\n+
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n+
    std::ostream & operator<<(std::ostream &os, const HybridTreePath< T... > &tp)
    Dumps a HybridTreePath to a stream.
    Definition treepath.hh:715
    \n+
    constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
    Returns the size (number of components) of the given HybridTreePath.
    Definition treepath.hh:334
    \n+
    constexpr auto back(const HybridTreePath< T... > &tp) -> decltype(tp.back())
    Returns a copy of the last element of the HybridTreePath.
    Definition treepath.hh:392
    \n+
    constexpr HybridTreePath< std::size_t, T... > push_front(const HybridTreePath< T... > &tp, std::size_t element)
    Prepends a run time index to a HybridTreePath.
    Definition treepath.hh:447
    \n+
    constexpr auto accumulate_front(const HybridTreePath< T... > &tp, I i)
    Hybrid utility that accumulates to the front of a multi-index.
    Definition treepath.hh:505
    \n+
    constexpr auto pop_front(const HybridTreePath< T... > &tp)
    Removes first index on a HybridTreePath.
    Definition treepath.hh:530
    \n+
    constexpr auto reverse(const HybridTreePath< T... > &tp)
    Reverses the order of the elements in the path.
    Definition treepath.hh:518
    \n+
    constexpr auto accumulate_back(const HybridTreePath< T... > &tp, I i)
    Hybrid utility that accumulates to the back of a multi-index.
    Definition treepath.hh:486
    \n+
    constexpr auto join(const HybridTreePath< Head... > &head, const Other &... tail)
    Join two tree paths into one.
    Definition treepath.hh:512
    \n+
    constexpr auto treePathEntry(const HybridTreePath< T... > &tp, index_constant< i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type
    Returns a copy of the i-th element of the HybridTreePath.
    Definition treepath.hh:357
    \n+
    constexpr auto pop_back(const HybridTreePath< T... > &tp)
    Removes last index on a HybridTreePath.
    Definition treepath.hh:542
    \n+
    constexpr auto operator!=(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
    Compare two HybridTreePaths for unequality.
    Definition treepath.hh:593
    \n+
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n+
    constexpr std::size_t treePathIndex(const HybridTreePath< T... > &tp, index_constant< i >={})
    Returns the index value of the i-th element of the HybridTreePath.
    Definition treepath.hh:380
    \n+
    constexpr auto makeTreePath(const T... t)
    helper function to construct a new HybridTreePath from the given indices.
    Definition treepath.hh:295
    \n+
    constexpr bool operator==(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
    Compare two HybridTreePaths for value equality.
    Definition treepath.hh:559
    \n+
    void print_tree_path(std::ostream &os)
    Definition treepath.hh:134
    \n+
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n+
    constexpr auto front(const HybridTreePath< T... > &tp) -> decltype(tp.front())
    Returns a copy of the first element of the HybridTreePath.
    Definition treepath.hh:405
    \n+
    Definition accumulate_static.hh:16
    \n+
    Type
    Definition treepath.hh:106
    \n+
    @ fullyStatic
    Definition treepath.hh:106
    \n+
    @ dynamic
    Definition treepath.hh:106
    \n+
    Statically combine two values of type result_type using +.
    Definition accumulate_static.hh:49
    \n+
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n+
    constexpr HybridTreePath(HybridTreePath &&tp)=default
    \n+
    constexpr auto back() const
    Get the last index value. Only available in non-empty paths.
    Definition treepath.hh:270
    \n+
    constexpr HybridTreePath & operator=(const HybridTreePath &tp)=default
    \n+
    constexpr std::size_t element(std::size_t pos) const
    Get the index value at position pos.
    Definition treepath.hh:249
    \n+
    constexpr HybridTreePath(std::tuple< T... > t)
    Constructor from a std::tuple
    Definition treepath.hh:186
    \n+
    constexpr HybridTreePath & operator=(HybridTreePath &&tp)=default
    \n+
    constexpr HybridTreePath(U... t)
    Constructor from arguments.
    Definition treepath.hh:196
    \n+
    constexpr HybridTreePath()
    Default constructor.
    Definition treepath.hh:173
    \n+
    constexpr auto element(Dune::index_constant< i > pos={}) const
    Get the last index value.
    Definition treepath.hh:243
    \n+
    static constexpr std::size_t size()
    Get the size (length) of this path.
    Definition treepath.hh:210
    \n+
    constexpr auto operator[](Dune::index_constant< i >) const
    Get the index value at position pos.
    Definition treepath.hh:224
    \n+
    constexpr auto front() const
    Get the first index value. Only available in non-empty paths.
    Definition treepath.hh:262
    \n+
    static constexpr index_sequence enumerate()
    Returns an index_sequence for enumerating the components of this HybridTreePath.
    Definition treepath.hh:204
    \n+
    constexpr HybridTreePath(const HybridTreePath &tp)=default
    \n+
    constexpr std::size_t operator[](std::size_t pos) const
    Get the index value at position pos.
    Definition treepath.hh:230
    \n+
    static constexpr std::size_t max_size()
    Get the size (length) of this path.
    Definition treepath.hh:216
    \n+
    std::index_sequence_for< T... > index_sequence
    An index_sequence for the entries in this HybridTreePath.
    Definition treepath.hh:170
    \n+
    Definition treepath.hh:110
    \n+
    Definition treepath.hh:113
    \n+
    Definition treepath.hh:116
    \n+
    Definition treepath.hh:119
    \n+
    Definition treepath.hh:122
    \n+
    Definition treepath.hh:125
    \n+
    Definition treepath.hh:128
    \n+
    Definition treepath.hh:131
    \n+
    HybridTreePath< index_constant< i >..., index_constant< k > > type
    Definition treepath.hh:636
    \n+
    HybridTreePath< index_constant< k >, index_constant< i >... > type
    Definition treepath.hh:642
    \n+
    HybridTreePath< index_constant< i >... > type
    Definition treepath.hh:663
    \n+
    HybridTreePath< index_constant< i >... > type
    Definition treepath.hh:677
    \n+
    HybridTreePath< index_constant< i >..., index_constant< k >... > type
    Definition treepath.hh:683
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,26 +1,812 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-transformationutilities.hh\n+treepath.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n+1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=8 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n-7#define DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n+6#ifndef DUNE_TYPETREE_TREEPATH_HH\n+7#define DUNE_TYPETREE_TREEPATH_HH\n 8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-11\n-12#endif // DUNE_TYPETREE_TRANSFORMATIONUTILITIES_HH\n-_\bs_\bi_\bm_\bp_\bl_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh\n-_\bg_\be_\bn_\be_\br_\bi_\bc_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bd_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\bs_\b._\bh_\bh\n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20\n+21#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+23\n+24namespace _\bD_\bu_\bn_\be {\n+25 namespace TypeTree {\n+26\n+27 // The Impl namespace collects some free standing functions helper functions\n+28 namespace Impl {\n+29 template\n+30 struct check_size_t_impl\n+31 {\n+32 static constexpr auto check() {\n+33 return std::is_same_v;\n+34 }\n+35 };\n+36\n+37 template\n+38 struct check_size_t_impl>\n+39 {\n+40 static constexpr auto check() {\n+41 return std::is_same_v;\n+42 }\n+43 };\n+44\n+45 template\n+46 constexpr auto check_size_t() {\n+47 return check_size_t_impl::check();\n+48 }\n+49\n+50 template\n+51 constexpr auto cast_size_t(const T & v) {\n+52 // check that T is an integral type that can be cast to std::size_t\n+53 static_assert(\n+54 std::is_convertible_v &&\n+55 std::is_integral_v,\n+56 \"HybridTreePath indices must be convertible to std::size_t or std::\n+integral_constant\");\n+57 // positivity can only be checked at run-time\n+58 assert(v >= 0 &&\n+59 \"HybridTreePath indices must be convertible to std::size_t or std::\n+integral_constant\");\n+60 return std::size_t(v);\n+61 }\n+62\n+63 template\n+64 constexpr auto cast_size_t(std::integral_constant) {\n+65 // check that T is an intergal type that can be cast to std::size_t\n+66 // and that v is positive\n+67 static_assert(\n+68 std::is_convertible_v &&\n+69 std::is_integral_v &&\n+70 v >= 0,\n+71 \"HybridTreePath indices must be convertible to std::size_t or std::\n+integral_constant\");\n+72 return std::integral_constant();\n+73 }\n+74\n+75 // these are helper functions that help triggering a deprecation warning\n+76 template\n+77 [[deprecated(\"HybridTreePath index storage should be std::size_t or std::\n+integral_constant!\\n\"\n+78 \"Using anything else is deprecated and will not possible after the 2.10\n+release.\\n\"\n+79 \"It is adviced not to specify the template parameters expicitly,\\n\"\n+80 \"but to use the helper functions `hybridTreePath` or `treePath`.\"\n+81 \"These take care of converting indices to the appropriate storage.\")]]\n+82 constexpr bool check_storage_type(MetaType) {\n+83 return false;\n+84 }\n+85\n+86 // specialization of valid index type\n+87 template\n+88 constexpr bool check_storage_type(MetaType>) {\n+89 return true;\n+90 }\n+91\n+92 // specialization of valid index type\n+93 constexpr bool check_storage_type(MetaType) {\n+94 return true;\n+95 }\n+96 }\n+97\n+98 template\n+99 class HybridTreePath;\n+100\n+104\n+_\b1_\b0_\b5 namespace TreePathType {\n+_\b1_\b0_\b6 enum _\bT_\by_\bp_\be { _\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc, _\bd_\by_\bn_\ba_\bm_\bi_\bc };\n+107 }\n+108\n+109 template\n+_\b1_\b1_\b0 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be;\n+111\n+112 template\n+_\b1_\b1_\b3 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk;\n+114\n+115 template\n+_\b1_\b1_\b6 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt;\n+117\n+118 template\n+_\b1_\b1_\b9 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk;\n+120\n+121 template\n+_\b1_\b2_\b2 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt;\n+123\n+124 template\n+_\b1_\b2_\b5 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk;\n+126\n+127 template\n+_\b1_\b2_\b8 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt;\n+129\n+130 template\n+_\b1_\b3_\b1 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt;\n+132\n+133 template\n+_\b1_\b3_\b4 void _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(std::ostream& os)\n+135 {}\n+136\n+137 template\n+_\b1_\b3_\b8 void _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(std::ostream& os)\n+139 {\n+140 os << k << \" \";\n+141 _\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh(os);\n+142 }\n+143\n+145\n+156 template\n+_\b1_\b5_\b7 class _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+158 {\n+159\n+160 // enable check for dune-typetree 2.10 and above\n+161#if DUNE_VERSION_GTE(TYPETREE,2,10)\n+162 // make sure that all indices use std::size_t as the underlying number type\n+163 static_assert((... && Impl::check_size_t()),\n+164 \"HybridTreePath index storage must be std::size_t or std::\n+integral_constant\");\n+165#endif\n+166\n+167 public:\n+168\n+_\b1_\b7_\b0 using _\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be = std::index_sequence_for;\n+171\n+_\b1_\b7_\b3 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh()\n+174 {\n+175 [[maybe_unused]] constexpr bool check =\n+176 (... && Impl::check_storage_type(MetaType()) );\n+177 }\n+178\n+_\b1_\b7_\b9 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& tp) = default;\n+_\b1_\b8_\b0 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh&& tp) = default;\n+181\n+_\b1_\b8_\b2 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& tp) = default;\n+_\b1_\b8_\b3 constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh&& tp) = default;\n+184\n+_\b1_\b8_\b6 explicit constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple t)\n+187 : _data(t)\n+188 {\n+189 [[maybe_unused]] constexpr bool check =\n+190 (... && Impl::check_storage_type(MetaType()) );\n+191 }\n+192\n+194 template 0 && sizeof...(U) == sizeof...\n+(T)),bool> = true>\n+_\b1_\b9_\b6 explicit constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(U... t)\n+197 : _data(t...) // we assume that all arguments are convertible to the types\n+T...\n+198 {\n+199 [[maybe_unused]] constexpr bool check =\n+200 (... && Impl::check_storage_type(MetaType()) );\n+201 }\n+202\n+_\b2_\b0_\b4 [[nodiscard]] constexpr static _\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be _\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be()\n+205 {\n+206 return {};\n+207 }\n+208\n+_\b2_\b1_\b0 [[nodiscard]] constexpr static std::size_t _\bs_\bi_\bz_\be()\n+211 {\n+212 return sizeof...(T);\n+213 }\n+214\n+_\b2_\b1_\b6 [[nodiscard]] constexpr static std::size_t _\bm_\ba_\bx_\b__\bs_\bi_\bz_\be()\n+217 {\n+218 return _\bs_\bi_\bz_\be();\n+219 }\n+220\n+222 template i),bool> = true>\n+_\b2_\b2_\b4 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](Dune::index_constant) const\n+225 {\n+226 return std::get(_data);\n+227 }\n+228\n+_\b2_\b3_\b0 [[nodiscard]] constexpr std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t pos) const\n+231 {\n+232 std::size_t entry = 0;\n+233 Dune::Hybrid::forEach(_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be(), [&] (auto i) {\n+234 if (i==pos)\n+235 entry = this->_\be_\bl_\be_\bm_\be_\bn_\bt(i);\n+236 });\n+237 return entry;\n+238 }\n+239\n+241 template i),bool> = true>\n+_\b2_\b4_\b3 [[nodiscard]] constexpr auto _\be_\bl_\be_\bm_\be_\bn_\bt(Dune::index_constant pos = {})\n+const\n+244 {\n+245 return std::get(_data);\n+246 }\n+247\n+_\b2_\b4_\b9 [[nodiscard]] constexpr std::size_t _\be_\bl_\be_\bm_\be_\bn_\bt(std::size_t pos) const\n+250 {\n+251 std::size_t entry = 0;\n+252 Dune::Hybrid::forEach(_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be(), [&] (auto i) {\n+253 if (i==pos)\n+254 entry = this->_\be_\bl_\be_\bm_\be_\bn_\bt(i);\n+255 });\n+256 return entry;\n+257 }\n+258\n+260 template 0 && n == sizeof...(T)),bool> = true>\n+_\b2_\b6_\b2 [[nodiscard]] constexpr auto _\bf_\br_\bo_\bn_\bt() const\n+263 {\n+264 return std::get<0>(_data);\n+265 }\n+266\n+268 template 0 && n == sizeof...(T)),bool> = true>\n+_\b2_\b7_\b0 [[nodiscard]] constexpr auto _\bb_\ba_\bc_\bk() const\n+271 {\n+272 return std::get(_data);\n+273 }\n+274\n+275#ifndef DOXYGEN\n+276\n+277 // I can't be bothered to make all the external accessors friends of\n+HybridTreePath,\n+278 // so we'll only hide the data tuple from the user in Doxygen.\n+279\n+280 using Data = std::tuple;\n+281 Data _data;\n+282\n+283#endif // DOXYGEN\n+284\n+285 };\n+286\n+288\n+294 template\n+_\b2_\b9_\b5 [[nodiscard]] constexpr auto _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T... t)\n+296 {\n+297 // check that all entries are based on std::size_t\n+298 static_assert((... && Impl::check_size_t()),\n+299 \"HybridTreePath indices must be of type std::size_t or std::\n+integral_constant\");\n+300 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(t...);\n+301 }\n+302\n+304\n+311 template\n+_\b3_\b1_\b2 [[nodiscard]] constexpr auto _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(const T&... t)\n+313 {\n+314 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(Impl::cast_size_t(t)...);\n+315 }\n+316\n+318\n+325 template\n+_\b3_\b2_\b6 [[nodiscard]] constexpr auto _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(const T&... t)\n+327 {\n+328 return _\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(Impl::cast_size_t(t)...);\n+329 }\n+330\n+331\n+333 template\n+_\b3_\b3_\b4 [[nodiscard]] constexpr std::size_t _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&)\n+335 {\n+336 return sizeof...(T);\n+337 }\n+338\n+340\n+356 template\n+_\b3_\b5_\b7 [[nodiscard]] constexpr auto _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp,\n+index_constant = {})\n+358 -> typename std::decay(tp._data))>::type\n+359 {\n+360 return std::get(tp._data);\n+361 }\n+362\n+364\n+379 template\n+_\b3_\b8_\b0 [[nodiscard]] constexpr std::size_t _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx(const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant = {})\n+381 {\n+382 return std::get(tp._data);\n+383 }\n+384\n+386\n+391 template\n+_\b3_\b9_\b2 [[nodiscard]] constexpr auto _\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n+393 -> decltype(tp._\bb_\ba_\bc_\bk())\n+394 {\n+395 return tp._\bb_\ba_\bc_\bk();\n+396 }\n+397\n+399\n+404 template\n+_\b4_\b0_\b5 [[nodiscard]] constexpr auto _\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n+406 -> decltype(tp._\bf_\br_\bo_\bn_\bt())\n+407 {\n+408 return tp._\bf_\br_\bo_\bn_\bt();\n+409 }\n+410\n+412\n+415 template\n+_\b4_\b1_\b6 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, std::size_t i)\n+417 {\n+418 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple_cat(tp._data,std::\n+make_tuple(i)));\n+419 }\n+420\n+422\n+436 template\n+_\b4_\b3_\b7 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh> _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant i_ = {})\n+438 {\n+439 return HybridTreePath >(std::tuple_cat\n+(tp._data,std::make_tuple(i_)));\n+440 }\n+441\n+443\n+446 template\n+_\b4_\b4_\b7 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(const\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, std::size_t element)\n+448 {\n+449 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(std::tuple_cat(std::make_tuple\n+(element),tp._data));\n+450 }\n+451\n+453\n+467 template\n+_\b4_\b6_\b8 [[nodiscard]] constexpr _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>,T...> _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt\n+(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp, index_constant _i = {})\n+469 {\n+470 return HybridTreePath,T...>(std::tuple_cat(std::\n+make_tuple(_i),tp._data));\n+471 }\n+472\n+474\n+485 template\n+0),bool> = true>\n+_\b4_\b8_\b6 [[nodiscard]] constexpr auto _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&\n+tp, I i) {\n+487 using ::Dune::Hybrid::plus;\n+488 return _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk(tp), _\bp_\bl_\bu_\bs(_\bb_\ba_\bc_\bk(tp), i));\n+489 }\n+490\n+491\n+493\n+504 template\n+0),bool> = true>\n+_\b5_\b0_\b5 [[nodiscard]] constexpr auto _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>&\n+tp, I i) {\n+506 using ::Dune::Hybrid::plus;\n+507 return _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt(tp), _\bp_\bl_\bu_\bs(_\bf_\br_\bo_\bn_\bt(tp), i));\n+508 }\n+509\n+511 template\n+_\b5_\b1_\b2 [[nodiscard]] constexpr auto _\bj_\bo_\bi_\bn(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bH_\be_\ba_\bd_\b._\b._\b._\b>& head,\n+const Other&... tail) {\n+513 return _\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::tuple_cat(head._data, tail._data...)};\n+514 }\n+515\n+517 template\n+_\b5_\b1_\b8 [[nodiscard]] constexpr auto _\br_\be_\bv_\be_\br_\bs_\be(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp) {\n+519 constexpr std::size_t size = sizeof...(T);\n+520 return unpackIntegerSequence([&](auto... i){\n+521 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh(tp[index_constant{}] ...);\n+522 }, std::make_index_sequence{});\n+523 }\n+524\n+526\n+529 template 0),bool> = true>\n+_\b5_\b3_\b0 [[nodiscard]] constexpr auto _\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n+531 {\n+532 return unpackIntegerSequence([&](auto... i){\n+533 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::make_tuple(std::get(tp._data)...)};\n+534 }, std::make_index_sequence<(sizeof...(T) - 1)>{});\n+535 }\n+536\n+538\n+541 template 0),bool> = true>\n+_\b5_\b4_\b2 [[nodiscard]] constexpr auto _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk(const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n+543 {\n+544 return unpackIntegerSequence([&](auto... i){\n+545 return _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh{std::make_tuple(std::get(tp._data)...)};\n+546 }, std::make_index_sequence<(sizeof...(T) - 1)>{});\n+547 }\n+548\n+550\n+558 template \n+_\b5_\b5_\b9 [[nodiscard]] constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(\n+560 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bS_\b._\b._\b._\b>& lhs,\n+561 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& rhs)\n+562 {\n+563 if constexpr (sizeof...(S) == sizeof...(T)) {\n+564 if constexpr ((Dune::IsInteroperable::value &&...)) {\n+565 return unpackIntegerSequence([&](auto... i){\n+566 return ((std::get(lhs._data) == std::get(rhs._data)) &&...);\n+567 }, std::make_index_sequence<(sizeof...(S))>{});\n+568 } else {\n+569 return false;\n+570 }\n+571 } else {\n+572 return false;\n+573 }\n+574 }\n+575\n+577\n+582 template \n+_\b5_\b8_\b3 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(\n+584 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&,\n+585 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&)\n+586 {\n+587 return std::bool_constant<_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(lhs...) == _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(rhs...)>\n+{};\n+588 }\n+589\n+590\n+592 template \n+_\b5_\b9_\b3 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(\n+594 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bS_\b._\b._\b._\b>& lhs,\n+595 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& rhs)\n+596 {\n+597 return !(lhs == rhs);\n+598 }\n+599\n+601 template \n+_\b6_\b0_\b2 [[nodiscard]] constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(\n+603 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&,\n+604 const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>&)\n+605 {\n+606 return std::bool_constant<_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(lhs...) != _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(rhs...)>\n+{};\n+607 }\n+608\n+609\n+_\b6_\b1_\b0 inline namespace Literals {\n+611\n+613\n+617 template \n+_\b6_\b1_\b8 constexpr auto operator\"\" _tp()\n+619 {\n+620 using namespace Dune::Indices::Literals;\n+621 return _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(operator\"\"_ic());\n+622 }\n+623\n+624 } // end namespace Literals\n+625\n+626\n+627 template\n+_\b6_\b2_\b8 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...> >\n+629 : public index_constant\n+630 {};\n+631\n+632\n+633 template\n+_\b6_\b3_\b4 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,k>\n+635 {\n+_\b6_\b3_\b6 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...,index_constant> _\bt_\by_\bp_\be;\n+637 };\n+638\n+639 template\n+_\b6_\b4_\b0 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,k>\n+641 {\n+_\b6_\b4_\b2 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bk_\b>,index_constant...> _\bt_\by_\bp_\be;\n+643 };\n+644\n+645 template\n+_\b6_\b4_\b6 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh>>\n+647 : public index_constant\n+648 {};\n+649\n+650 template\n+_\b6_\b5_\b1 struct\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant,index_constant...>>\n+652 : public\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk,index_constant...>>\n+653 {};\n+654\n+655 template\n+_\b6_\b5_\b6 struct\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant...>>\n+657 : public index_constant\n+658 {};\n+659\n+660 template\n+_\b6_\b6_\b1 struct _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh>,i...>\n+662 {\n+_\b6_\b6_\b3 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...> _\bt_\by_\bp_\be;\n+664 };\n+665\n+666 template\n+_\b6_\b7_\b0 struct\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant,index_constant...>,i...>\n+671 : public\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk,index_constant...>,i...,j>\n+672 {};\n+673\n+674 template\n+_\b6_\b7_\b5 struct\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh,index_constant...> >\n+676 {\n+_\b6_\b7_\b7 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...> _\bt_\by_\bp_\be;\n+678 };\n+679\n+680 template\n+_\b6_\b8_\b1 struct\n+_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt<_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>,_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh...>\n+>\n+682 {\n+_\b6_\b8_\b3 typedef _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...,index_constant...> _\bt_\by_\bp_\be;\n+684 };\n+685\n+686#ifndef DOXYGEN\n+687\n+688 namespace impl {\n+689\n+690 // end of recursion\n+691 template\n+692 typename std::enable_if<\n+693 (i == sizeof...(T))\n+694 >::type\n+695 print_hybrid_tree_path(std::ostream& os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp,\n+index_constant _i)\n+696 {}\n+697\n+698 // print current entry and recurse\n+699 template\n+700 typename std::enable_if<\n+701 (i < sizeof...(T))\n+702 >::type\n+703 print_hybrid_tree_path(std::ostream& os, const HybridTreePath& tp,\n+index_constant _i)\n+704 {\n+705 os << _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx(tp,_i) << \" \";\n+706 print_hybrid_tree_path(os,tp,index_constant{});\n+707 }\n+708\n+709 } // namespace impl\n+710\n+711#endif // DOXYGEN\n+712\n+714 template\n+_\b7_\b1_\b5 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bT_\b._\b._\b._\b>& tp)\n+716 {\n+717 os << \"HybridTreePath< \";\n+718 impl::print_hybrid_tree_path(os, tp, index_constant<0>{});\n+719 os << \">\";\n+720 return os;\n+721 }\n+722\n+723 template\n+_\b7_\b2_\b4 using _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>...>;\n+725\n+727\n+728 } // namespace TypeTree\n+729} //namespace Dune\n+730\n+731#endif // DUNE_TYPETREE_TREEPATH_HH\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+_\bf_\bi_\bx_\be_\bd_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bs_\bt_\ba_\bc_\bk_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n+T... > &tp, std::size_t i)\n+Appends a run time index to a HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &os, const HybridTreePath< T... > &tp)\n+Dumps a HybridTreePath to a stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:715\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n+constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n+Returns the size (number of components) of the given HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bb_\ba_\bc_\bk\n+constexpr auto back(const HybridTreePath< T... > &tp) -> decltype(tp.back())\n+Returns a copy of the last element of the HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt\n+constexpr HybridTreePath< std::size_t, T... > push_front(const HybridTreePath<\n+T... > &tp, std::size_t element)\n+Prepends a run time index to a HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:447\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bf_\br_\bo_\bn_\bt\n+constexpr auto accumulate_front(const HybridTreePath< T... > &tp, I i)\n+Hybrid utility that accumulates to the front of a multi-index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:505\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt\n+constexpr auto pop_front(const HybridTreePath< T... > &tp)\n+Removes first index on a HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:530\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bv_\be_\br_\bs_\be\n+constexpr auto reverse(const HybridTreePath< T... > &tp)\n+Reverses the order of the elements in the path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:518\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bb_\ba_\bc_\bk\n+constexpr auto accumulate_back(const HybridTreePath< T... > &tp, I i)\n+Hybrid utility that accumulates to the back of a multi-index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bj_\bo_\bi_\bn\n+constexpr auto join(const HybridTreePath< Head... > &head, const Other &...\n+tail)\n+Join two tree paths into one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bE_\bn_\bt_\br_\by\n+constexpr auto treePathEntry(const HybridTreePath< T... > &tp, index_constant<\n+i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type\n+Returns a copy of the i-th element of the HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n+constexpr auto pop_back(const HybridTreePath< T... > &tp)\n+Removes last index on a HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:542\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+constexpr auto operator!=(const HybridTreePath< S... > &lhs, const\n+HybridTreePath< T... > &rhs)\n+Compare two HybridTreePaths for unequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:593\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto hybridTreePath(const T &... t)\n+Constructs a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bI_\bn_\bd_\be_\bx\n+constexpr std::size_t treePathIndex(const HybridTreePath< T... > &tp,\n+index_constant< i >={})\n+Returns the index value of the i-th element of the HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto makeTreePath(const T... t)\n+helper function to construct a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+constexpr bool operator==(const HybridTreePath< S... > &lhs, const\n+HybridTreePath< T... > &rhs)\n+Compare two HybridTreePaths for value equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:559\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bt_\br_\be_\be_\b__\bp_\ba_\bt_\bh\n+void print_tree_path(std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:134\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto treePath(const T &... t)\n+Constructs a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+constexpr auto front(const HybridTreePath< T... > &tp) -> decltype(tp.front())\n+Returns a copy of the first element of the HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:405\n+_\bD_\bu_\bn_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n+Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bf_\bu_\bl_\bl_\by_\bS_\bt_\ba_\bt_\bi_\bc\n+@ fullyStatic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n+@ dynamic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs\n+Statically combine two values of type result_type using +.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+A hybrid version of TreePath that supports both compile time and run time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr HybridTreePath(HybridTreePath &&tp)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bb_\ba_\bc_\bk\n+constexpr auto back() const\n+Get the last index value. Only available in non-empty paths.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+constexpr HybridTreePath & operator=(const HybridTreePath &tp)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt\n+constexpr std::size_t element(std::size_t pos) const\n+Get the index value at position pos.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:249\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr HybridTreePath(std::tuple< T... > t)\n+Constructor from a std::tuple\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+constexpr HybridTreePath & operator=(HybridTreePath &&tp)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr HybridTreePath(U... t)\n+Constructor from arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr HybridTreePath()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:173\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt\n+constexpr auto element(Dune::index_constant< i > pos={}) const\n+Get the last index value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr std::size_t size()\n+Get the size (length) of this path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:210\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr auto operator[](Dune::index_constant< i >) const\n+Get the index value at position pos.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+constexpr auto front() const\n+Get the first index value. Only available in non-empty paths.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\be_\bn_\bu_\bm_\be_\br_\ba_\bt_\be\n+static constexpr index_sequence enumerate()\n+Returns an index_sequence for enumerating the components of this\n+HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr HybridTreePath(const HybridTreePath &tp)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr std::size_t operator[](std::size_t pos) const\n+Get the index value at position pos.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be\n+static constexpr std::size_t max_size()\n+Get the size (length) of this path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be\n+std::index_sequence_for< T... > index_sequence\n+An index_sequence for the entries in this HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bB_\ba_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bF_\br_\bo_\bn_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:122\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk\n+_\b>_\b:_\b:_\bt_\by_\bp_\be\n+HybridTreePath< index_constant< i >..., index_constant< k > > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:636\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,_\b _\bk\n+_\b>_\b:_\b:_\bt_\by_\bp_\be\n+HybridTreePath< index_constant< k >, index_constant< i >... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:642\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bB_\ba_\bc_\bk_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>_\b,_\b _\bi_\b._\b._\b.\n+_\b>_\b:_\b:_\bt_\by_\bp_\be\n+HybridTreePath< index_constant< i >... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:663\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bP_\bo_\bp_\bF_\br_\bo_\bn_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b,\n+_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+HybridTreePath< index_constant< i >... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bC_\bo_\bn_\bc_\ba_\bt_\b<_\b _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bi_\b _\b>_\b._\b._\b._\b _\b>_\b,\n+_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bk_\b _\b>_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+HybridTreePath< index_constant< i >..., index_constant< k >... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:683\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00053.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00053.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: childextraction.hh File Reference\n+dune-typetree: nodeinterface.hh File Reference\n \n \n \n \n \n \n \n@@ -70,66 +70,61 @@\n
    \n \n
    \n
    \n
    \n \n-
    childextraction.hh File Reference
    \n+
    nodeinterface.hh File Reference
    \n
    \n
    \n-
    #include <type_traits>
    \n-#include <utility>
    \n-#include <dune/common/concept.hh>
    \n+
    #include <cstddef>
    \n+#include <type_traits>
    \n #include <dune/common/documentation.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/shared_ptr.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/treepath.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::TypeTree::NodeInterface
     Interface for nodes in a dune-typetree. More...
     
    \n \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Typedefs

    template<typename Node , std::size_t... indices>
    using Dune::TypeTree::Child = typename impl::_Child< Node, indices... >::type
     Template alias for the type of a child node given by a list of child indices.
     
    template<typename Node , typename TreePath >
    using Dune::TypeTree::ChildForTreePath = typename impl::_ChildForTreePath< Node, TreePath >::type
     Template alias for the type of a child node given by a TreePath or a HybridTreePath type.
     
    template<typename T >
    using Dune::TypeTree::is_flat_index = typename impl::_is_flat_index< std::decay_t< T > >::type
     Type trait that determines whether T is a flat index in the context of child extraction.
     
    template<typename Node >
    using Dune::TypeTree::NodeTag = typename std::decay_t< Node >::NodeTag
     Returns the node tag of the given Node.
     
    template<typename T >
    using Dune::TypeTree::ImplementationTag = typename std::decay_t< T >::ImplementationTag
     Returns the implementation tag of the given Node.
     
    template<typename Node >
    using Dune::TypeTree::StaticDegree = decltype(Node::degree())
     Returns the statically known degree of the given Node type as a std::integral_constant.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

    \n Functions

    template<typename Node , typename... Indices>
    ImplementationDefined Dune::TypeTree::child (Node &&node, Indices... indices)
     Extracts the child of a node given by a sequence of compile-time and run-time indices.
     
    template<typename Node , typename... Indices>
    ImplementationDefined Dune::TypeTree::childStorage (Node &&node, Indices... indices)
     
    template<typename Node , typename... Indices>
    ImplementationDefined Dune::TypeTree::child (Node &&node, HybridTreePath< Indices... > treePath)
     Extracts the child of a node given by a HybridTreePath object.
     
    template<typename Node >
    std::size_t Dune::TypeTree::degree (const Node &node)
     Returns the degree of node as run time information.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,58 +1,43 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-childextraction.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+nodeinterface.hh File Reference\n+#include \n #include \n-#include \n-#include \n #include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+\u00a0 Interface for nodes in a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd = typename impl::_Child< Node, indices... >::type\n-\u00a0 Template alias for the type of a child node given by a list of child\n- indices.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = typename impl::_ChildForTreePath<\n- Node, TreePath >::type\n-\u00a0 Template alias for the type of a child node given by a TreePath or a\n- _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh type.\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg = typename std::decay_t< Node >::NodeTag\n+\u00a0 Returns the node tag of the given Node.\n \u00a0\n template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx = typename impl::_is_flat_index< std::\n- decay_t< T > >::type\n-\u00a0 Type trait that determines whether T is a flat index in the context of\n- child extraction.\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg = typename std::decay_t< T >::\n+ ImplementationTag\n+\u00a0 Returns the implementation tag of the given Node.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be = decltype(Node::degree())\n+\u00a0 Returns the statically known degree of the given Node type as a std::\n+ integral_constant.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd (Node &&node, Indices... indices)\n-\u00a0 Extracts the child of a node given by a sequence of\n- compile-time and run-time indices.\n-\u00a0\n-template\n-ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node &&node, Indices...\n- indices)\n-\u00a0\n-template\n-ImplementationDefined\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd (Node &&node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh<\n- Indices... > _\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n-\u00a0 Extracts the child of a node given by a _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n- object.\n+template\n+std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be (const Node &node)\n+\u00a0 Returns the degree of node as run time information.\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00053_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00053_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: childextraction.hh Source File\n+dune-typetree: nodeinterface.hh Source File\n \n \n \n \n \n \n \n@@ -74,290 +74,100 @@\n \n
    \n \n
    \n
    \n
    \n-
    childextraction.hh
    \n+
    nodeinterface.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=8 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_CHILDEXTRACTION_HH
    \n-
    7#define DUNE_TYPETREE_CHILDEXTRACTION_HH
    \n+
    6#ifndef DUNE_TYPETREE_NODEINTERFACE_HH
    \n+
    7#define DUNE_TYPETREE_NODEINTERFACE_HH
    \n
    8
    \n-
    9#include <type_traits>
    \n-
    10#include <utility>
    \n+
    9#include <cstddef>
    \n+
    10#include <type_traits>
    \n
    11
    \n-
    12#include <dune/common/concept.hh>
    \n-
    13#include <dune/common/documentation.hh>
    \n-
    14#include <dune/common/typetraits.hh>
    \n-
    15#include <dune/common/shared_ptr.hh>
    \n+
    12#include <dune/common/documentation.hh>
    \n+
    13
    \n+
    14namespace Dune {
    \n+
    15 namespace TypeTree {
    \n
    16
    \n-\n-\n-
    19
    \n-
    20
    \n-
    21namespace Dune {
    \n-
    22 namespace TypeTree {
    \n-
    23
    \n-
    28
    \n-
    29#ifndef DOXYGEN
    \n-
    30
    \n-
    31 namespace Impl {
    \n-
    32
    \n-
    33 // check at run time whether index is a valid child index
    \n-
    34 template <class Node, class Index>
    \n-
    35 std::true_type checkChildIndex (Node const& node, Index i)
    \n-
    36 {
    \n-
    37 assert(std::size_t(i) < node.degree() && "Child index out of range");
    \n-
    38 return {};
    \n-
    39 }
    \n-
    40
    \n-
    41 // check at compile time whether index is a valid index
    \n-
    42 template <class Node, std::size_t i>
    \n-
    43 std::bool_constant<(i < Node::degree())> checkChildIndex (Node const& node, index_constant<i>)
    \n-
    44 {
    \n-
    45 static_assert(i < Node::degree(), "Child index out of range");
    \n-
    46 return {};
    \n-
    47 }
    \n-
    48
    \n-
    49 // finally return the node itself if no further indices are provided. Break condition
    \n-
    50 // for the recursion over the node childs.
    \n-
    51 template<class Node>
    \n-
    52 decltype(auto) childImpl (Node&& node)
    \n-
    53 {
    \n-
    54 return std::forward<Node>(node);
    \n-
    55 }
    \n-
    56
    \n-
    57 template<class NodePtr>
    \n-
    58 auto childStorageImpl (NodePtr&& nodePtr)
    \n-
    59 {
    \n-
    60 return std::forward<NodePtr>(nodePtr);
    \n-
    61 }
    \n+
    \n+\n+
    35 {
    \n+
    37 static const bool isLeaf = implementationDefined;
    \n+
    38
    \n+
    40 static const bool isPower = implementationDefined;
    \n+
    41
    \n+
    43 static const bool isComposite = implementationDefined;
    \n+
    44
    \n+
    46
    \n+
    51 static auto degree();
    \n+
    52
    \n+
    54
    \n+
    59 typedef ImplementationDefined NodeTag;
    \n+
    60
    \n
    62
    \n-
    63 // recursively call `node.child(...)` with the given indices
    \n-
    64 template<class Node, class I0, class... I>
    \n-
    65 decltype(auto) childImpl (Node&& node, I0 i0, [[maybe_unused]] I... i)
    \n-
    66 {
    \n-
    67 auto valid = checkChildIndex(node,i0);
    \n-
    68 if constexpr (valid)
    \n-
    69 return childImpl(node.child(i0),i...);
    \n-
    70 else
    \n-
    71 return;
    \n-
    72 }
    \n-
    73
    \n-
    74 // recursively call `node.childStorage(...)` with the given indices
    \n-
    75 template<class NodePtr, class I0, class... I>
    \n-
    76 decltype(auto) childStorageImpl (NodePtr&& nodePtr, I0 i0, [[maybe_unused]] I... i)
    \n-
    77 {
    \n-
    78 auto valid = checkChildIndex(*nodePtr,i0);
    \n-
    79 if constexpr (valid)
    \n-
    80 return childStorageImpl(nodePtr->childStorage(i0),i...);
    \n-
    81 else
    \n-
    82 return;
    \n-
    83 }
    \n-
    84
    \n-
    85 // forward to the impl methods by extracting the indices from the treepath
    \n-
    86 template<class Node, class... Indices, std::size_t... i>
    \n-
    87 decltype(auto) child (Node&& node, [[maybe_unused]] HybridTreePath<Indices...> tp, std::index_sequence<i...>)
    \n-
    88 {
    \n-
    89 return childImpl(std::forward<Node>(node),treePathEntry<i>(tp)...);
    \n-
    90 }
    \n-
    91
    \n-
    92 // forward to the impl methods by extracting the indices from the treepath
    \n-
    93 template<class NodePtr, class... Indices, std::size_t... i>
    \n-
    94 decltype(auto) childStorage (NodePtr&& nodePtr, [[maybe_unused]] HybridTreePath<Indices...> tp, std::index_sequence<i...>)
    \n-
    95 {
    \n-
    96 return childStorageImpl(std::forward<NodePtr>(nodePtr),treePathEntry<i>(tp)...);
    \n-
    97 }
    \n+
    65 typedef ImplementationDefined NodeStorage;
    \n+
    66 };
    \n+
    \n+
    67
    \n+
    69 template<typename Node>
    \n+
    70 using NodeTag = typename std::decay_t<Node>::NodeTag;
    \n+
    71
    \n+
    73 template<typename T>
    \n+
    74 using ImplementationTag = typename std::decay_t<T>::ImplementationTag;
    \n+
    75
    \n+
    76
    \n+
    78 template<typename Node>
    \n+
    \n+
    79 std::size_t degree(const Node& node)
    \n+
    80 {
    \n+
    81 return degree(&node,NodeTag<Node>());
    \n+
    82 }
    \n+
    \n+
    83
    \n+
    84#ifndef DOXYGEN
    \n+
    85
    \n+
    87
    \n+
    93 template<typename Node, typename NodeTag>
    \n+
    94 std::size_t degree(const Node* node, NodeTag)
    \n+
    95 {
    \n+
    96 return node->degree();
    \n+
    97 }
    \n
    98
    \n-
    99 } // end namespace Impl
    \n+
    99#endif // DOXYGEN
    \n
    100
    \n-
    101#endif // DOXYGEN
    \n
    102
    \n-
    104
    \n-
    126 template<typename Node, typename... Indices>
    \n-
    127#ifdef DOXYGEN
    \n-
    \n-
    128 ImplementationDefined child (Node&& node, Indices... indices)
    \n-
    129#else
    \n-
    130 decltype(auto) child (Node&& node, Indices... indices)
    \n-
    131#endif
    \n-
    132 {
    \n-
    133 return Impl::childImpl(std::forward<Node>(node),indices...);
    \n-
    134 }
    \n-
    \n-
    135
    \n-
    136 template<typename Node, typename... Indices>
    \n-
    137#ifdef DOXYGEN
    \n-
    \n-
    138 ImplementationDefined childStorage (Node&& node, Indices... indices)
    \n-
    139#else
    \n-
    140 auto childStorage (Node&& node, Indices... indices)
    \n-
    141#endif
    \n-
    142 {
    \n-
    143 static_assert(sizeof...(Indices) > 0, "childStorage() cannot be called with an empty list of child indices");
    \n-
    144 return Impl::childStorageImpl(&node,indices...);
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    148
    \n-
    171 template<typename Node, typename... Indices>
    \n-
    172#ifdef DOXYGEN
    \n-
    \n-
    173 ImplementationDefined child (Node&& node, HybridTreePath<Indices...> treePath)
    \n-
    174#else
    \n-
    175 decltype(auto) child (Node&& node, HybridTreePath<Indices...> tp)
    \n-
    176#endif
    \n-
    177 {
    \n-
    178 return Impl::child(std::forward<Node>(node),tp,std::index_sequence_for<Indices...>{});
    \n-
    179 }
    \n-
    \n-
    180
    \n-
    181 template<typename Node, typename... Indices>
    \n-
    182#ifdef DOXYGEN
    \n-
    183 ImplementationDefined child (Node&& node, HybridTreePath<Indices...> treePath)
    \n-
    184#else
    \n-
    185 auto childStorage (Node&& node, HybridTreePath<Indices...> tp)
    \n-
    186#endif
    \n-
    187 {
    \n-
    188 static_assert(sizeof...(Indices) > 0, "childStorage() cannot be called with an empty TreePath");
    \n-
    189 return Impl::childStorage(&node,tp,std::index_sequence_for<Indices...>{});
    \n-
    190 }
    \n-
    191
    \n-
    192
    \n-
    193#ifndef DOXYGEN
    \n-
    194
    \n-
    195 namespace impl {
    \n-
    196
    \n-
    197 template<typename T>
    \n-
    198 struct filter_void
    \n-
    199 {
    \n-
    200 using type = T;
    \n-
    201 };
    \n-
    202
    \n-
    203 template<>
    \n-
    204 struct filter_void<void>
    \n-
    205 {};
    \n-
    206
    \n-
    207 template<typename Node, std::size_t... indices>
    \n-
    208 struct _Child
    \n-
    209 : public filter_void<std::decay_t<decltype(child(std::declval<Node>(),index_constant<indices>{}...))>>
    \n-
    210 {};
    \n-
    211
    \n-
    212 }
    \n-
    213
    \n-
    214#endif // DOXYGEN
    \n-
    215
    \n-
    217
    \n-
    224 template<typename Node, std::size_t... indices>
    \n-
    225 using Child = typename impl::_Child<Node,indices...>::type;
    \n-
    226
    \n-
    227
    \n-
    228#ifndef DOXYGEN
    \n-
    229
    \n-
    230 namespace impl {
    \n-
    231
    \n-
    232 template<typename Node, typename TreePath>
    \n-
    233 struct _ChildForTreePath
    \n-
    234 {
    \n-
    235 using type = typename std::decay<decltype(child(std::declval<Node>(),std::declval<TreePath>()))>::type;
    \n-
    236 };
    \n-
    237
    \n-
    238 }
    \n-
    239
    \n-
    240#endif // DOXYGEN
    \n-
    241
    \n-
    243
    \n-
    251 template<typename Node, typename TreePath>
    \n-
    252 using ChildForTreePath = typename impl::_ChildForTreePath<Node,TreePath>::type;
    \n-
    253
    \n-
    254
    \n-
    255#ifndef DOXYGEN
    \n-
    256
    \n-
    257 namespace impl {
    \n-
    258
    \n-
    259 // By default, types are flat indices if they are integral
    \n-
    260 template<typename T>
    \n-
    261 struct _is_flat_index
    \n-
    262 {
    \n-
    263 using type = std::is_integral<T>;
    \n-
    264 };
    \n-
    265
    \n-
    266 // And so is any index_constant
    \n-
    267 template<std::size_t i>
    \n-
    268 struct _is_flat_index<index_constant<i>>
    \n-
    269 {
    \n-
    270 using type = std::true_type;
    \n-
    271 };
    \n-
    272
    \n-
    273 }
    \n-
    274
    \n-
    275#endif // DOXYGEN
    \n-
    276
    \n-
    278 /*
    \n-
    279 * This type trait can be used to check whether T is a flat index (i.e. either `std::size_t`
    \n-
    280 * or `index_constant`). The type trait normalizes T before doing the check, so it will also
    \n-
    281 * work correctly for references and cv-qualified types.
    \n-
    282 */
    \n-
    283 template<typename T>
    \n-
    284 using is_flat_index = typename impl::_is_flat_index<std::decay_t<T>>::type;
    \n-
    285
    \n-
    286#ifndef DOXYGEN
    \n-
    287
    \n-
    288 namespace impl {
    \n-
    289
    \n-
    290 // helper function for check in member child() functions that tolerates being passed something that
    \n-
    291 // isn't a TreePath. It will just return 0 in that case
    \n-
    292
    \n-
    293 template<typename T>
    \n-
    294 constexpr typename std::enable_if<
    \n-\n-
    296 bool
    \n-
    297 >::type
    \n-
    298 _non_empty_tree_path (T)
    \n-
    299 {
    \n-
    300 return false;
    \n-
    301 }
    \n-
    302
    \n-
    303 template<typename T>
    \n-
    304 constexpr typename std::enable_if<
    \n-\n-
    306 bool
    \n-
    307 >::type
    \n-
    308 _non_empty_tree_path (T t)
    \n-
    309 {
    \n-
    310 return treePathSize(t) > 0;
    \n-
    311 }
    \n-
    312
    \n-
    313 }
    \n-
    314
    \n-
    315#endif // DOXYGEN
    \n-
    316
    \n-
    318
    \n-
    319 } // namespace TypeTree
    \n-
    320} //namespace Dune
    \n-
    321
    \n-
    322#endif // DUNE_TYPETREE_CHILDEXTRACTION_HH
    \n-\n-\n-
    typename impl::_is_flat_index< std::decay_t< T > >::type is_flat_index
    Type trait that determines whether T is a flat index in the context of child extraction.
    Definition childextraction.hh:284
    \n-
    ImplementationDefined childStorage(Node &&node, Indices... indices)
    Definition childextraction.hh:138
    \n-
    typename impl::_Child< Node, indices... >::type Child
    Template alias for the type of a child node given by a list of child indices.
    Definition childextraction.hh:225
    \n-
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n-
    typename impl::_ChildForTreePath< Node, TreePath >::type ChildForTreePath
    Template alias for the type of a child node given by a TreePath or a HybridTreePath type.
    Definition childextraction.hh:252
    \n-
    constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
    Returns the size (number of components) of the given HybridTreePath.
    Definition treepath.hh:334
    \n-
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n+
    106 template<typename Node>
    \n+
    107 using StaticDegree = decltype(Node::degree());
    \n+
    108
    \n+
    110
    \n+
    111 } // namespace TypeTree
    \n+
    112} //namespace Dune
    \n+
    113
    \n+
    114#endif // DUNE_TYPETREE_NODEINTERFACE_HH
    \n+
    std::size_t degree(const Node &node)
    Returns the degree of node as run time information.
    Definition nodeinterface.hh:79
    \n+
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n+
    typename std::decay_t< T >::ImplementationTag ImplementationTag
    Returns the implementation tag of the given Node.
    Definition nodeinterface.hh:74
    \n+
    decltype(Node::degree()) StaticDegree
    Returns the statically known degree of the given Node type as a std::integral_constant.
    Definition nodeinterface.hh:107
    \n
    Definition accumulate_static.hh:16
    \n-
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n+
    Interface for nodes in a dune-typetree.
    Definition nodeinterface.hh:35
    \n+
    static auto degree()
    Number of children of this node in the dune-typetree.
    \n+
    static const bool isPower
    Whether this is a power node in the dune-typetree.
    Definition nodeinterface.hh:40
    \n+
    static const bool isLeaf
    Whether this is a leaf node in a dune-typetree.
    Definition nodeinterface.hh:37
    \n+
    ImplementationDefined NodeStorage
    container type to pass around a collection of children
    Definition nodeinterface.hh:65
    \n+
    static const bool isComposite
    Whether this is a composite node in the dune-typetree.
    Definition nodeinterface.hh:43
    \n+
    ImplementationDefined NodeTag
    The type tag that describes what kind of node this is.
    Definition nodeinterface.hh:59
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,323 +1,124 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-childextraction.hh\n+nodeinterface.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=8 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_CHILDEXTRACTION_HH\n-7#define DUNE_TYPETREE_CHILDEXTRACTION_HH\n+6#ifndef DUNE_TYPETREE_NODEINTERFACE_HH\n+7#define DUNE_TYPETREE_NODEINTERFACE_HH\n 8\n-9#include \n-10#include \n+9#include \n+10#include \n 11\n-12#include \n-13#include \n-14#include \n-15#include \n+12#include \n+13\n+14namespace _\bD_\bu_\bn_\be {\n+15 namespace TypeTree {\n 16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-19\n-20\n-21namespace _\bD_\bu_\bn_\be {\n-22 namespace TypeTree {\n-23\n-28\n-29#ifndef DOXYGEN\n-30\n-31 namespace Impl {\n-32\n-33 // check at run time whether index is a valid child index\n-34 template \n-35 std::true_type checkChildIndex (Node const& node, Index i)\n-36 {\n-37 assert(std::size_t(i) < node.degree() && \"Child index out of range\");\n-38 return {};\n-39 }\n-40\n-41 // check at compile time whether index is a valid index\n-42 template \n-43 std::bool_constant<(i < Node::degree())> checkChildIndex (Node const& node,\n-index_constant)\n-44 {\n-45 static_assert(i < Node::degree(), \"Child index out of range\");\n-46 return {};\n-47 }\n-48\n-49 // finally return the node itself if no further indices are provided. Break\n-condition\n-50 // for the recursion over the node childs.\n-51 template\n-52 decltype(auto) childImpl (Node&& node)\n-53 {\n-54 return std::forward(node);\n-55 }\n-56\n-57 template\n-58 auto childStorageImpl (NodePtr&& nodePtr)\n-59 {\n-60 return std::forward(nodePtr);\n-61 }\n+_\b3_\b4 struct _\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+35 {\n+_\b3_\b7 static const bool _\bi_\bs_\bL_\be_\ba_\bf = implementationDefined;\n+38\n+_\b4_\b0 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = implementationDefined;\n+41\n+_\b4_\b3 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = implementationDefined;\n+44\n+46\n+_\b5_\b1 static auto _\bd_\be_\bg_\br_\be_\be();\n+52\n+54\n+_\b5_\b9 typedef ImplementationDefined _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+60\n 62\n-63 // recursively call `node.child(...)` with the given indices\n-64 template\n-65 decltype(auto) childImpl (Node&& node, I0 i0, [[maybe_unused]] I... i)\n-66 {\n-67 auto valid = checkChildIndex(node,i0);\n-68 if constexpr (valid)\n-69 return childImpl(node.child(i0),i...);\n-70 else\n-71 return;\n-72 }\n-73\n-74 // recursively call `node.childStorage(...)` with the given indices\n-75 template\n-76 decltype(auto) childStorageImpl (NodePtr&& nodePtr, I0 i0, [[maybe_unused]]\n-I... i)\n-77 {\n-78 auto valid = checkChildIndex(*nodePtr,i0);\n-79 if constexpr (valid)\n-80 return childStorageImpl(nodePtr->childStorage(i0),i...);\n-81 else\n-82 return;\n-83 }\n-84\n-85 // forward to the impl methods by extracting the indices from the treepath\n-86 template\n-87 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, [[maybe_unused]]\n-HybridTreePath tp, std::index_sequence)\n-88 {\n-89 return childImpl(std::forward(node),treePathEntry(tp)...);\n-90 }\n-91\n-92 // forward to the impl methods by extracting the indices from the treepath\n-93 template\n-94 decltype(auto) _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (NodePtr&& nodePtr, [[maybe_unused]]\n-HybridTreePath tp, std::index_sequence)\n+_\b6_\b5 typedef ImplementationDefined _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+66 };\n+67\n+69 template\n+_\b7_\b0 using _\bN_\bo_\bd_\be_\bT_\ba_\bg = typename std::decay_t::NodeTag;\n+71\n+73 template\n+_\b7_\b4 using _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg = typename std::decay_t::ImplementationTag;\n+75\n+76\n+78 template\n+_\b7_\b9 std::size_t _\bd_\be_\bg_\br_\be_\be(const Node& node)\n+80 {\n+81 return _\bd_\be_\bg_\br_\be_\be(&node,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bN_\bo_\bd_\be_\b>());\n+82 }\n+83\n+84#ifndef DOXYGEN\n+85\n+87\n+93 template\n+94 std::size_t _\bd_\be_\bg_\br_\be_\be(const Node* node, _\bN_\bo_\bd_\be_\bT_\ba_\bg)\n 95 {\n-96 return childStorageImpl(std::forward(nodePtr),treePathEntry\n-(tp)...);\n+96 return node->degree();\n 97 }\n 98\n-99 } // end namespace Impl\n+99#endif // DOXYGEN\n 100\n-101#endif // DOXYGEN\n 102\n-104\n-126 template\n-127#ifdef DOXYGEN\n-_\b1_\b2_\b8 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, Indices... indices)\n-129#else\n-130 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, Indices... indices)\n-131#endif\n-132 {\n-133 return Impl::childImpl(std::forward(node),indices...);\n-134 }\n-135\n-136 template\n-137#ifdef DOXYGEN\n-_\b1_\b3_\b8 ImplementationDefined _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, Indices... indices)\n-139#else\n-140 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, Indices... indices)\n-141#endif\n-142 {\n-143 static_assert(sizeof...(Indices) > 0, \"childStorage() cannot be called with\n-an empty list of child indices\");\n-144 return Impl::childStorageImpl(&node,indices...);\n-145 }\n-146\n-148\n-171 template\n-172#ifdef DOXYGEN\n-_\b1_\b7_\b3 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b._\b._\b._\b>\n-_\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n-174#else\n-175 decltype(auto) _\bc_\bh_\bi_\bl_\bd (Node&& node, _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b._\b._\b._\b> tp)\n-176#endif\n-177 {\n-178 return Impl::child(std::forward(node),tp,std::\n-index_sequence_for{});\n-179 }\n-180\n-181 template\n-182#ifdef DOXYGEN\n-183 ImplementationDefined _\bc_\bh_\bi_\bl_\bd (Node&& node, HybridTreePath\n-_\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n-184#else\n-185 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (Node&& node, HybridTreePath tp)\n-186#endif\n-187 {\n-188 static_assert(sizeof...(Indices) > 0, \"childStorage() cannot be called with\n-an empty TreePath\");\n-189 return Impl::childStorage(&node,tp,std::index_sequence_for{});\n-190 }\n-191\n-192\n-193#ifndef DOXYGEN\n-194\n-195 namespace impl {\n-196\n-197 template\n-198 struct filter_void\n-199 {\n-200 using type = T;\n-201 };\n-202\n-203 template<>\n-204 struct filter_void\n-205 {};\n-206\n-207 template\n-208 struct _Child\n-209 : public filter_void\n-(),index_constant{}...))>>\n-210 {};\n-211\n-212 }\n-213\n-214#endif // DOXYGEN\n-215\n-217\n-224 template\n-_\b2_\b2_\b5 using _\bC_\bh_\bi_\bl_\bd = typename impl::_Child::type;\n-226\n-227\n-228#ifndef DOXYGEN\n-229\n-230 namespace impl {\n-231\n-232 template\n-233 struct _ChildForTreePath\n-234 {\n-235 using type = typename std::decay(),std::\n-declval()))>::type;\n-236 };\n-237\n-238 }\n-239\n-240#endif // DOXYGEN\n-241\n-243\n-251 template\n-_\b2_\b5_\b2 using _\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh = typename impl::_ChildForTreePath::\n-type;\n-253\n-254\n-255#ifndef DOXYGEN\n-256\n-257 namespace impl {\n-258\n-259 // By default, types are flat indices if they are integral\n-260 template\n-261 struct _is_flat_index\n-262 {\n-263 using type = std::is_integral;\n-264 };\n-265\n-266 // And so is any index_constant\n-267 template\n-268 struct _is_flat_index>\n-269 {\n-270 using type = std::true_type;\n-271 };\n-272\n-273 }\n-274\n-275#endif // DOXYGEN\n-276\n-278 /*\n-279 * This type trait can be used to check whether T is a flat index (i.e.\n-either `std::size_t`\n-280 * or `index_constant`). The type trait normalizes T before doing the check,\n-so it will also\n-281 * work correctly for references and cv-qualified types.\n-282 */\n-283 template\n-_\b2_\b8_\b4 using _\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx = typename impl::_is_flat_index>::type;\n-285\n-286#ifndef DOXYGEN\n-287\n-288 namespace impl {\n-289\n-290 // helper function for check in member child() functions that tolerates\n-being passed something that\n-291 // isn't a TreePath. It will just return 0 in that case\n-292\n-293 template\n-294 constexpr typename std::enable_if<\n-295 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,\n-296 bool\n-297 >::type\n-298 _non_empty_tree_path (T)\n-299 {\n-300 return false;\n-301 }\n-302\n-303 template\n-304 constexpr typename std::enable_if<\n-305 !_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,\n-306 bool\n-307 >::type\n-308 _non_empty_tree_path (T t)\n-309 {\n-310 return _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be(t) > 0;\n-311 }\n-312\n-313 }\n-314\n-315#endif // DOXYGEN\n-316\n-318\n-319 } // namespace TypeTree\n-320} //namespace Dune\n-321\n-322#endif // DUNE_TYPETREE_CHILDEXTRACTION_HH\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bi_\bs_\b__\bf_\bl_\ba_\bt_\b__\bi_\bn_\bd_\be_\bx\n-typename impl::_is_flat_index< std::decay_t< T > >::type is_flat_index\n-Type trait that determines whether T is a flat index in the context of child\n-extraction.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-ImplementationDefined childStorage(Node &&node, Indices... indices)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n-typename impl::_Child< Node, indices... >::type Child\n-Template alias for the type of a child node given by a list of child indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ImplementationDefined child(Node &&node, Indices... indices)\n-Extracts the child of a node given by a sequence of compile-time and run-time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bF_\bo_\br_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-typename impl::_ChildForTreePath< Node, TreePath >::type ChildForTreePath\n-Template alias for the type of a child node given by a TreePath or a\n-HybridTreePath type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:252\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bS_\bi_\bz_\be\n-constexpr std::size_t treePathSize(const HybridTreePath< T... > &)\n-Returns the size (number of components) of the given HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto treePath(const T &... t)\n-Constructs a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n+106 template\n+_\b1_\b0_\b7 using _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be = decltype(Node::degree());\n+108\n+110\n+111 } // namespace TypeTree\n+112} //namespace Dune\n+113\n+114#endif // DUNE_TYPETREE_NODEINTERFACE_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+std::size_t degree(const Node &node)\n+Returns the degree of node as run time information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+typename std::decay_t< Node >::NodeTag NodeTag\n+Returns the node tag of the given Node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+typename std::decay_t< T >::ImplementationTag ImplementationTag\n+Returns the implementation tag of the given Node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be\n+decltype(Node::degree()) StaticDegree\n+Returns the statically known degree of the given Node type as a std::\n+integral_constant.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:107\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-A hybrid version of TreePath that supports both compile time and run time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+Interface for nodes in a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static auto degree()\n+Number of children of this node in the dune-typetree.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Whether this is a power node in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+static const bool isLeaf\n+Whether this is a leaf node in a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+ImplementationDefined NodeStorage\n+container type to pass around a collection of children\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Whether this is a composite node in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+ImplementationDefined NodeTag\n+The type tag that describes what kind of node this is.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:59\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00056.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00056.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: nodetags.hh File Reference\n+dune-typetree: generictransformationdescriptors.hh File Reference\n \n \n \n \n \n \n \n@@ -72,33 +72,47 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    nodetags.hh File Reference
    \n+
    generictransformationdescriptors.hh File Reference
    \n
    \n
    \n-\n+
    #include <array>
    \n+#include <memory>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/powercompositenodetransformationtemplates.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n

    \n Classes

    struct  Dune::TypeTree::LeafNodeTag
     Tag designating a leaf node. More...
    struct  Dune::TypeTree::GenericLeafNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::GenericPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::PowerNodeTag
     Tag designating a power node. More...
    struct  Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::DynamicPowerNodeTag
     Tag designating a power node with runtime degree. More...
    struct  Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::CompositeNodeTag
     Tag designating a composite node. More...
    struct  Dune::TypeTree::GenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,52 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-nodetags.hh File Reference\n+generictransformationdescriptors.hh File Reference\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-\u00a0 Tag designating a leaf node. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-\u00a0 Tag designating a power node. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-\u00a0 Tag designating a power node with runtime degree. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-\u00a0 Tag designating a composite node. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n+ _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00056_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00056_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: nodetags.hh Source File\n+dune-typetree: generictransformationdescriptors.hh Source File\n \n \n \n \n \n \n \n@@ -74,54 +74,288 @@\n \n
    \n \n
    \n \n
    \n-
    nodetags.hh
    \n+
    generictransformationdescriptors.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_NODETAGS_HH
    \n-
    7#define DUNE_TYPETREE_NODETAGS_HH
    \n+
    6#ifndef DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n+
    7#define DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n
    8
    \n-
    9namespace Dune {
    \n-
    10 namespace TypeTree {
    \n+
    9#include <array>
    \n+
    10#include <memory>
    \n
    11
    \n-
    18 struct LeafNodeTag {};
    \n-
    19
    \n-
    21 struct PowerNodeTag {};
    \n-
    22
    \n-\n-
    25
    \n-\n-
    28
    \n-
    29#ifndef DOXYGEN
    \n-
    30
    \n-
    32 struct StartTag {};
    \n-
    33
    \n+\n+\n+\n+
    15#include <dune/common/exceptions.hh>
    \n+
    16
    \n+
    17
    \n+
    18namespace Dune {
    \n+
    19 namespace TypeTree {
    \n+
    20
    \n+
    26 template<typename SourceNode, typename Transformation, typename TransformedNode>
    \n+
    \n+\n+
    28 {
    \n+
    29
    \n+
    30 static const bool recursive = false;
    \n+
    31
    \n+
    32 typedef TransformedNode transformed_type;
    \n+
    33 typedef std::shared_ptr<transformed_type> transformed_storage_type;
    \n
    34
    \n-
    35
    \n-
    36#endif // DOXYGEN
    \n-
    37
    \n+
    \n+
    35 static transformed_type transform(const SourceNode& s, const Transformation& t)
    \n+
    36 {
    \n+
    37 return transformed_type(s,t);
    \n+
    38 }
    \n+
    \n
    39
    \n-
    40 } // namespace TypeTree
    \n-
    41} //namespace Dune
    \n-
    42
    \n-
    43#endif // DUNE_TYPETREE_NODETAGS_HH
    \n+
    \n+
    40 static transformed_type transform(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n+
    41 {
    \n+
    42 return transformed_type(s,t);
    \n+
    43 }
    \n+
    \n+
    44
    \n+
    \n+
    45 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n+
    46 {
    \n+
    47 return std::make_shared<transformed_type>(s,t);
    \n+
    48 }
    \n+
    \n+
    49
    \n+
    50 };
    \n+
    \n+
    51
    \n+
    52
    \n+
    53 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNodeTemplate>
    \n+
    \n+\n+
    55 {
    \n+
    56
    \n+
    57 static const bool recursive = true;
    \n+
    58
    \n+
    59 template<typename TC>
    \n+
    \n+
    60 struct result
    \n+
    61 {
    \n+
    62 typedef typename TransformedNodeTemplate<TC>::type type;
    \n+
    63 typedef std::shared_ptr<type> storage_type;
    \n+
    64 static const std::size_t degree = StaticDegree<type>::value;
    \n+
    65 };
    \n+
    \n+
    66
    \n+
    67 template<typename TC>
    \n+
    \n+
    68 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n+
    69 {
    \n+
    70 return typename result<TC>::type(s,t,children);
    \n+
    71 }
    \n+
    \n+
    72
    \n+
    73 template<typename TC>
    \n+
    \n+
    74 static typename result<TC>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n+
    75 {
    \n+
    76 return typename result<TC>::type(s,t,children);
    \n+
    77 }
    \n+
    \n+
    78
    \n+
    79 template<typename TC>
    \n+
    \n+
    80 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n+
    81 {
    \n+
    82 return std::make_shared<typename result<TC>::type>(s,t,children);
    \n+
    83 }
    \n+
    \n+
    84
    \n+
    85 };
    \n+
    \n+
    86
    \n+
    87
    \n+
    88 template<typename SourceNode, typename Transformation, template<typename,typename,std::size_t> class TransformedNode>
    \n+
    \n+\n+\n+
    91 Transformation,
    \n+
    92 GenericPowerNodeTransformationTemplate<SourceNode,
    \n+
    93 Transformation,
    \n+
    94 TransformedNode>::template result
    \n+
    95 >
    \n+
    96 {};
    \n+
    \n+
    97
    \n+
    98
    \n+
    99 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNodeTemplate>
    \n+
    \n+\n+
    101 {
    \n+
    102
    \n+
    103 static const bool recursive = true;
    \n+
    104
    \n+
    105 template<typename TC>
    \n+
    \n+
    106 struct result
    \n+
    107 {
    \n+
    108 typedef typename TransformedNodeTemplate<TC>::type type;
    \n+
    109 typedef std::shared_ptr<type> storage_type;
    \n+
    110 };
    \n+
    \n+
    111
    \n+
    112 template<typename TC>
    \n+
    \n+
    113 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n+
    114 {
    \n+
    115 return typename result<TC>::type(s,t,children);
    \n+
    116 }
    \n+
    \n+
    117
    \n+
    118 template<typename TC>
    \n+
    \n+
    119 static typename result<TC>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n+
    120 {
    \n+
    121 return typename result<TC>::type(s,t,children);
    \n+
    122 }
    \n+
    \n+
    123
    \n+
    124 template<typename TC>
    \n+
    \n+
    125 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n+
    126 {
    \n+
    127 return std::make_shared<typename result<TC>::type>(s,t,children);
    \n+
    128 }
    \n+
    \n+
    129
    \n+
    130 };
    \n+
    \n+
    131
    \n+
    132
    \n+
    133 template<typename SourceNode, typename Transformation, template<typename,typename> class TransformedNode>
    \n+
    \n+\n+\n+
    136 Transformation,
    \n+
    137 GenericDynamicPowerNodeTransformationTemplate<SourceNode,
    \n+
    138 Transformation,
    \n+
    139 TransformedNode>::template result
    \n+
    140 >
    \n+
    141 {};
    \n+
    \n+
    142
    \n+
    143
    \n+
    144 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNodeTemplate>
    \n+
    \n+\n+
    146 {
    \n+
    147
    \n+
    148 static const bool recursive = true;
    \n+
    149
    \n+
    150 template<typename... TC>
    \n+
    \n+
    151 struct result
    \n+
    152 {
    \n+
    153 typedef typename TransformedNodeTemplate<TC...>::type type;
    \n+
    154 typedef std::shared_ptr<type> storage_type;
    \n+
    155 };
    \n+
    \n+
    156
    \n+
    157 template<typename... TC>
    \n+
    \n+
    158 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
    \n+
    159 {
    \n+
    160 return typename result<TC...>::type(s,t,children...);
    \n+
    161 }
    \n+
    \n+
    162
    \n+
    163 template<typename... TC>
    \n+
    \n+
    164 static typename result<TC...>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n+
    165 {
    \n+
    166 return typename result<TC...>::type(s,t,children...);
    \n+
    167 }
    \n+
    \n+
    168
    \n+
    169 template<typename... TC>
    \n+
    \n+
    170 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n+
    171 {
    \n+
    172 return std::make_shared<typename result<TC...>::type>(s,t,children...);
    \n+
    173 }
    \n+
    \n+
    174
    \n+
    175 };
    \n+
    \n+
    176
    \n+
    177
    \n+
    178 template<typename SourceNode, typename Transformation, template<typename,typename...> class TransformedNode>
    \n+
    \n+\n+\n+
    181 Transformation,
    \n+
    182 GenericCompositeNodeTransformationTemplate<SourceNode,
    \n+
    183 Transformation,
    \n+
    184 TransformedNode>::template result
    \n+
    185 >
    \n+
    186 {};
    \n+
    \n+
    187
    \n+
    189
    \n+
    190 } // namespace TypeTree
    \n+
    191} //namespace Dune
    \n+
    192
    \n+
    193#endif // DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n+\n+\n+\n+
    decltype(Node::degree()) StaticDegree
    Returns the statically known degree of the given Node type as a std::integral_constant.
    Definition nodeinterface.hh:107
    \n
    Definition accumulate_static.hh:16
    \n-
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n-
    Tag designating a power node.
    Definition nodetags.hh:21
    \n-
    Tag designating a power node with runtime degree.
    Definition nodetags.hh:24
    \n-
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n+
    Definition generictransformationdescriptors.hh:28
    \n+
    TransformedNode transformed_type
    Definition generictransformationdescriptors.hh:32
    \n+
    std::shared_ptr< transformed_type > transformed_storage_type
    Definition generictransformationdescriptors.hh:33
    \n+
    static transformed_type transform(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition generictransformationdescriptors.hh:40
    \n+
    static const bool recursive
    Definition generictransformationdescriptors.hh:30
    \n+
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition generictransformationdescriptors.hh:45
    \n+
    static transformed_type transform(const SourceNode &s, const Transformation &t)
    Definition generictransformationdescriptors.hh:35
    \n+
    Definition generictransformationdescriptors.hh:55
    \n+
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:80
    \n+
    static const bool recursive
    Definition generictransformationdescriptors.hh:57
    \n+
    static result< TC >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:74
    \n+
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:68
    \n+
    Definition generictransformationdescriptors.hh:61
    \n+
    TransformedNodeTemplate< TC >::type type
    Definition generictransformationdescriptors.hh:62
    \n+
    static const std::size_t degree
    Definition generictransformationdescriptors.hh:64
    \n+
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:63
    \n+
    Definition generictransformationdescriptors.hh:96
    \n+
    Definition generictransformationdescriptors.hh:101
    \n+
    static result< TC >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:119
    \n+
    static const bool recursive
    Definition generictransformationdescriptors.hh:103
    \n+
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:113
    \n+
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:125
    \n+
    Definition generictransformationdescriptors.hh:107
    \n+
    TransformedNodeTemplate< TC >::type type
    Definition generictransformationdescriptors.hh:108
    \n+
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:109
    \n+
    Definition generictransformationdescriptors.hh:141
    \n+
    Definition generictransformationdescriptors.hh:146
    \n+
    static result< TC... >::type transform(const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:158
    \n+
    static result< TC... >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:170
    \n+
    static result< TC... >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:164
    \n+
    static const bool recursive
    Definition generictransformationdescriptors.hh:148
    \n+
    Definition generictransformationdescriptors.hh:152
    \n+
    TransformedNodeTemplate< TC... >::type type
    Definition generictransformationdescriptors.hh:153
    \n+
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:154
    \n+
    Definition generictransformationdescriptors.hh:186
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,58 +1,347 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-nodetags.hh\n+generictransformationdescriptors.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_NODETAGS_HH\n-7#define DUNE_TYPETREE_NODETAGS_HH\n+6#ifndef DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n+7#define DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n 8\n-9namespace _\bD_\bu_\bn_\be {\n-10 namespace TypeTree {\n+9#include \n+10#include \n 11\n-_\b1_\b8 struct _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n-19\n-_\b2_\b1 struct _\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n-22\n-_\b2_\b4 struct _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n-25\n-_\b2_\b7 struct _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg {};\n-28\n-29#ifndef DOXYGEN\n-30\n-32 struct StartTag {};\n-33\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+15#include \n+16\n+17\n+18namespace _\bD_\bu_\bn_\be {\n+19 namespace TypeTree {\n+20\n+26 template\n+_\b2_\b7 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+28 {\n+29\n+_\b3_\b0 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = false;\n+31\n+_\b3_\b2 typedef TransformedNode _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b3 typedef std::shared_ptr _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n 34\n-35\n-36#endif // DOXYGEN\n-37\n+_\b3_\b5 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const Transformation&\n+t)\n+36 {\n+37 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be(s,t);\n+38 }\n 39\n-40 } // namespace TypeTree\n-41} //namespace Dune\n-42\n-43#endif // DUNE_TYPETREE_NODETAGS_HH\n+_\b4_\b0 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const\n+Transformation& t)\n+41 {\n+42 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be(s,t);\n+43 }\n+44\n+_\b4_\b5 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr s, const Transformation& t)\n+46 {\n+47 return std::make_shared(s,t);\n+48 }\n+49\n+50 };\n+51\n+52\n+53 template class TransformedNodeTemplate>\n+_\b5_\b4 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+55 {\n+56\n+_\b5_\b7 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+58\n+59 template\n+_\b6_\b0 struct _\br_\be_\bs_\bu_\bl_\bt\n+61 {\n+_\b6_\b2 typedef typename TransformedNodeTemplate::type _\bt_\by_\bp_\be;\n+_\b6_\b3 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b4 static const std::size_t _\bd_\be_\bg_\br_\be_\be = _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be_\b<_\bt_\by_\bp_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n+65 };\n+66\n+67 template\n+_\b6_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>&\n+children)\n+69 {\n+70 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n+71 }\n+72\n+73 template\n+_\b7_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr\n+s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:\n+_\bd_\be_\bg_\br_\be_\be>& children)\n+75 {\n+76 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n+77 }\n+78\n+79 template\n+_\b8_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>& children)\n+81 {\n+82 return std::make_shared::type>(s,t,children);\n+83 }\n+84\n+85 };\n+86\n+87\n+88 template class TransformedNode>\n+_\b8_\b9 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+90 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n+95 >\n+96 {};\n+97\n+98\n+99 template class TransformedNodeTemplate>\n+_\b1_\b0_\b0 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+101 {\n+102\n+_\b1_\b0_\b3 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+104\n+105 template\n+_\b1_\b0_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n+107 {\n+_\b1_\b0_\b8 typedef typename TransformedNodeTemplate::type _\bt_\by_\bp_\be;\n+_\b1_\b0_\b9 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+110 };\n+111\n+112 template\n+_\b1_\b1_\b3 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, const std::vector>& children)\n+114 {\n+115 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n+116 }\n+117\n+118 template\n+_\b1_\b1_\b9 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const Transformation& t, const std::vector>&\n+children)\n+120 {\n+121 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n+122 }\n+123\n+124 template\n+_\b1_\b2_\b5 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, const std::\n+vector>& children)\n+126 {\n+127 return std::make_shared::type>(s,t,children);\n+128 }\n+129\n+130 };\n+131\n+132\n+133 template class TransformedNode>\n+_\b1_\b3_\b4 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+135 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n+140 >\n+141 {};\n+142\n+143\n+144 template class TransformedNodeTemplate>\n+_\b1_\b4_\b5 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+146 {\n+147\n+_\b1_\b4_\b8 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+149\n+150 template\n+_\b1_\b5_\b1 struct _\br_\be_\bs_\bu_\bl_\bt\n+152 {\n+_\b1_\b5_\b3 typedef typename TransformedNodeTemplate_\b:_\b:_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n+_\b1_\b5_\b4 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+155 };\n+156\n+157 template\n+_\b1_\b5_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n+Transformation& t, std::shared_ptr... children)\n+159 {\n+160 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children...);\n+161 }\n+162\n+163 template\n+_\b1_\b6_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const Transformation& t, std::shared_ptr... children)\n+165 {\n+166 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children...);\n+167 }\n+168\n+169 template\n+_\b1_\b7_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt::storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n+shared_ptr s, const Transformation& t, std::shared_ptr...\n+children)\n+171 {\n+172 return std::make_shared::type>(s,t,children...);\n+173 }\n+174\n+175 };\n+176\n+177\n+178 template class TransformedNode>\n+_\b1_\b7_\b9 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+180 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n+185 >\n+186 {};\n+187\n+189\n+190 } // namespace TypeTree\n+191} //namespace Dune\n+192\n+193#endif // DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n+_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be\n+decltype(Node::degree()) StaticDegree\n+Returns the statically known degree of the given Node type as a std::\n+integral_constant.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:107\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a leaf node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:21\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node with runtime degree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a composite node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be\n+TransformedNode transformed_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< transformed_type > transformed_storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(std::shared_ptr< const SourceNode > s, const\n+Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static transformed_storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(const SourceNode &s, const Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC\n+>, result< TC >::degree > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(std::shared_ptr< const SourceNode > s,\n+const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC\n+>::degree > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(const SourceNode &s, const Transformation\n+&t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNodeTemplate< TC >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static const std::size_t degree\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(std::shared_ptr< const SourceNode > s,\n+const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC >::type transform(const SourceNode &s, const Transformation\n+&t, const std::vector< std::shared_ptr< TC > > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:\n+_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC\n+> > &children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNodeTemplate< TC >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:\n+_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:109\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC... >::type transform(const SourceNode &s, const\n+Transformation &t, std::shared_ptr< TC >... children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:\n+_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static result< TC... >::storage_type transform_storage(std::shared_ptr< const\n+SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static result< TC... >::type transform(std::shared_ptr< const SourceNode > s,\n+const Transformation &t, std::shared_ptr< TC >... children)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n+static const bool recursive\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n+TransformedNodeTemplate< TC... >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:\n+_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n+std::shared_ptr< type > storage_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:186\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00059.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00059.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: typetree.hh File Reference\n+dune-typetree: compositenode.hh File Reference\n \n \n \n \n \n \n \n@@ -69,32 +69,45 @@\n \n
    \n \n
    \n \n
    \n-
    typetree.hh File Reference
    \n+ \n+
    compositenode.hh File Reference
    \n
    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::TypeTree::CompositeNode< Children >
     Base class for composite nodes based on variadic templates. More...
     
    struct  Dune::TypeTree::CompositeNode< Children >::Child< k >
     Access to the type and storage type of the i-th child. More...
     
    \n+\n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,29 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-typetree.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+compositenode.hh File Reference\n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n+\u00a0 Base class for composite nodes based on variadic templates. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n+\u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00059_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00059_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: typetree.hh Source File\n+dune-typetree: compositenode.hh Source File\n \n \n \n \n \n \n \n@@ -74,53 +74,268 @@\n \n
    \n \n
    \n \n
    \n-
    typetree.hh
    \n+
    compositenode.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_HH
    \n-
    7#define DUNE_TYPETREE_HH
    \n+
    6#ifndef DUNE_TYPETREE_COMPOSITENODE_HH
    \n+
    7#define DUNE_TYPETREE_COMPOSITENODE_HH
    \n
    8
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    22
    \n-
    23#endif // DUNE_TYPETREE_HH
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+
    9#include <tuple>
    \n+
    10#include <memory>
    \n+
    11#include <type_traits>
    \n+
    12
    \n+\n+\n+\n+
    16
    \n+
    17namespace Dune {
    \n+
    18 namespace TypeTree {
    \n+
    19
    \n+
    26 template<typename... Children>
    \n+
    \n+\n+
    28 {
    \n+
    29
    \n+
    30 public:
    \n+
    31
    \n+\n+
    34
    \n+
    36 typedef std::tuple<std::shared_ptr<Children>... > NodeStorage;
    \n+
    37
    \n+
    39 typedef std::tuple<Children...> ChildTypes;
    \n+
    40
    \n+
    42 static const bool isLeaf = false;
    \n+
    43
    \n+
    45 static const bool isPower = false;
    \n+
    46
    \n+
    48 static const bool isComposite = true;
    \n+
    49
    \n+
    \n+
    50 static constexpr auto degree ()
    \n+
    51 {
    \n+
    52 return std::integral_constant<std::size_t,sizeof...(Children)>{};
    \n+
    53 }
    \n+
    \n+
    54
    \n+
    56 template<std::size_t k>
    \n+
    \n+
    57 struct Child {
    \n+
    58
    \n+
    59 static_assert((k < degree()), "child index out of range");
    \n+
    60
    \n+
    62 typedef typename std::tuple_element<k,ChildTypes>::type Type;
    \n+
    63
    \n+
    65 typedef typename std::tuple_element<k,ChildTypes>::type type;
    \n+
    66 };
    \n+
    \n+
    67
    \n+
    70
    \n+
    72
    \n+
    75 template<std::size_t k>
    \n+
    \n+
    76 typename Child<k>::Type& child (index_constant<k> = {})
    \n+
    77 {
    \n+
    78 return *std::get<k>(_children);
    \n+
    79 }
    \n+
    \n+
    80
    \n+
    82
    \n+
    85 template<std::size_t k>
    \n+
    \n+
    86 const typename Child<k>::Type& child (index_constant<k> = {}) const
    \n+
    87 {
    \n+
    88 return *std::get<k>(_children);
    \n+
    89 }
    \n+
    \n+
    90
    \n+
    92
    \n+
    95 template<std::size_t k>
    \n+
    \n+
    96 std::shared_ptr<typename Child<k>::Type> childStorage (index_constant<k> = {})
    \n+
    97 {
    \n+
    98 return std::get<k>(_children);
    \n+
    99 }
    \n+
    \n+
    100
    \n+
    102
    \n+
    105 template<std::size_t k>
    \n+
    \n+
    106 std::shared_ptr<const typename Child<k>::Type> childStorage (index_constant<k> = {}) const
    \n+
    107 {
    \n+
    108 return std::get<k>(_children);
    \n+
    109 }
    \n+
    \n+
    110
    \n+
    112 template<std::size_t k>
    \n+
    \n+
    113 void setChild (typename Child<k>::Type& child, index_constant<k> = {})
    \n+
    114 {
    \n+
    115 std::get<k>(_children) = stackobject_to_shared_ptr(child);
    \n+
    116 }
    \n+
    \n+
    117
    \n+
    119 template<std::size_t k>
    \n+
    \n+
    120 void setChild (typename Child<k>::Type&& child, index_constant<k> = {})
    \n+
    121 {
    \n+
    122 std::get<k>(_children) = convert_arg(std::move(child));
    \n+
    123 }
    \n+
    \n+
    124
    \n+
    126 template<std::size_t k>
    \n+
    \n+
    127 void setChild (std::shared_ptr<typename Child<k>::Type> child, index_constant<k> = {})
    \n+
    128 {
    \n+
    129 std::get<k>(_children) = std::move(child);
    \n+
    130 }
    \n+
    \n+
    131
    \n+
    \n+
    132 const NodeStorage& nodeStorage () const
    \n+
    133 {
    \n+
    134 return _children;
    \n+
    135 }
    \n+
    \n+
    136
    \n+
    138
    \n+
    141
    \n+
    142 // The following two methods require a little bit of SFINAE trickery to work correctly:
    \n+
    143 // We have to make sure that they don't shadow the methods for direct child access because
    \n+
    144 // those get called by the generic child() machinery. If that machinery picks up the methods
    \n+
    145 // defined below, we have an infinite recursion.
    \n+
    146 // So the methods make sure that either
    \n+
    147 //
    \n+
    148 // * there are more than one argument. In that case, we got multiple indices and can forward
    \n+
    149 // to the general machine.
    \n+
    150 //
    \n+
    151 // * the first argument is not a valid flat index, i.e. either a std::size_t or an index_constant.
    \n+
    152 // The argument thus has to be some kind of TreePath instance that we can also pass to the
    \n+
    153 // generic machine.
    \n+
    154 //
    \n+
    155 // The above SFINAE logic works, but there is still a problem with the return type deduction.
    \n+
    156 // We have to do a lazy lookup of the return type after SFINAE has succeeded, otherwise the return
    \n+
    157 // type deduction will trigger the infinite recursion.
    \n+
    158
    \n+
    160
    \n+
    164#ifdef DOXYGEN
    \n+
    165 template<typename... Indices>
    \n+
    \n+
    166 ImplementationDefined& child (Indices... indices)
    \n+
    167#else
    \n+
    168 template<typename I0, typename... I,
    \n+
    169 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n+
    170 decltype(auto) child (I0 i0, I... i)
    \n+
    171#endif
    \n+
    172 {
    \n+
    173 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n+
    174 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n+
    175 );
    \n+
    176 return Dune::TypeTree::child(*this,i0,i...);
    \n+
    177 }
    \n+
    \n+
    178
    \n+
    180
    \n+
    184#ifdef DOXYGEN
    \n+
    185 template<typename... Indices>
    \n+
    \n+
    186 const ImplementationDefined& child (Indices... indices)
    \n+
    187#else
    \n+
    188 template<typename I0, typename... I,
    \n+
    189 std::enable_if_t<(sizeof...(I) > 0) || IsTreePath<I0>::value, int > = 0>
    \n+
    190 decltype(auto) child (I0 i0, I... i) const
    \n+
    191#endif
    \n+
    192 {
    \n+
    193 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
    \n+
    194 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
    \n+
    195 );
    \n+
    196 return Dune::TypeTree::child(*this,i0,i...);
    \n+
    197 }
    \n+
    \n+
    198
    \n+
    200
    \n+
    201 protected:
    \n+
    202
    \n+
    205
    \n+
    207
    \n+
    \n+\n+
    215 {}
    \n+
    \n+
    216
    \n+
    218 template<typename... Args, typename = typename std::enable_if<(sizeof...(Args) == degree())>::type>
    \n+
    \n+
    219 CompositeNode (Args&&... args)
    \n+
    220 : _children(convert_arg(std::forward<Args>(args))...)
    \n+
    221 {}
    \n+
    \n+
    222
    \n+
    \n+
    224 CompositeNode (std::shared_ptr<Children>... children)
    \n+
    225 : _children(std::move(children)...)
    \n+
    226 {}
    \n+
    \n+
    227
    \n+
    \n+
    229 CompositeNode (const NodeStorage& children)
    \n+
    230 : _children(children)
    \n+
    231 {}
    \n+
    \n+
    232
    \n+
    234
    \n+
    235 private:
    \n+
    236 NodeStorage _children;
    \n+
    237 };
    \n+
    \n+
    238
    \n+
    240
    \n+
    241 } // namespace TypeTree
    \n+
    242} //namespace Dune
    \n+
    243
    \n+
    244#endif // DUNE_TYPETREE_COMPOSITENODE_HH
    \n+\n+\n+\n+
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n+
    Definition accumulate_static.hh:16
    \n+
    Base class for composite nodes based on variadic templates.
    Definition compositenode.hh:28
    \n+
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition compositenode.hh:42
    \n+
    ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition compositenode.hh:166
    \n+
    static const bool isComposite
    Mark this class as a composite in the dune-typetree.
    Definition compositenode.hh:48
    \n+
    CompositeNode()
    Default constructor.
    Definition compositenode.hh:214
    \n+
    CompositeNodeTag NodeTag
    The type tag that describes a CompositeNode.
    Definition compositenode.hh:33
    \n+
    void setChild(typename Child< k >::Type &child, index_constant< k >={})
    Sets the k-th child to the passed-in value.
    Definition compositenode.hh:113
    \n+
    void setChild(typename Child< k >::Type &&child, index_constant< k >={})
    Store the passed value in k-th child.
    Definition compositenode.hh:120
    \n+
    static constexpr auto degree()
    Definition compositenode.hh:50
    \n+
    const NodeStorage & nodeStorage() const
    Definition compositenode.hh:132
    \n+
    CompositeNode(std::shared_ptr< Children >... children)
    Initialize the CompositeNode with copies of the passed in Storage objects.
    Definition compositenode.hh:224
    \n+
    std::shared_ptr< typename Child< k >::Type > childStorage(index_constant< k >={})
    Returns the storage of the k-th child.
    Definition compositenode.hh:96
    \n+
    std::tuple< Children... > ChildTypes
    A tuple storing the types of all children.
    Definition compositenode.hh:39
    \n+
    void setChild(std::shared_ptr< typename Child< k >::Type > child, index_constant< k >={})
    Sets the storage of the k-th child to the passed-in value.
    Definition compositenode.hh:127
    \n+
    const ImplementationDefined & child(Indices... indices)
    Returns the child given by the list of indices.
    Definition compositenode.hh:186
    \n+
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition compositenode.hh:45
    \n+
    std::shared_ptr< const typename Child< k >::Type > childStorage(index_constant< k >={}) const
    Returns the storage of the k-th child (const version).
    Definition compositenode.hh:106
    \n+
    Child< k >::Type & child(index_constant< k >={})
    Returns the k-th child.
    Definition compositenode.hh:76
    \n+
    CompositeNode(const NodeStorage &children)
    Initialize the CompositeNode with a copy of the passed-in storage type.
    Definition compositenode.hh:229
    \n+
    std::tuple< std::shared_ptr< Children >... > NodeStorage
    The type used for storing the children.
    Definition compositenode.hh:36
    \n+
    const Child< k >::Type & child(index_constant< k >={}) const
    Returns the k-th child (const version).
    Definition compositenode.hh:86
    \n+
    Access to the type and storage type of the i-th child.
    Definition compositenode.hh:57
    \n+
    std::tuple_element< k, ChildTypes >::type Type
    The type of the child.
    Definition compositenode.hh:62
    \n+
    std::tuple_element< k, ChildTypes >::type type
    The type of the child.
    Definition compositenode.hh:65
    \n+
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n+
    Check if type represents a tree path.
    Definition typetraits.hh:184
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,48 +1,323 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-typetree.hh\n+compositenode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_HH\n-7#define DUNE_TYPETREE_HH\n+6#ifndef DUNE_TYPETREE_COMPOSITENODE_HH\n+7#define DUNE_TYPETREE_COMPOSITENODE_HH\n 8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-22\n-23#endif // DUNE_TYPETREE_HH\n-_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh\n-_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh\n-_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n-_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+9#include \n+10#include \n+11#include \n+12\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+16\n+17namespace _\bD_\bu_\bn_\be {\n+18 namespace TypeTree {\n+19\n+26 template\n+_\b2_\b7 class _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+28 {\n+29\n+30 public:\n+31\n+_\b3_\b3 typedef _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+34\n+_\b3_\b6 typedef std::tuple... > _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+37\n+_\b3_\b9 typedef std::tuple _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n+40\n+_\b4_\b2 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n+43\n+_\b4_\b5 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n+46\n+_\b4_\b8 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = true;\n+49\n+_\b5_\b0 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+51 {\n+52 return std::integral_constant{};\n+53 }\n+54\n+56 template\n+_\b5_\b7 struct _\bC_\bh_\bi_\bl_\bd {\n+58\n+59 static_assert((k < _\bd_\be_\bg_\br_\be_\be()), \"child index out of range\");\n+60\n+_\b6_\b2 typedef typename std::tuple_element::type _\bT_\by_\bp_\be;\n+63\n+_\b6_\b5 typedef typename std::tuple_element::type _\bt_\by_\bp_\be;\n+66 };\n+67\n+70\n+72\n+75 template\n+_\b7_\b6 typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n+77 {\n+78 return *std::get(_children);\n+79 }\n+80\n+82\n+85 template\n+_\b8_\b6 const typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n+87 {\n+88 return *std::get(_children);\n+89 }\n+90\n+92\n+95 template\n+_\b9_\b6 std::shared_ptr::Type> _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant =\n+{})\n+97 {\n+98 return std::get(_children);\n+99 }\n+100\n+102\n+105 template\n+_\b1_\b0_\b6 std::shared_ptr::Type> _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+(index_constant = {}) const\n+107 {\n+108 return std::get(_children);\n+109 }\n+110\n+112 template\n+_\b1_\b1_\b3 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd, index_constant = {})\n+114 {\n+115 std::get(_children) = stackobject_to_shared_ptr(_\bc_\bh_\bi_\bl_\bd);\n+116 }\n+117\n+119 template\n+_\b1_\b2_\b0 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (typename _\bC_\bh_\bi_\bl_\bd_\b<_\bk_\b>_\b:_\b:_\bT_\by_\bp_\be&& _\bc_\bh_\bi_\bl_\bd, index_constant = {})\n+121 {\n+122 std::get(_children) = convert_arg(std::move(_\bc_\bh_\bi_\bl_\bd));\n+123 }\n+124\n+126 template\n+_\b1_\b2_\b7 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::shared_ptr_\b:_\b:_\bT_\by_\bp_\be> _\bc_\bh_\bi_\bl_\bd,\n+index_constant = {})\n+128 {\n+129 std::get(_children) = std::move(_\bc_\bh_\bi_\bl_\bd);\n+130 }\n+131\n+_\b1_\b3_\b2 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+133 {\n+134 return _children;\n+135 }\n+136\n+138\n+141\n+142 // The following two methods require a little bit of SFINAE trickery to\n+work correctly:\n+143 // We have to make sure that they don't shadow the methods for direct child\n+access because\n+144 // those get called by the generic child() machinery. If that machinery\n+picks up the methods\n+145 // defined below, we have an infinite recursion.\n+146 // So the methods make sure that either\n+147 //\n+148 // * there are more than one argument. In that case, we got multiple\n+indices and can forward\n+149 // to the general machine.\n+150 //\n+151 // * the first argument is not a valid flat index, i.e. either a std::\n+size_t or an index_constant.\n+152 // The argument thus has to be some kind of TreePath instance that we can\n+also pass to the\n+153 // generic machine.\n+154 //\n+155 // The above SFINAE logic works, but there is still a problem with the\n+return type deduction.\n+156 // We have to do a lazy lookup of the return type after SFINAE has\n+succeeded, otherwise the return\n+157 // type deduction will trigger the infinite recursion.\n+158\n+160\n+164#ifdef DOXYGEN\n+165 template\n+_\b1_\b6_\b6 ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n+167#else\n+168 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n+170 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i)\n+171#endif\n+172 {\n+173 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n+174 \"You cannot use the member function child() with an empty TreePath, use the\n+freestanding version child(node,treePath) instead.\"\n+175 );\n+176 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n+177 }\n+178\n+180\n+184#ifdef DOXYGEN\n+185 template\n+_\b1_\b8_\b6 const ImplementationDefined& _\bc_\bh_\bi_\bl_\bd (Indices... indices)\n+187#else\n+188 template 0) || _\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\bI_\b0_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int > = 0>\n+190 decltype(auto) _\bc_\bh_\bi_\bl_\bd (I0 i0, I... i) const\n+191#endif\n+192 {\n+193 static_assert(sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),\n+194 \"You cannot use the member function child() with an empty TreePath, use the\n+freestanding version child(node,treePath) instead.\"\n+195 );\n+196 return _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd(*this,i0,i...);\n+197 }\n+198\n+200\n+201 protected:\n+202\n+205\n+207\n+_\b2_\b1_\b4 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be ()\n+215 {}\n+216\n+218 template::type>\n+_\b2_\b1_\b9 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (Args&&... args)\n+220 : _children(convert_arg(std::forward(args))...)\n+221 {}\n+222\n+_\b2_\b2_\b4 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (std::shared_ptr... children)\n+225 : _children(std::move(children)...)\n+226 {}\n+227\n+_\b2_\b2_\b9 _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& children)\n+230 : _children(children)\n+231 {}\n+232\n+234\n+235 private:\n+236 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n+237 };\n+238\n+240\n+241 } // namespace TypeTree\n+242} //namespace Dune\n+243\n+244#endif // DUNE_TYPETREE_COMPOSITENODE_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n-_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh\n-_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh\n-_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n-_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n+_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ImplementationDefined child(Node &&node, Indices... indices)\n+Extracts the child of a node given by a sequence of compile-time and run-time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n+_\bD_\bu_\bn_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+Base class for composite nodes based on variadic templates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+static const bool isLeaf\n+Mark this class as non leaf in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ImplementationDefined & child(Indices... indices)\n+Returns the child given by the list of indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+CompositeNode()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+CompositeNodeTag NodeTag\n+The type tag that describes a CompositeNode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(typename Child< k >::Type &child, index_constant< k >={})\n+Sets the k-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(typename Child< k >::Type &&child, index_constant< k >={})\n+Store the passed value in k-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+static constexpr auto degree()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+const NodeStorage & nodeStorage() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+CompositeNode(std::shared_ptr< Children >... children)\n+Initialize the CompositeNode with copies of the passed in Storage objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< typename Child< k >::Type > childStorage(index_constant< k >=\n+{})\n+Returns the storage of the k-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n+std::tuple< Children... > ChildTypes\n+A tuple storing the types of all children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::shared_ptr< typename Child< k >::Type > child,\n+index_constant< k >={})\n+Sets the storage of the k-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const ImplementationDefined & child(Indices... indices)\n+Returns the child given by the list of indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Mark this class as a non power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::shared_ptr< const typename Child< k >::Type > childStorage(index_constant<\n+k >={}) const\n+Returns the storage of the k-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+Child< k >::Type & child(index_constant< k >={})\n+Returns the k-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n+CompositeNode(const NodeStorage &children)\n+Initialize the CompositeNode with a copy of the passed-in storage type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::tuple< std::shared_ptr< Children >... > NodeStorage\n+The type used for storing the children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const Child< k >::Type & child(index_constant< k >={}) const\n+Returns the k-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+Access to the type and storage type of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n+std::tuple_element< k, ChildTypes >::type Type\n+The type of the child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n+std::tuple_element< k, ChildTypes >::type type\n+The type of the child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn compositenode.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a composite node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bs_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+Check if type represents a tree path.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:184\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00062.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00062.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: generictransformationdescriptors.hh File Reference\n+dune-typetree: transformation.hh File Reference\n \n \n \n \n \n \n \n@@ -71,56 +71,52 @@\n \n \n \n
    \n \n-
    generictransformationdescriptors.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    transformation.hh File Reference
    \n \n
    \n
    #include <array>
    \n+#include <tuple>
    \n #include <memory>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/powercompositenodetransformationtemplates.hh>
    \n+#include <utility>
    \n+#include <dune/common/hybridutilities.hh>
    \n #include <dune/common/exceptions.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/typetree/typetraits.hh>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/utility.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::TypeTree::GenericLeafNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::GenericPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::GenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >
     
    struct  Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >
     
    struct  Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC >
     
    struct  Dune::TypeTree::GenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >
    struct  Dune::TypeTree::TransformTree< SourceTree, Transformation, Tag, recursive >
     Transform a TypeTree. More...
     
    \n \n \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename SourceNode , typename Transformation , typename Tag >
    void Dune::TypeTree::registerNodeTransformation (SourceNode *, Transformation *, Tag *)
     Register transformation descriptor to transform SourceNode with Transformation.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,53 +1,39 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-generictransformationdescriptors.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+transformation.hh File Reference\n #include \n+#include \n #include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\b>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b<_\b _\bT_\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bN_\bo_\bd_\be_\b,\n- _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bN_\bo_\bd_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\b _\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\b _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bT_\ba_\bg_\b,\n+ _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b _\b>\n+\u00a0 Transform a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn (SourceNode *, Transformation\n+ *, Tag *)\n+\u00a0 Register transformation descriptor to transform SourceNode with\n+ Transformation.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00062_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00062_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: generictransformationdescriptors.hh Source File\n+dune-typetree: transformation.hh Source File\n \n \n \n \n \n \n \n@@ -74,288 +74,512 @@\n \n
    \n \n
    \n \n
    \n-
    generictransformationdescriptors.hh
    \n+
    transformation.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n-
    7#define DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n+
    6#ifndef DUNE_TYPETREE_TRANSFORMATION_HH
    \n+
    7#define DUNE_TYPETREE_TRANSFORMATION_HH
    \n
    8
    \n
    9#include <array>
    \n-
    10#include <memory>
    \n-
    11
    \n-\n-\n-\n+
    10#include <tuple>
    \n+
    11#include <memory>
    \n+
    12#include <utility>
    \n+
    13
    \n+
    14#include <dune/common/hybridutilities.hh>
    \n
    15#include <dune/common/exceptions.hh>
    \n-
    16
    \n-
    17
    \n-
    18namespace Dune {
    \n-
    19 namespace TypeTree {
    \n-
    20
    \n-
    26 template<typename SourceNode, typename Transformation, typename TransformedNode>
    \n-
    \n-\n-
    28 {
    \n-
    29
    \n-
    30 static const bool recursive = false;
    \n-
    31
    \n-
    32 typedef TransformedNode transformed_type;
    \n-
    33 typedef std::shared_ptr<transformed_type> transformed_storage_type;
    \n+
    16#include <dune/common/typetraits.hh>
    \n+\n+\n+\n+\n+
    21
    \n+
    22
    \n+
    23namespace Dune {
    \n+
    24 namespace TypeTree {
    \n+
    25
    \n+
    31#ifdef DOXYGEN
    \n+
    32
    \n
    34
    \n-
    \n-
    35 static transformed_type transform(const SourceNode& s, const Transformation& t)
    \n-
    36 {
    \n-
    37 return transformed_type(s,t);
    \n-
    38 }
    \n-
    \n-
    39
    \n-
    \n-
    40 static transformed_type transform(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n-
    41 {
    \n-
    42 return transformed_type(s,t);
    \n-
    43 }
    \n-
    \n-
    44
    \n-
    \n-
    45 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
    \n-
    46 {
    \n-
    47 return std::make_shared<transformed_type>(s,t);
    \n-
    48 }
    \n-
    \n-
    49
    \n-
    50 };
    \n-
    \n-
    51
    \n-
    52
    \n-
    53 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNodeTemplate>
    \n-
    \n-\n-
    55 {
    \n-
    56
    \n-
    57 static const bool recursive = true;
    \n-
    58
    \n-
    59 template<typename TC>
    \n-
    \n-
    60 struct result
    \n-
    61 {
    \n-
    62 typedef typename TransformedNodeTemplate<TC>::type type;
    \n-
    63 typedef std::shared_ptr<type> storage_type;
    \n-
    64 static const std::size_t degree = StaticDegree<type>::value;
    \n-
    65 };
    \n-
    \n-
    66
    \n-
    67 template<typename TC>
    \n-
    \n-
    68 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n-
    69 {
    \n-
    70 return typename result<TC>::type(s,t,children);
    \n-
    71 }
    \n-
    \n-
    72
    \n-
    73 template<typename TC>
    \n-
    \n-
    74 static typename result<TC>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n-
    75 {
    \n-
    76 return typename result<TC>::type(s,t,children);
    \n-
    77 }
    \n-
    \n-
    78
    \n-
    79 template<typename TC>
    \n-
    \n-
    80 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
    \n-
    81 {
    \n-
    82 return std::make_shared<typename result<TC>::type>(s,t,children);
    \n-
    83 }
    \n-
    \n-
    84
    \n-
    85 };
    \n-
    \n-
    86
    \n-
    87
    \n-
    88 template<typename SourceNode, typename Transformation, template<typename,typename,std::size_t> class TransformedNode>
    \n-
    \n-\n-\n-
    91 Transformation,
    \n-
    92 GenericPowerNodeTransformationTemplate<SourceNode,
    \n-
    93 Transformation,
    \n-
    94 TransformedNode>::template result
    \n-
    95 >
    \n-
    96 {};
    \n-
    \n+
    53 template<typename SourceNode, typename Transformation, typename Tag>
    \n+
    54 void registerNodeTransformation(SourceNode*, Transformation*, Tag*);
    \n+
    55
    \n+
    56#else // DOXYGEN
    \n+
    57
    \n+
    68 template<typename S, typename T, typename Tag>
    \n+
    69 struct LookupNodeTransformation
    \n+
    70 {
    \n+
    71
    \n+
    72 typedef decltype(registerNodeTransformation(declptr<S>(),declptr<T>(),declptr<Tag>())) lookup_type;
    \n+
    73
    \n+
    74 typedef typename evaluate_if_meta_function<
    \n+
    75 lookup_type
    \n+
    76 >::type type;
    \n+
    77
    \n+
    78 static_assert((!std::is_same<type,void>::value), "Unable to find valid transformation descriptor");
    \n+
    79 };
    \n+
    80
    \n+
    81#endif // DOXYGEN
    \n+
    82
    \n+
    83
    \n+
    85
    \n+
    94 template<typename SourceTree, typename Transformation, typename Tag = StartTag, bool recursive = true>
    \n+
    \n+\n+
    96 {
    \n
    97
    \n-
    98
    \n-
    99 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNodeTemplate>
    \n-
    \n-\n-
    101 {
    \n-
    102
    \n-
    103 static const bool recursive = true;
    \n+
    98#ifndef DOXYGEN
    \n+
    99
    \n+
    100 typedef typename LookupNodeTransformation<SourceTree,Transformation,typename SourceTree::ImplementationTag>::type NodeTransformation;
    \n+
    101
    \n+
    102 // the type of the new tree that will result from this transformation
    \n+
    103 typedef typename TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transformed_type transformed_type;
    \n
    104
    \n-
    105 template<typename TC>
    \n-
    \n-
    106 struct result
    \n-
    107 {
    \n-
    108 typedef typename TransformedNodeTemplate<TC>::type type;
    \n-
    109 typedef std::shared_ptr<type> storage_type;
    \n-
    110 };
    \n-
    \n-
    111
    \n-
    112 template<typename TC>
    \n-
    \n-
    113 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n-
    114 {
    \n-
    115 return typename result<TC>::type(s,t,children);
    \n-
    116 }
    \n-
    \n-
    117
    \n-
    118 template<typename TC>
    \n-
    \n-
    119 static typename result<TC>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n-
    120 {
    \n-
    121 return typename result<TC>::type(s,t,children);
    \n-
    122 }
    \n-
    \n-
    123
    \n-
    124 template<typename TC>
    \n-
    \n-
    125 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
    \n-
    126 {
    \n-
    127 return std::make_shared<typename result<TC>::type>(s,t,children);
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    130 };
    \n+
    105 // the storage type of the new tree that will result from this transformation
    \n+
    106 typedef typename TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transformed_storage_type transformed_storage_type;
    \n+
    107
    \n+
    108#endif // DOXYGEN
    \n+
    109
    \n+
    111 typedef transformed_type type;
    \n+
    112
    \n+
    113 typedef type Type;
    \n+
    114
    \n+
    \n+
    116 static transformed_type transform(const SourceTree& s, const Transformation& t = Transformation())
    \n+
    117 {
    \n+
    118 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(s,t);
    \n+
    119 }
    \n+
    \n+
    120
    \n+
    \n+
    122 static transformed_type transform(const SourceTree& s, Transformation& t)
    \n+
    123 {
    \n+
    124 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(s,t);
    \n+
    125 }
    \n+
    \n+
    126
    \n+
    \n+
    128 static transformed_type transform(std::shared_ptr<const SourceTree> sp, const Transformation& t = Transformation())
    \n+
    129 {
    \n+
    130 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(sp,t);
    \n+
    131 }
    \n
    \n-
    131
    \n
    132
    \n-
    133 template<typename SourceNode, typename Transformation, template<typename,typename> class TransformedNode>
    \n-
    \n-\n-\n-
    136 Transformation,
    \n-
    137 GenericDynamicPowerNodeTransformationTemplate<SourceNode,
    \n-
    138 Transformation,
    \n-
    139 TransformedNode>::template result
    \n-
    140 >
    \n-
    141 {};
    \n-
    \n-
    142
    \n-
    143
    \n-
    144 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNodeTemplate>
    \n-
    \n-\n-
    146 {
    \n-
    147
    \n-
    148 static const bool recursive = true;
    \n-
    149
    \n-
    150 template<typename... TC>
    \n-
    \n-
    151 struct result
    \n-
    152 {
    \n-
    153 typedef typename TransformedNodeTemplate<TC...>::type type;
    \n-
    154 typedef std::shared_ptr<type> storage_type;
    \n-
    155 };
    \n-
    \n-
    156
    \n-
    157 template<typename... TC>
    \n-
    \n-
    158 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
    \n-
    159 {
    \n-
    160 return typename result<TC...>::type(s,t,children...);
    \n-
    161 }
    \n-
    \n-
    162
    \n-
    163 template<typename... TC>
    \n-
    \n-
    164 static typename result<TC...>::type transform(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n-
    165 {
    \n-
    166 return typename result<TC...>::type(s,t,children...);
    \n-
    167 }
    \n-
    \n-
    168
    \n-
    169 template<typename... TC>
    \n-
    \n-
    170 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
    \n-
    171 {
    \n-
    172 return std::make_shared<typename result<TC...>::type>(s,t,children...);
    \n-
    173 }
    \n-
    \n-
    174
    \n-
    175 };
    \n-
    \n-
    176
    \n-
    177
    \n-
    178 template<typename SourceNode, typename Transformation, template<typename,typename...> class TransformedNode>
    \n-
    \n-\n-\n-
    181 Transformation,
    \n-
    182 GenericCompositeNodeTransformationTemplate<SourceNode,
    \n-
    183 Transformation,
    \n-
    184 TransformedNode>::template result
    \n-
    185 >
    \n-
    186 {};
    \n-
    \n-
    187
    \n-
    189
    \n-
    190 } // namespace TypeTree
    \n-
    191} //namespace Dune
    \n-
    192
    \n-
    193#endif // DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH
    \n-\n-\n-\n-
    decltype(Node::degree()) StaticDegree
    Returns the statically known degree of the given Node type as a std::integral_constant.
    Definition nodeinterface.hh:107
    \n+
    \n+
    134 static transformed_type transform(std::shared_ptr<const SourceTree> sp, Transformation& t)
    \n+
    135 {
    \n+
    136 return TransformTree<SourceTree,Transformation,NodeTag<SourceTree>,NodeTransformation::recursive>::transform(sp,t);
    \n+
    137 }
    \n+
    \n+
    138
    \n+
    \n+
    141 static transformed_storage_type transform_storage(std::shared_ptr<const SourceTree> sp, const Transformation& t = Transformation())
    \n+
    142 {
    \n+\n+
    144 }
    \n+
    \n+
    145
    \n+
    \n+
    148 static transformed_storage_type transform_storage(std::shared_ptr<const SourceTree> sp, Transformation& t)
    \n+
    149 {
    \n+\n+
    151 }
    \n+
    \n+
    152
    \n+
    153
    \n+
    154 };
    \n+
    \n+
    155
    \n+
    156#ifndef DOXYGEN // internal per-node implementations of the transformation algorithm
    \n+
    157
    \n+
    158 // handle a leaf node - this is easy
    \n+
    159 template<typename S, typename T, bool recursive>
    \n+
    160 struct TransformTree<S,T,LeafNodeTag,recursive>
    \n+
    161 {
    \n+
    162 // get transformed type from specification
    \n+
    163 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>::type NodeTransformation;
    \n+
    164
    \n+
    165 typedef typename NodeTransformation::transformed_type transformed_type;
    \n+
    166 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
    \n+
    167
    \n+
    168 // delegate instance transformation to per-node specification
    \n+
    169 static transformed_type transform(const S& s, T& t)
    \n+
    170 {
    \n+
    171 return NodeTransformation::transform(s,t);
    \n+
    172 }
    \n+
    173
    \n+
    174 // delegate instance transformation to per-node specification
    \n+
    175 static transformed_type transform(const S& s, const T& t)
    \n+
    176 {
    \n+
    177 return NodeTransformation::transform(s,t);
    \n+
    178 }
    \n+
    179
    \n+
    180 // delegate instance transformation to per-node specification
    \n+
    181 static transformed_type transform(std::shared_ptr<const S> sp, T& t)
    \n+
    182 {
    \n+
    183 return NodeTransformation::transform(sp,t);
    \n+
    184 }
    \n+
    185
    \n+
    186 // delegate instance transformation to per-node specification
    \n+
    187 static transformed_type transform(std::shared_ptr<const S> sp, const T& t)
    \n+
    188 {
    \n+
    189 return NodeTransformation::transform(sp,t);
    \n+
    190 }
    \n+
    191
    \n+
    192 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n+
    193 {
    \n+
    194 return NodeTransformation::transform_storage(sp,t);
    \n+
    195 }
    \n+
    196
    \n+
    197 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n+
    198 {
    \n+
    199 return NodeTransformation::transform_storage(sp,t);
    \n+
    200 }
    \n+
    201
    \n+
    202 };
    \n+
    203
    \n+
    204
    \n+
    205 // common implementation for non-recursive transformation of non-leaf nodes
    \n+
    206 template<typename S, typename T>
    \n+
    207 struct TransformTreeNonRecursive
    \n+
    208 {
    \n+
    209 // get transformed type from specification
    \n+
    210 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>::type NodeTransformation;
    \n+
    211
    \n+
    212 typedef typename NodeTransformation::transformed_type transformed_type;
    \n+
    213 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
    \n+
    214
    \n+
    215 // delegate instance transformation to per-node specification
    \n+
    216 static transformed_type transform(const S& s, T& t)
    \n+
    217 {
    \n+
    218 return NodeTransformation::transform(s,t);
    \n+
    219 }
    \n+
    220
    \n+
    221 // delegate instance transformation to per-node specification
    \n+
    222 static transformed_type transform(const S& s, const T& t)
    \n+
    223 {
    \n+
    224 return NodeTransformation::transform(s,t);
    \n+
    225 }
    \n+
    226
    \n+
    227 // delegate instance transformation to per-node specification
    \n+
    228 static transformed_type transform(std::shared_ptr<const S> sp, T& t)
    \n+
    229 {
    \n+
    230 return NodeTransformation::transform(sp,t);
    \n+
    231 }
    \n+
    232
    \n+
    233 // delegate instance transformation to per-node specification
    \n+
    234 static transformed_type transform(std::shared_ptr<const S> sp, const T& t)
    \n+
    235 {
    \n+
    236 return NodeTransformation::transform(sp,t);
    \n+
    237 }
    \n+
    238
    \n+
    239 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n+
    240 {
    \n+
    241 return NodeTransformation::transform_storage(sp,t);
    \n+
    242 }
    \n+
    243
    \n+
    244 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n+
    245 {
    \n+
    246 return NodeTransformation::transform_storage(sp,t);
    \n+
    247 }
    \n+
    248
    \n+
    249 };
    \n+
    250
    \n+
    251
    \n+
    252 namespace Impl {
    \n+
    253
    \n+
    254 // Helper class to handle recursive power nodes
    \n+
    255 template<class Source, class Transformation, class Tag>
    \n+
    256 class RecursivePowerTransformTree
    \n+
    257 {
    \n+
    258 // We only know two types of tags!
    \n+
    259 static_assert(std::is_same_v<Tag,PowerNodeTag> or std::is_same_v<Tag,DynamicPowerNodeTag>);
    \n+
    260
    \n+
    261 using ChildType = typename Source::ChildType;
    \n+
    262
    \n+
    263 // in case degree is dynamic, provid a vector correctly initialized
    \n+
    264 template<class NodeStorage>
    \n+
    265 static auto node_storage_provider(const std::size_t& degree)
    \n+
    266 {
    \n+
    267 return std::vector<NodeStorage>(degree);
    \n+
    268 }
    \n+
    269
    \n+
    270 // in case degree is static, provid an array
    \n+
    271 template<class NodeStorage, class StaticIndex>
    \n+
    272 static auto node_storage_provider(StaticIndex)
    \n+
    273 {
    \n+
    274 return std::array<NodeStorage,std::size_t(StaticIndex{})>();
    \n+
    275 }
    \n+
    276
    \n+
    277 public:
    \n+
    278 // get transformed type from specification
    \n+
    279 // Handling this transformation in a way that makes the per-node specification easy to write
    \n+
    280 // is a little involved:
    \n+
    281 // The problem is that the transformed power node must be parameterized on the transformed child
    \n+
    282 // type. So we need to transform the child type and pass the transformed child type to an inner
    \n+
    283 // template of the node transformation struct called result (see example of such a specification
    \n+
    284 // further down).
    \n+
    285 using NodeTransformation = typename LookupNodeTransformation<Source,Transformation,ImplementationTag<Source>>::type;
    \n+
    286 using ChildNodeTransformation = typename LookupNodeTransformation<ChildType,Transformation,ImplementationTag<ChildType>>::type;
    \n+
    287
    \n+
    288 private:
    \n+
    289 // Since every child is same type, is enough to get transformation once
    \n+
    290 using ChildTreeTransformation = TransformTree<ChildType,
    \n+
    291 Transformation,
    \n+
    292 NodeTag<ChildType>,
    \n+
    293 ChildNodeTransformation::recursive>;
    \n+
    294
    \n+
    295 // Get transformed type of children
    \n+
    296 using transformed_child_type = typename ChildTreeTransformation::transformed_type;
    \n+
    297 using transformed_child_storage_type = typename ChildTreeTransformation::transformed_storage_type;
    \n+
    298 public:
    \n+
    299 // Apply transformation from children to current node
    \n+
    300 using transformed_type = typename NodeTransformation::template result<transformed_child_type>::type;
    \n+
    301 using transformed_storage_type = typename NodeTransformation::template result<transformed_child_type>::storage_type;
    \n+
    302
    \n+
    303 // Transform an instance of source tree.
    \n+
    304 static transformed_type transform(const Source& source, Transformation& transformation)
    \n+
    305 {
    \n+
    306 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
    \n+
    307 for (std::size_t k = 0; k < source.degree(); ++k) {
    \n+
    308 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
    \n+
    309 }
    \n+
    310 return NodeTransformation::transform(source,transformation,children_storage);
    \n+
    311 }
    \n+
    312
    \n+
    313 // Transform an instance of source tree.
    \n+
    314 static transformed_type transform(const Source& source, const Transformation& transformation)
    \n+
    315 {
    \n+
    316 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
    \n+
    317 for (std::size_t k = 0; k < source.degree(); ++k) {
    \n+
    318 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
    \n+
    319 }
    \n+
    320 return NodeTransformation::transform(source,transformation,children_storage);
    \n+
    321 }
    \n+
    322
    \n+
    323 // Transform an instance of source tree.
    \n+
    324 static transformed_type transform(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
    \n+
    325 {
    \n+
    326 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
    \n+
    327 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n+
    328 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n+
    329 }
    \n+
    330 return NodeTransformation::transform(source_ptr,transformation,children_storage);
    \n+
    331 }
    \n+
    332
    \n+
    333 // Transform an instance of source tree.
    \n+
    334 static transformed_type transform(std::shared_ptr<const Source> source_ptr, const Transformation& transformation)
    \n+
    335 {
    \n+
    336 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
    \n+
    337 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n+
    338 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n+
    339 }
    \n+
    340 return NodeTransformation::transform(source_ptr,transformation,children_storage);
    \n+
    341 }
    \n+
    342
    \n+
    343 // Transform an instance of source tree ptr.
    \n+
    344 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
    \n+
    345 {
    \n+
    346 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
    \n+
    347 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n+
    348 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n+
    349 }
    \n+
    350 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
    \n+
    351 }
    \n+
    352
    \n+
    353 // Transform an instance of source tree ptr.
    \n+
    354 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr, const Transformation& transformation)
    \n+
    355 {
    \n+
    356 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
    \n+
    357 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
    \n+
    358 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
    \n+
    359 }
    \n+
    360 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
    \n+
    361 }
    \n+
    362
    \n+
    363 };
    \n+
    364 } // namespace Impl
    \n+
    365
    \n+
    366 // Recursive version of the PowerNode transformation for static nodes.
    \n+
    367 template<typename Source, typename Transformation>
    \n+
    368 struct TransformTree<Source,Transformation,PowerNodeTag,true>
    \n+
    369 : public Impl::RecursivePowerTransformTree<Source,Transformation,PowerNodeTag>
    \n+
    370 {};
    \n+
    371
    \n+
    372 // Recursive version of the DynamicPowerNode transformation for static nodes.
    \n+
    373 template<typename Source, typename Transformation>
    \n+
    374 struct TransformTree<Source,Transformation,DynamicPowerNodeTag,true>
    \n+
    375 : public Impl::RecursivePowerTransformTree<Source,Transformation,DynamicPowerNodeTag>
    \n+
    376 {};
    \n+
    377
    \n+
    378 // non-recursive version of the PowerNode transformation.
    \n+
    379 template<typename S, typename T>
    \n+
    380 struct TransformTree<S,T,PowerNodeTag,false>
    \n+
    381 : public TransformTreeNonRecursive<S,T>
    \n+
    382 {};
    \n+
    383
    \n+
    384 // non-recursive version of the DynamicPowerNodeTag transformation.
    \n+
    385 template<typename S, typename T>
    \n+
    386 struct TransformTree<S,T,DynamicPowerNodeTag,false>
    \n+
    387 : public TransformTreeNonRecursive<S,T>
    \n+
    388 {};
    \n+
    389
    \n+
    390 // helper struct that does the actual transformation for a composite node. We need this additional struct
    \n+
    391 // to extract the template argument list with the types of all children from the node, which we cannot do
    \n+
    392 // directly in the transformation<> template, as the type passed to transformation<> will usually be a
    \n+
    393 // derived type and will normally have more template arguments than just the children. This declaration
    \n+
    394 // just introduces the type of the helper struct, we always instantiate the specialization defined below;
    \n+
    395 template<typename S, typename Children, typename T>
    \n+
    396 struct transform_composite_node;
    \n+
    397
    \n+
    398 // specialized version of the helper struct which extracts the template argument list with the children from
    \n+
    399 // its second template parameter, which has to be CompositeNode::ChildTypes. Apart from that, the struct is
    \n+
    400 // similar to the one for a PowerNode, but it obviously delegates transformation of the children to the TMP.
    \n+
    401 template<typename S, typename T, typename... C>
    \n+
    402 struct transform_composite_node<S,std::tuple<C...>,T>
    \n+
    403 {
    \n+
    404
    \n+
    405 // transformed type, using the same nested struct trick as the PowerNode
    \n+
    406 typedef ImplementationTag<S> Tag;
    \n+
    407 typedef typename LookupNodeTransformation<S,T,Tag>::type NodeTransformation;
    \n+
    408 typedef typename NodeTransformation::template result<typename TransformTree<C,
    \n+
    409 T,
    \n+
    410 NodeTag<C>,
    \n+
    411 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
    \n+
    412 >::transformed_type...
    \n+
    413 >::type transformed_type;
    \n+
    414
    \n+
    415 typedef typename NodeTransformation::template result<typename TransformTree<C,
    \n+
    416 T,
    \n+
    417 NodeTag<C>,
    \n+
    418 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
    \n+
    419 >::transformed_type...
    \n+
    420 >::storage_type transformed_storage_type;
    \n+
    421
    \n+
    422 // Retrieve the transformation descriptor for the child with index i.
    \n+
    423 // This little helper improves really improves the readability of the
    \n+
    424 // transformation functions.
    \n+
    425 template<std::size_t i>
    \n+
    426 struct ChildTransformation
    \n+
    427 : public TransformTree<typename S::template Child<i>::Type,
    \n+
    428 T,
    \n+
    429 NodeTag<typename S::template Child<i>::Type>,
    \n+
    430 LookupNodeTransformation<
    \n+
    431 typename S::template Child<i>::Type,
    \n+
    432 T,
    \n+
    433 ImplementationTag<typename S::template Child<i>::Type>
    \n+
    434 >::type::recursive
    \n+
    435 >
    \n+
    436 {};
    \n+
    437
    \n+
    438 template<std::size_t i, typename Tuple, typename Value>
    \n+
    439 static void setElement(Tuple& tuple, Value&& value)
    \n+
    440 {
    \n+
    441 std::get<i>(tuple) = std::forward<Value>(value);
    \n+
    442 }
    \n+
    443
    \n+
    444 template<typename Trafo, std::size_t... i>
    \n+
    445 static transformed_type transform(const S& s, Trafo&& t, std::index_sequence<i...> indices)
    \n+
    446 {
    \n+
    447 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
    \n+
    448 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(s.template childStorage<i>(), std::forward<Trafo>(t))),0)...});
    \n+
    449 return NodeTransformation::transform(s, std::forward<Trafo>(t), std::get<i>(storage)...);
    \n+
    450 }
    \n+
    451
    \n+
    452 template<typename Trafo, std::size_t... i>
    \n+
    453 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, Trafo&& t, std::index_sequence<i...> indices)
    \n+
    454 {
    \n+
    455 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
    \n+
    456 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(sp->template childStorage<i>(), std::forward<Trafo>(t))),0)...});
    \n+
    457 return NodeTransformation::transform_storage(sp, std::forward<Trafo>(t), std::get<i>(storage)...);
    \n+
    458 }
    \n+
    459 };
    \n+
    460
    \n+
    461
    \n+
    462 // the specialization of transformation<> for the CompositeNode. This just extracts the
    \n+
    463 // CompositeNode::ChildTypes member and forwards to the helper struct
    \n+
    464 template<typename S, typename T>
    \n+
    465 struct TransformTree<S,T,CompositeNodeTag,true>
    \n+
    466 {
    \n+
    467
    \n+
    468 private:
    \n+
    469
    \n+
    470 typedef typename S::ChildTypes ChildTypes;
    \n+
    471
    \n+
    472 static auto child_indices()
    \n+
    473 {
    \n+
    474 return std::make_index_sequence<S::degree()>();
    \n+
    475 }
    \n+
    476
    \n+
    477 public:
    \n+
    478
    \n+
    479 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_type transformed_type;
    \n+
    480 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_storage_type transformed_storage_type;
    \n+
    481
    \n+
    482 static transformed_type transform(const S& s, T& t)
    \n+
    483 {
    \n+
    484 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
    \n+
    485 }
    \n+
    486
    \n+
    487 static transformed_type transform(const S& s, const T& t)
    \n+
    488 {
    \n+
    489 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
    \n+
    490 }
    \n+
    491
    \n+
    492 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
    \n+
    493 {
    \n+
    494 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
    \n+
    495 }
    \n+
    496
    \n+
    497 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, const T& t)
    \n+
    498 {
    \n+
    499 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
    \n+
    500 }
    \n+
    501
    \n+
    502 };
    \n+
    503
    \n+
    504 // non-recursive version of the CompositeNode transformation.
    \n+
    505 template<typename S, typename T>
    \n+
    506 struct TransformTree<S,T,CompositeNodeTag,false>
    \n+
    507 : public TransformTreeNonRecursive<S,T>
    \n+
    508 {};
    \n+
    509
    \n+
    510#endif // DOXYGEN
    \n+
    511
    \n+
    513
    \n+
    514 } // namespace TypeTree
    \n+
    515} //namespace Dune
    \n+
    516
    \n+
    517#endif // DUNE_TYPETREE_TRANSFORMATION_HH
    \n+\n+\n+\n+\n+
    static const result_type result
    Definition accumulate_static.hh:113
    \n+
    void registerNodeTransformation(SourceNode *, Transformation *, Tag *)
    Register transformation descriptor to transform SourceNode with Transformation.
    \n
    Definition accumulate_static.hh:16
    \n-
    Definition generictransformationdescriptors.hh:28
    \n-
    TransformedNode transformed_type
    Definition generictransformationdescriptors.hh:32
    \n-
    std::shared_ptr< transformed_type > transformed_storage_type
    Definition generictransformationdescriptors.hh:33
    \n-
    static transformed_type transform(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition generictransformationdescriptors.hh:40
    \n-
    static const bool recursive
    Definition generictransformationdescriptors.hh:30
    \n-
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t)
    Definition generictransformationdescriptors.hh:45
    \n-
    static transformed_type transform(const SourceNode &s, const Transformation &t)
    Definition generictransformationdescriptors.hh:35
    \n-
    Definition generictransformationdescriptors.hh:55
    \n-
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:80
    \n-
    static const bool recursive
    Definition generictransformationdescriptors.hh:57
    \n-
    static result< TC >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:74
    \n-
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    Definition generictransformationdescriptors.hh:68
    \n-
    Definition generictransformationdescriptors.hh:61
    \n-
    TransformedNodeTemplate< TC >::type type
    Definition generictransformationdescriptors.hh:62
    \n-
    static const std::size_t degree
    Definition generictransformationdescriptors.hh:64
    \n-
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:63
    \n-
    Definition generictransformationdescriptors.hh:96
    \n-
    Definition generictransformationdescriptors.hh:101
    \n-
    static result< TC >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:119
    \n-
    static const bool recursive
    Definition generictransformationdescriptors.hh:103
    \n-
    static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:113
    \n-
    static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    Definition generictransformationdescriptors.hh:125
    \n-
    Definition generictransformationdescriptors.hh:107
    \n-
    TransformedNodeTemplate< TC >::type type
    Definition generictransformationdescriptors.hh:108
    \n-
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:109
    \n-
    Definition generictransformationdescriptors.hh:141
    \n-
    Definition generictransformationdescriptors.hh:146
    \n-
    static result< TC... >::type transform(const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:158
    \n-
    static result< TC... >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:170
    \n-
    static result< TC... >::type transform(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    Definition generictransformationdescriptors.hh:164
    \n-
    static const bool recursive
    Definition generictransformationdescriptors.hh:148
    \n-
    Definition generictransformationdescriptors.hh:152
    \n-
    TransformedNodeTemplate< TC... >::type type
    Definition generictransformationdescriptors.hh:153
    \n-
    std::shared_ptr< type > storage_type
    Definition generictransformationdescriptors.hh:154
    \n-
    Definition generictransformationdescriptors.hh:186
    \n+
    Transform a TypeTree.
    Definition transformation.hh:96
    \n+
    type Type
    Definition transformation.hh:113
    \n+
    static transformed_type transform(std::shared_ptr< const SourceTree > sp, Transformation &t)
    Apply transformation to an existing tree s.
    Definition transformation.hh:134
    \n+
    static transformed_type transform(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
    Apply transformation to an existing tree s.
    Definition transformation.hh:128
    \n+
    static transformed_type transform(const SourceTree &s, Transformation &t)
    Apply transformation to an existing tree s.
    Definition transformation.hh:122
    \n+
    transformed_type type
    The type of the transformed tree.
    Definition transformation.hh:111
    \n+
    static transformed_type transform(const SourceTree &s, const Transformation &t=Transformation())
    Apply transformation to an existing tree s.
    Definition transformation.hh:116
    \n+
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
    Definition transformation.hh:141
    \n+
    static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, Transformation &t)
    Definition transformation.hh:148
    \n+
    Meta function that evaluates its argument iff it inherits from meta_function.
    Definition typetraits.hh:142
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,347 +1,634 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-generictransformationdescriptors.hh\n+transformation.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n-7#define DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n+6#ifndef DUNE_TYPETREE_TRANSFORMATION_HH\n+7#define DUNE_TYPETREE_TRANSFORMATION_HH\n 8\n 9#include \n-10#include \n-11\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+10#include \n+11#include \n+12#include \n+13\n+14#include \n 15#include \n-16\n-17\n-18namespace _\bD_\bu_\bn_\be {\n-19 namespace TypeTree {\n-20\n-26 template\n-_\b2_\b7 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-28 {\n-29\n-_\b3_\b0 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = false;\n-31\n-_\b3_\b2 typedef TransformedNode _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b3 typedef std::shared_ptr _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n+16#include \n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+21\n+22\n+23namespace _\bD_\bu_\bn_\be {\n+24 namespace TypeTree {\n+25\n+31#ifdef DOXYGEN\n+32\n 34\n-_\b3_\b5 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const Transformation&\n-t)\n-36 {\n-37 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be(s,t);\n-38 }\n-39\n-_\b4_\b0 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const\n-Transformation& t)\n-41 {\n-42 return _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be(s,t);\n-43 }\n-44\n-_\b4_\b5 static _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr s, const Transformation& t)\n-46 {\n-47 return std::make_shared(s,t);\n-48 }\n-49\n-50 };\n-51\n-52\n-53 template class TransformedNodeTemplate>\n-_\b5_\b4 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-55 {\n-56\n-_\b5_\b7 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n-58\n-59 template\n-_\b6_\b0 struct _\br_\be_\bs_\bu_\bl_\bt\n-61 {\n-_\b6_\b2 typedef typename TransformedNodeTemplate::type _\bt_\by_\bp_\be;\n-_\b6_\b3 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b6_\b4 static const std::size_t _\bd_\be_\bg_\br_\be_\be = _\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be_\b<_\bt_\by_\bp_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n-65 };\n-66\n-67 template\n-_\b6_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>&\n-children)\n-69 {\n-70 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n-71 }\n-72\n-73 template\n-_\b7_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr\n-s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:\n-_\bd_\be_\bg_\br_\be_\be>& children)\n-75 {\n-76 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n-77 }\n-78\n-79 template\n-_\b8_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, const std::array,_\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bd_\be_\bg_\br_\be_\be>& children)\n-81 {\n-82 return std::make_shared::type>(s,t,children);\n-83 }\n-84\n-85 };\n-86\n-87\n-88 template class TransformedNode>\n-_\b8_\b9 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-90 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n-95 >\n-96 {};\n+53 template\n+_\b5_\b4 void _\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(SourceNode*, Transformation*, Tag*);\n+55\n+56#else // DOXYGEN\n+57\n+68 template\n+69 struct LookupNodeTransformation\n+70 {\n+71\n+72 typedef decltype(_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(declptr(),declptr\n+(),declptr())) lookup_type;\n+73\n+74 typedef typename _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn<\n+75 lookup_type\n+76 >::type type;\n+77\n+78 static_assert((!std::is_same::value), \"Unable to find valid\n+transformation descriptor\");\n+79 };\n+80\n+81#endif // DOXYGEN\n+82\n+83\n+85\n+94 template\n+_\b9_\b5 struct _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be\n+96 {\n 97\n-98\n-99 template class TransformedNodeTemplate>\n-_\b1_\b0_\b0 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-101 {\n-102\n-_\b1_\b0_\b3 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n+98#ifndef DOXYGEN\n+99\n+100 typedef typename\n+LookupNodeTransformation::type NodeTransformation;\n+101\n+102 // the type of the new tree that will result from this transformation\n+103 typedef typename\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>::transformed_type transformed_type;\n 104\n-105 template\n-_\b1_\b0_\b6 struct _\br_\be_\bs_\bu_\bl_\bt\n-107 {\n-_\b1_\b0_\b8 typedef typename TransformedNodeTemplate::type _\bt_\by_\bp_\be;\n-_\b1_\b0_\b9 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-110 };\n-111\n-112 template\n-_\b1_\b1_\b3 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, const std::vector>& children)\n-114 {\n-115 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n-116 }\n-117\n-118 template\n-_\b1_\b1_\b9 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const Transformation& t, const std::vector>&\n-children)\n-120 {\n-121 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children);\n-122 }\n-123\n-124 template\n-_\b1_\b2_\b5 static typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b>_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, const std::\n-vector>& children)\n-126 {\n-127 return std::make_shared::type>(s,t,children);\n-128 }\n-129\n-130 };\n-131\n+105 // the storage type of the new tree that will result from this\n+transformation\n+106 typedef typename\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>::transformed_storage_type transformed_storage_type;\n+107\n+108#endif // DOXYGEN\n+109\n+_\b1_\b1_\b1 typedef transformed_type _\bt_\by_\bp_\be;\n+112\n+_\b1_\b1_\b3 typedef _\bt_\by_\bp_\be _\bT_\by_\bp_\be;\n+114\n+_\b1_\b1_\b6 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceTree& s, const\n+Transformation& t = Transformation())\n+117 {\n+118 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(s,t);\n+119 }\n+120\n+_\b1_\b2_\b2 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceTree& s, Transformation& t)\n+123 {\n+124 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(s,t);\n+125 }\n+126\n+_\b1_\b2_\b8 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp,\n+const Transformation& t = Transformation())\n+129 {\n+130 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(sp,t);\n+131 }\n 132\n-133 template class TransformedNode>\n-_\b1_\b3_\b4 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-135 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n-140 >\n-141 {};\n-142\n-143\n-144 template class TransformedNodeTemplate>\n-_\b1_\b4_\b5 struct _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-146 {\n-147\n-_\b1_\b4_\b8 static const bool _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be = true;\n-149\n-150 template\n-_\b1_\b5_\b1 struct _\br_\be_\bs_\bu_\bl_\bt\n-152 {\n-_\b1_\b5_\b3 typedef typename TransformedNodeTemplate_\b:_\b:_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n-_\b1_\b5_\b4 typedef std::shared_ptr _\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be;\n-155 };\n-156\n-157 template\n-_\b1_\b5_\b8 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const SourceNode& s, const\n-Transformation& t, std::shared_ptr... children)\n-159 {\n-160 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children...);\n-161 }\n-162\n-163 template\n-_\b1_\b6_\b4 static typename _\br_\be_\bs_\bu_\bl_\bt::type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr s, const Transformation& t, std::shared_ptr... children)\n-165 {\n-166 return typename _\br_\be_\bs_\bu_\bl_\bt_\b<_\bT_\bC_\b._\b._\b._\b>_\b:_\b:_\bt_\by_\bp_\be(s,t,children...);\n-167 }\n-168\n-169 template\n-_\b1_\b7_\b0 static typename _\br_\be_\bs_\bu_\bl_\bt::storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::\n-shared_ptr s, const Transformation& t, std::shared_ptr...\n-children)\n-171 {\n-172 return std::make_shared::type>(s,t,children...);\n-173 }\n-174\n-175 };\n-176\n-177\n-178 template class TransformedNode>\n-_\b1_\b7_\b9 struct _\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-180 : public _\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn::template result\n-185 >\n-186 {};\n-187\n-189\n-190 } // namespace TypeTree\n-191} //namespace Dune\n-192\n-193#endif // DUNE_TYPETREE_GENERICTRANSFORMATIONDESCRIPTORS_HH\n-_\bp_\bo_\bw_\be_\br_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be_\bs_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\b1_\b3_\b4 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp,\n+Transformation& t)\n+135 {\n+136 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(sp,t);\n+137 }\n+138\n+_\b1_\b4_\b1 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr sp, const Transformation& t = Transformation())\n+142 {\n+143 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(sp,t);\n+144 }\n+145\n+_\b1_\b4_\b8 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr sp, Transformation& t)\n+149 {\n+150 return\n+_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b,_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bS_\bo_\bu_\br_\bc_\be_\bT_\br_\be_\be_\b>,NodeTransformation::\n+recursive>_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(sp,t);\n+151 }\n+152\n+153\n+154 };\n+155\n+156#ifndef DOXYGEN // internal per-node implementations of the transformation\n+algorithm\n+157\n+158 // handle a leaf node - this is easy\n+159 template\n+160 struct TransformTree\n+161 {\n+162 // get transformed type from specification\n+163 typedef typename LookupNodeTransformation>_\b:_\b:_\bt_\by_\bp_\be\n+NodeTransformation;\n+164\n+165 typedef typename NodeTransformation::transformed_type transformed_type;\n+166 typedef typename NodeTransformation::transformed_storage_type\n+transformed_storage_type;\n+167\n+168 // delegate instance transformation to per-node specification\n+169 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, T& t)\n+170 {\n+171 return NodeTransformation::transform(s,t);\n+172 }\n+173\n+174 // delegate instance transformation to per-node specification\n+175 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, const T& t)\n+176 {\n+177 return NodeTransformation::transform(s,t);\n+178 }\n+179\n+180 // delegate instance transformation to per-node specification\n+181 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp, T& t)\n+182 {\n+183 return NodeTransformation::transform(sp,t);\n+184 }\n+185\n+186 // delegate instance transformation to per-node specification\n+187 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(std::shared_ptr sp, const T& t)\n+188 {\n+189 return NodeTransformation::transform(sp,t);\n+190 }\n+191\n+192 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n+sp, T& t)\n+193 {\n+194 return NodeTransformation::transform_storage(sp,t);\n+195 }\n+196\n+197 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n+sp, const T& t)\n+198 {\n+199 return NodeTransformation::transform_storage(sp,t);\n+200 }\n+201\n+202 };\n+203\n+204\n+205 // common implementation for non-recursive transformation of non-leaf nodes\n+206 template\n+207 struct TransformTreeNonRecursive\n+208 {\n+209 // get transformed type from specification\n+210 typedef typename LookupNodeTransformation>::type\n+NodeTransformation;\n+211\n+212 typedef typename NodeTransformation::transformed_type transformed_type;\n+213 typedef typename NodeTransformation::transformed_storage_type\n+transformed_storage_type;\n+214\n+215 // delegate instance transformation to per-node specification\n+216 static transformed_type transform(const S& s, T& t)\n+217 {\n+218 return NodeTransformation::transform(s,t);\n+219 }\n+220\n+221 // delegate instance transformation to per-node specification\n+222 static transformed_type transform(const S& s, const T& t)\n+223 {\n+224 return NodeTransformation::transform(s,t);\n+225 }\n+226\n+227 // delegate instance transformation to per-node specification\n+228 static transformed_type transform(std::shared_ptr sp, T& t)\n+229 {\n+230 return NodeTransformation::transform(sp,t);\n+231 }\n+232\n+233 // delegate instance transformation to per-node specification\n+234 static transformed_type transform(std::shared_ptr sp, const T& t)\n+235 {\n+236 return NodeTransformation::transform(sp,t);\n+237 }\n+238\n+239 static transformed_storage_type transform_storage(std::shared_ptr\n+sp, T& t)\n+240 {\n+241 return NodeTransformation::transform_storage(sp,t);\n+242 }\n+243\n+244 static transformed_storage_type transform_storage(std::shared_ptr\n+sp, const T& t)\n+245 {\n+246 return NodeTransformation::transform_storage(sp,t);\n+247 }\n+248\n+249 };\n+250\n+251\n+252 namespace Impl {\n+253\n+254 // Helper class to handle recursive power nodes\n+255 template\n+256 class RecursivePowerTransformTree\n+257 {\n+258 // We only know two types of tags!\n+259 static_assert(std::is_same_v or std::\n+is_same_v);\n+260\n+261 using ChildType = typename Source::ChildType;\n+262\n+263 // in case degree is dynamic, provid a vector correctly initialized\n+264 template\n+265 static auto node_storage_provider(const std::size_t& degree)\n+266 {\n+267 return std::vector(degree);\n+268 }\n+269\n+270 // in case degree is static, provid an array\n+271 template\n+272 static auto node_storage_provider(StaticIndex)\n+273 {\n+274 return std::array();\n+275 }\n+276\n+277 public:\n+278 // get transformed type from specification\n+279 // Handling this transformation in a way that makes the per-node\n+specification easy to write\n+280 // is a little involved:\n+281 // The problem is that the transformed power node must be parameterized on\n+the transformed child\n+282 // type. So we need to transform the child type and pass the transformed\n+child type to an inner\n+283 // template of the node transformation struct called result (see example of\n+such a specification\n+284 // further down).\n+285 using NodeTransformation = typename\n+LookupNodeTransformation>::\n+type;\n+286 using ChildNodeTransformation = typename\n+LookupNodeTransformation>::\n+type;\n+287\n+288 private:\n+289 // Since every child is same type, is enough to get transformation once\n+290 using ChildTreeTransformation = TransformTree,\n+293 ChildNodeTransformation::recursive>;\n+294\n+295 // Get transformed type of children\n+296 using transformed_child_type = typename ChildTreeTransformation::\n+transformed_type;\n+297 using transformed_child_storage_type = typename ChildTreeTransformation::\n+transformed_storage_type;\n+298 public:\n+299 // Apply transformation from children to current node\n+300 using transformed_type = typename NodeTransformation::template\n+result::type;\n+301 using transformed_storage_type = typename NodeTransformation::template\n+result::storage_type;\n+302\n+303 // Transform an instance of source tree.\n+304 static transformed_type transform(const Source& source, Transformation&\n+transformation)\n+305 {\n+306 auto children_storage = node_storage_provider>(source.degree());\n+307 for (std::size_t k = 0; k < source.degree(); ++k) {\n+308 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source.childStorage(k),transformation);\n+309 }\n+310 return NodeTransformation::transform\n+(source,transformation,children_storage);\n+311 }\n+312\n+313 // Transform an instance of source tree.\n+314 static transformed_type transform(const Source& source, const\n+Transformation& transformation)\n+315 {\n+316 auto children_storage = node_storage_provider>(source.degree());\n+317 for (std::size_t k = 0; k < source.degree(); ++k) {\n+318 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source.childStorage(k),transformation);\n+319 }\n+320 return NodeTransformation::transform\n+(source,transformation,children_storage);\n+321 }\n+322\n+323 // Transform an instance of source tree.\n+324 static transformed_type transform(std::shared_ptr source_ptr,\n+Transformation& transformation)\n+325 {\n+326 auto children_storage = node_storage_provider>(source_ptr->degree());\n+327 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n+328 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source_ptr->childStorage(k),transformation);\n+329 }\n+330 return NodeTransformation::transform\n+(source_ptr,transformation,children_storage);\n+331 }\n+332\n+333 // Transform an instance of source tree.\n+334 static transformed_type transform(std::shared_ptr source_ptr,\n+const Transformation& transformation)\n+335 {\n+336 auto children_storage = node_storage_provider>(source_ptr->degree());\n+337 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n+338 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source_ptr->childStorage(k),transformation);\n+339 }\n+340 return NodeTransformation::transform\n+(source_ptr,transformation,children_storage);\n+341 }\n+342\n+343 // Transform an instance of source tree ptr.\n+344 static transformed_storage_type transform_storage(std::shared_ptr source_ptr, Transformation& transformation)\n+345 {\n+346 auto children_storage =\n+node_storage_provider(source_ptr->degree());\n+347 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n+348 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source_ptr->childStorage(k),transformation);\n+349 }\n+350 return NodeTransformation::transform_storage\n+(source_ptr,transformation,children_storage);\n+351 }\n+352\n+353 // Transform an instance of source tree ptr.\n+354 static transformed_storage_type transform_storage(std::shared_ptr source_ptr, const Transformation& transformation)\n+355 {\n+356 auto children_storage =\n+node_storage_provider(source_ptr->degree());\n+357 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {\n+358 children_storage[k] = ChildTreeTransformation::transform_storage\n+(source_ptr->childStorage(k),transformation);\n+359 }\n+360 return NodeTransformation::transform_storage\n+(source_ptr,transformation,children_storage);\n+361 }\n+362\n+363 };\n+364 } // namespace Impl\n+365\n+366 // Recursive version of the PowerNode transformation for static nodes.\n+367 template\n+368 struct TransformTree\n+369 : public Impl::\n+RecursivePowerTransformTree\n+370 {};\n+371\n+372 // Recursive version of the DynamicPowerNode transformation for static\n+nodes.\n+373 template\n+374 struct TransformTree\n+375 : public Impl::\n+RecursivePowerTransformTree\n+376 {};\n+377\n+378 // non-recursive version of the PowerNode transformation.\n+379 template\n+380 struct TransformTree\n+381 : public TransformTreeNonRecursive\n+382 {};\n+383\n+384 // non-recursive version of the DynamicPowerNodeTag transformation.\n+385 template\n+386 struct TransformTree\n+387 : public TransformTreeNonRecursive\n+388 {};\n+389\n+390 // helper struct that does the actual transformation for a composite node.\n+We need this additional struct\n+391 // to extract the template argument list with the types of all children\n+from the node, which we cannot do\n+392 // directly in the transformation<> template, as the type passed to\n+transformation<> will usually be a\n+393 // derived type and will normally have more template arguments than just\n+the children. This declaration\n+394 // just introduces the type of the helper struct, we always instantiate the\n+specialization defined below;\n+395 template\n+396 struct transform_composite_node;\n+397\n+398 // specialized version of the helper struct which extracts the template\n+argument list with the children from\n+399 // its second template parameter, which has to be CompositeNode::\n+ChildTypes. Apart from that, the struct is\n+400 // similar to the one for a PowerNode, but it obviously delegates\n+transformation of the children to the TMP.\n+401 template\n+402 struct transform_composite_node,T>\n+403 {\n+404\n+405 // transformed type, using the same nested struct trick as the PowerNode\n+406 typedef ImplementationTag Tag;\n+407 typedef typename LookupNodeTransformation::type\n+NodeTransformation;\n+408 typedef typename NodeTransformation::template _\br_\be_\bs_\bu_\bl_\bt,\n+411 LookupNodeTransformation>::type::recursive\n+412 >::transformed_type...\n+413 >::type transformed_type;\n+414\n+415 typedef typename NodeTransformation::template _\br_\be_\bs_\bu_\bl_\bt,\n+418 LookupNodeTransformation>::type::recursive\n+419 >::transformed_type...\n+420 >::storage_type transformed_storage_type;\n+421\n+422 // Retrieve the transformation descriptor for the child with index i.\n+423 // This little helper improves really improves the readability of the\n+424 // transformation functions.\n+425 template\n+426 struct ChildTransformation\n+427 : public TransformTree::Type,\n+428 T,\n+429 NodeTag::Type>,\n+430 LookupNodeTransformation<\n+431 typename S::template Child::Type,\n+432 T,\n+433 ImplementationTag::Type>\n+434 >::type::recursive\n+435 >\n+436 {};\n+437\n+438 template\n+439 static void setElement(Tuple& tuple, Value&& value)\n+440 {\n+441 std::get(tuple) = std::forward(value);\n+442 }\n+443\n+444 template\n+445 static transformed_type transform(const S& s, Trafo&& t, std::\n+index_sequence indices)\n+446 {\n+447 std::tuple::transformed_storage_type...>\n+storage;\n+448 Dune::Hybrid::Impl::evaluateFoldExpression({(setElement(storage,\n+ChildTransformation::transform_storage(s.template childStorage(), std::\n+forward(t))),0)...});\n+449 return NodeTransformation::transform(s, std::forward(t), std::get\n+(storage)...);\n+450 }\n+451\n+452 template\n+453 static transformed_storage_type transform_storage(std::shared_ptr\n+sp, Trafo&& t, std::index_sequence indices)\n+454 {\n+455 std::tuple::transformed_storage_type...>\n+storage;\n+456 Dune::Hybrid::Impl::evaluateFoldExpression({(setElement(storage,\n+ChildTransformation::transform_storage(sp->template childStorage(), std::\n+forward(t))),0)...});\n+457 return NodeTransformation::transform_storage(sp, std::forward(t),\n+std::get(storage)...);\n+458 }\n+459 };\n+460\n+461\n+462 // the specialization of transformation<> for the CompositeNode. This just\n+extracts the\n+463 // CompositeNode::ChildTypes member and forwards to the helper struct\n+464 template\n+465 struct TransformTree\n+466 {\n+467\n+468 private:\n+469\n+470 typedef typename S::ChildTypes ChildTypes;\n+471\n+472 static auto child_indices()\n+473 {\n+474 return std::make_index_sequence();\n+475 }\n+476\n+477 public:\n+478\n+479 typedef typename transform_composite_node::transformed_type\n+transformed_type;\n+480 typedef typename transform_composite_node::\n+transformed_storage_type transformed_storage_type;\n+481\n+482 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, T& t)\n+483 {\n+484 return transform_composite_node::transform\n+(s,t,child_indices());\n+485 }\n+486\n+487 static transformed_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm(const S& s, const T& t)\n+488 {\n+489 return transform_composite_node::transform\n+(s,t,child_indices());\n+490 }\n+491\n+492 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n+sp, T& t)\n+493 {\n+494 return transform_composite_node::transform_storage\n+(sp,t,child_indices());\n+495 }\n+496\n+497 static transformed_storage_type _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be(std::shared_ptr\n+sp, const T& t)\n+498 {\n+499 return transform_composite_node::transform_storage\n+(sp,t,child_indices());\n+500 }\n+501\n+502 };\n+503\n+504 // non-recursive version of the CompositeNode transformation.\n+505 template\n+506 struct TransformTree\n+507 : public TransformTreeNonRecursive\n+508 {};\n+509\n+510#endif // DOXYGEN\n+511\n+513\n+514 } // namespace TypeTree\n+515} //namespace Dune\n+516\n+517#endif // DUNE_TYPETREE_TRANSFORMATION_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bD_\be_\bg_\br_\be_\be\n-decltype(Node::degree()) StaticDegree\n-Returns the statically known degree of the given Node type as a std::\n-integral_constant.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:107\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+void registerNodeTransformation(SourceNode *, Transformation *, Tag *)\n+Register transformation descriptor to transform SourceNode with Transformation.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bt_\by_\bp_\be\n-TransformedNode transformed_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\b__\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< transformed_type > transformed_storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(std::shared_ptr< const SourceNode > s, const\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be\n+Transform a TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be\n+type Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(std::shared_ptr< const SourceTree > sp,\n Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+Apply transformation to an existing tree s.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:134\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(std::shared_ptr< const SourceTree > sp, const\n+Transformation &t=Transformation())\n+Apply transformation to an existing tree s.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(const SourceTree &s, Transformation &t)\n+Apply transformation to an existing tree s.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:122\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\by_\bp_\be\n+transformed_type type\n+The type of the transformed tree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n+static transformed_type transform(const SourceTree &s, const Transformation\n+&t=Transformation())\n+Apply transformation to an existing tree s.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n+static transformed_storage_type transform_storage(std::shared_ptr< const\n+SourceTree > sp, const Transformation &t=Transformation())\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n static transformed_storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static transformed_type transform(const SourceNode &s, const Transformation &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC\n->, result< TC >::degree > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(std::shared_ptr< const SourceNode > s,\n-const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC\n->::degree > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(const SourceNode &s, const Transformation\n-&t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNodeTemplate< TC >::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static const std::size_t degree\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(std::shared_ptr< const SourceNode > s,\n-const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC >::type transform(const SourceNode &s, const Transformation\n-&t, const std::vector< std::shared_ptr< TC > > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:\n-_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC\n-> > &children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNodeTemplate< TC >::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:\n-_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC... >::type transform(const SourceNode &s, const\n-Transformation &t, std::shared_ptr< TC >... children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:\n-_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\b__\bs_\bt_\bo_\br_\ba_\bg_\be\n-static result< TC... >::storage_type transform_storage(std::shared_ptr< const\n-SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm\n-static result< TC... >::type transform(std::shared_ptr< const SourceNode > s,\n-const Transformation &t, std::shared_ptr< TC >... children)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be\n-static const bool recursive\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:152\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bt_\by_\bp_\be\n-TransformedNodeTemplate< TC... >::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\be_\bm_\bp_\bl_\ba_\bt_\bi_\bz_\be_\bd_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b:_\b:\n-_\bs_\bt_\bo_\br_\ba_\bg_\be_\b__\bt_\by_\bp_\be\n-std::shared_ptr< type > storage_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn generictransformationdescriptors.hh:186\n+SourceTree > sp, Transformation &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transformation.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be_\b__\bi_\bf_\b__\bm_\be_\bt_\ba_\b__\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Meta function that evaluates its argument iff it inherits from meta_function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:142\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00065.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00065.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: pairtraversal.hh File Reference\n+dune-typetree: accumulate_static.hh File Reference\n \n \n \n \n \n \n \n@@ -70,47 +70,135 @@\n
    \n \n
    \n
    \n
    \n \n-
    pairtraversal.hh File Reference
    \n+
    accumulate_static.hh File Reference
    \n
    \n
    \n-
    #include <dune/common/std/type_traits.hh>
    \n-#include <dune/typetree/nodeinterface.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/treepath.hh>
    \n-#include <dune/typetree/visitor.hh>
    \n-#include <dune/typetree/traversal.hh>
    \n+
    #include <dune/common/typetraits.hh>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/treepath.hh>
    \n+#include <dune/typetree/utility.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::TypeTree::or_< result_type >
     Statically combine two values of type result_type using ||. More...
     
    struct  Dune::TypeTree::or_< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::and_< result_type >
     Statically combine two values of type result_type using &&. More...
     
    struct  Dune::TypeTree::and_< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::plus< result_type >
     Statically combine two values of type result_type using +. More...
     
    struct  Dune::TypeTree::plus< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::minus< result_type >
     Statically combine two values of type result_type using -. More...
     
    struct  Dune::TypeTree::minus< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::multiply< result_type >
     Statically combine two values of type result_type using *. More...
     
    struct  Dune::TypeTree::multiply< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::min< result_type >
     Statically combine two values of type result_type by returning their minimum. More...
     
    struct  Dune::TypeTree::min< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::max< result_type >
     Statically combine two values of type result_type by returning their maximum. More...
     
    struct  Dune::TypeTree::max< result_type >::reduce< r1, r2 >
     
    struct  Dune::TypeTree::AccumulateValue< Tree, Functor, Reduction, startValue, ParentChildReduction >
     Statically accumulate a value over the nodes of a TypeTree. More...
     
    struct  Dune::TypeTree::TypeAccumulationPolicy< Functor, Reduction, StartType, ParentChildReduction, ReductionAlgorithm >
     
    struct  Dune::TypeTree::AccumulateType< Tree, Policy >
     Statically accumulate a type over the nodes of a TypeTree. More...
     
    \n \n \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::Detail
    namespace  Dune::TypeTree::Experimental
     
    \n \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+

    \n Functions

    template<class T1 , class T2 , class TreePath , class V , std::enable_if_t<(std::decay_t< T1 >::isLeaf or std::decay_t< T2 >::isLeaf), int > = 0>
    void Dune::TypeTree::Detail::applyToTreePair (T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)
     
    template<typename Tree1 , typename Tree2 , typename Visitor >
    void Dune::TypeTree::applyToTreePair (Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)
     Apply visitor to a pair of TypeTrees.
     
    template<typename Tree , typename Visitor , typename Init >
    auto Dune::TypeTree::Experimental::hybridApplyToTree (Tree &&tree, Visitor &&visitor, Init &&init)
     Apply hybrid visitor to TypeTree.
     
    \n+

    Variable Documentation

    \n+\n+

    ◆ child_result

    \n+\n+
    \n+
    \n+\n+ \n+ \n+ \n+ \n
    \n+ \n+ \n+ \n+ \n+
    const result_type child_result = accumulate_value<child,Functor,Reduction,ParentChildReduction,current_value,child_tree_path,NodeTag<child>>::result
    \n+
    \n+static
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ result

    \n+\n+
    \n+
    \n+\n+ \n+ \n+ \n+ \n+
    \n+ \n+ \n+ \n+ \n+
    const result_type result = current_value
    \n+
    \n+static
    \n+
    \n+\n+
    \n+
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,84 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-pairtraversal.hh File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+accumulate_static.hh File Reference\n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type using ||. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type using &&. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type using +. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type using -. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type using *. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type by returning their\n+ minimum. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statically combine two values of type result_type by returning their\n+ maximum. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b<_\b _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b<_\b _\br_\b1_\b,_\b _\br_\b2_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bF_\bu_\bn_\bc_\bt_\bo_\br_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bs_\bt_\ba_\br_\bt_\bV_\ba_\bl_\bu_\be_\b,\n+ _\bP_\ba_\br_\be_\bn_\bt_\bC_\bh_\bi_\bl_\bd_\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b _\b>\n+\u00a0 Statically accumulate a value over the nodes of a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bF_\bu_\bn_\bc_\bt_\bo_\br_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bS_\bt_\ba_\br_\bt_\bT_\by_\bp_\be_\b,\n+ _\bP_\ba_\br_\be_\bn_\bt_\bC_\bh_\bi_\bl_\bd_\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bR_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be_\b<_\b _\bT_\br_\be_\be_\b,_\b _\bP_\bo_\bl_\bi_\bc_\by_\b _\b>\n+\u00a0 Statically accumulate a type over the nodes of a _\bT_\by_\bp_\be_\bT_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template::isLeaf or std::decay_t< T2 >::isLeaf), int > = 0>\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br (T1 &&tree1, T2 &&tree2, TreePath\n- _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V &&visitor)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br (Tree1 &&tree1, Tree2 &&tree2, Visitor\n- &&visitor)\n-\u00a0 Apply visitor to a pair of TypeTrees.\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bp_\be_\br_\bi_\bm_\be_\bn_\bt_\ba_\bl_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bA_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (Tree &&tree, Visitor\n+ &&visitor, Init &&init)\n+\u00a0 Apply hybrid visitor to _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n \u00a0\n+*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0c\bch\bhi\bil\bld\bd_\b_r\bre\bes\bsu\bul\blt\bt *\b**\b**\b**\b**\b*\n+const result_type child_result =\n+accumulate_value>_\b:_\b: static\n+_\br_\be_\bs_\bu_\bl_\bt\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bre\bes\bsu\bul\blt\bt *\b**\b**\b**\b**\b*\n+const result_type result = current_value static\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00065_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00065_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: pairtraversal.hh Source File\n+dune-typetree: accumulate_static.hh Source File\n \n \n \n \n \n \n \n@@ -74,152 +74,595 @@\n \n
    \n \n
    \n
    \n
    \n-
    pairtraversal.hh
    \n+
    accumulate_static.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n-
    7#define DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n+
    6#ifndef DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n+
    7#define DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n
    8
    \n-
    9#include <dune/common/std/type_traits.hh>
    \n-
    10
    \n-\n-\n-\n-\n-\n-
    16
    \n-
    17namespace Dune {
    \n-
    18 namespace TypeTree {
    \n-
    19
    \n-
    \n-
    25 namespace Detail {
    \n-
    26
    \n-
    27 /* The signature is the same as for the public applyToTreePair
    \n-
    28 * function in Dune::Typtree, despite the additionally passed
    \n-
    29 * treePath argument. The path passed here is associated to
    \n-
    30 * the tree and the relative paths of the children (wrt. to tree)
    \n-
    31 * are appended to this. Hence the behavior of the public function
    \n-
    32 * is resembled by passing an empty treePath.
    \n-
    33 */
    \n+
    9#include <dune/common/typetraits.hh>
    \n+\n+\n+\n+\n+
    14
    \n+
    15
    \n+
    \n+
    16namespace Dune {
    \n+
    \n+
    17 namespace TypeTree {
    \n+
    18
    \n+
    25 template<typename result_type>
    \n+
    \n+
    26 struct or_
    \n+
    27 {
    \n+
    28 template<result_type r1, result_type r2>
    \n+
    \n+
    29 struct reduce
    \n+
    30 {
    \n+
    31 static const result_type result = r1 || r2;
    \n+
    32 };
    \n+
    \n+
    33 };
    \n+
    \n
    34
    \n-
    35 /*
    \n-
    36 * This is the overload for leaf traversal
    \n-
    37 */
    \n-
    38 template<class T1, class T2, class TreePath, class V,
    \n-
    39 std::enable_if_t<(std::decay_t<T1>::isLeaf or std::decay_t<T2>::isLeaf), int> = 0>
    \n-
    \n-
    40 void applyToTreePair(T1&& tree1, T2&& tree2, TreePath treePath, V&& visitor)
    \n+
    36 template<typename result_type>
    \n+
    \n+
    37 struct and_
    \n+
    38 {
    \n+
    39 template<result_type r1, result_type r2>
    \n+
    \n+
    40 struct reduce
    \n
    41 {
    \n-
    42 visitor.leaf(tree1, tree2, treePath);
    \n-
    43 }
    \n+
    42 static const result_type result = r1 && r2;
    \n+
    43 };
    \n+
    \n+
    44 };
    \n+
    \n+
    45
    \n+
    47 template<typename result_type>
    \n+
    \n+
    48 struct plus
    \n+
    49 {
    \n+
    50 template<result_type r1, result_type r2>
    \n+
    \n+
    51 struct reduce
    \n+
    52 {
    \n+
    53 static const result_type result = r1 + r2;
    \n+
    54 };
    \n+
    \n+
    55 };
    \n+
    \n+
    56
    \n+
    58 template<typename result_type>
    \n+
    \n+
    59 struct minus
    \n+
    60 {
    \n+
    61 template<result_type r1, result_type r2>
    \n+
    \n+
    62 struct reduce
    \n+
    63 {
    \n+
    64 static const result_type result = r1 - r2;
    \n+
    65 };
    \n+
    \n+
    66 };
    \n+
    \n+
    67
    \n+
    69 template<typename result_type>
    \n+
    \n+
    70 struct multiply
    \n+
    71 {
    \n+
    72 template<result_type r1, result_type r2>
    \n+
    \n+
    73 struct reduce
    \n+
    74 {
    \n+
    75 static const result_type result = r1 * r2;
    \n+
    76 };
    \n+
    \n+
    77 };
    \n+
    \n+
    78
    \n+
    80 template<typename result_type>
    \n+
    \n+
    81 struct min
    \n+
    82 {
    \n+
    83 template<result_type r1, result_type r2>
    \n+
    \n+
    84 struct reduce
    \n+
    85 {
    \n+
    86 static const result_type result = r1 < r2 ? r1 : r2;
    \n+
    87 };
    \n
    \n-
    44
    \n-
    45 /*
    \n-
    46 * This is the general overload doing static child traversal.
    \n-
    47 */
    \n-
    48 template<class T1, class T2, class TreePath, class V,
    \n-
    49 std::enable_if_t<not(std::decay_t<T1>::isLeaf or std::decay_t<T2>::isLeaf), int> = 0>
    \n-
    50 void applyToTreePair(T1&& tree1, T2&& tree2, TreePath treePath, V&& visitor)
    \n-
    51 {
    \n-
    52 // Do we really want to take care for const-ness of the Tree
    \n-
    53 // when instanciating VisitChild below? I'd rather expect this:
    \n-
    54 // using Tree1 = std::decay_t<T1>;
    \n-
    55 // using Tree2 = std::decay_t<T2>;
    \n-
    56 // using Visitor = std::decay_t<V>;
    \n-
    57 using Tree1 = std::remove_reference_t<T1>;
    \n-
    58 using Tree2 = std::remove_reference_t<T2>;
    \n-
    59 using Visitor = std::remove_reference_t<V>;
    \n-
    60 visitor.pre(tree1, tree2, treePath);
    \n-
    61
    \n-
    62 // check which type of traversal is supported by the trees
    \n-
    63 using allowDynamicTraversal = std::conjunction<
    \n-
    64 Dune::Std::is_detected<DynamicTraversalConcept,Tree1>,
    \n-
    65 Dune::Std::is_detected<DynamicTraversalConcept,Tree2>>;
    \n-
    66 using allowStaticTraversal = std::conjunction<
    \n-
    67 Dune::Std::is_detected<StaticTraversalConcept,Tree1>,
    \n-
    68 Dune::Std::is_detected<StaticTraversalConcept,Tree2>>;
    \n-
    69
    \n-
    70 // both trees must support either dynamic or static traversal
    \n-
    71 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n-
    72
    \n-
    73 // the visitor may specify preferred dynamic traversal
    \n-
    74 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n-
    75
    \n-
    76 // create a dynamic or static index range
    \n-
    77 auto indices = [&]{
    \n-
    78 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)
    \n-
    79 return Dune::range(std::size_t(tree1.degree()));
    \n-
    80 else
    \n-
    81 return Dune::range(tree1.degree());
    \n-
    82 }();
    \n-
    83
    \n-
    84 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {
    \n-
    85 Dune::Hybrid::forEach(indices, [&](auto i) {
    \n-
    86 auto&& child1 = tree1.child(i);
    \n-
    87 auto&& child2 = tree2.child(i);
    \n-
    88 using Child1 = std::decay_t<decltype(child1)>;
    \n-
    89 using Child2 = std::decay_t<decltype(child2)>;
    \n-
    90
    \n-
    91 visitor.beforeChild(tree1, child1, tree2, child2, treePath, i);
    \n-
    92
    \n-
    93 // This requires that visitor.in(...) can always be instantiated,
    \n-
    94 // even if there's a single child only.
    \n-
    95 if (i>0)
    \n-
    96 visitor.in(tree1, tree2, treePath);
    \n-
    97
    \n-
    98 constexpr bool visitChild = Visitor::template VisitChild<Tree1,Child1,Tree2,Child2,TreePath>::value;
    \n-
    99 if constexpr(visitChild) {
    \n-
    100 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n-
    101 applyToTreePair(child1, child2, childTreePath, visitor);
    \n-
    102 }
    \n+
    88 };
    \n+
    \n+
    89
    \n+
    91 template<typename result_type>
    \n+
    \n+
    92 struct max
    \n+
    93 {
    \n+
    94 template<result_type r1, result_type r2>
    \n+
    \n+
    95 struct reduce
    \n+
    96 {
    \n+
    97 static const result_type result = r1 > r2 ? r1 : r2;
    \n+
    98 };
    \n+
    \n+
    99 };
    \n+
    \n+
    100
    \n+
    101
    \n+
    102 namespace {
    \n
    103
    \n-
    104 visitor.afterChild(tree1, child1, tree2, child2, treePath, i);
    \n-
    105 });
    \n-
    106 }
    \n-
    107 visitor.post(tree1, tree2, treePath);
    \n-
    108 }
    \n-
    109
    \n-
    110 } // namespace Detail
    \n-
    \n-
    111
    \n-
    113
    \n-
    127 template<typename Tree1, typename Tree2, typename Visitor>
    \n-
    \n-
    128 void applyToTreePair(Tree1&& tree1, Tree2&& tree2, Visitor&& visitor)
    \n-
    129 {
    \n-
    130 Detail::applyToTreePair(tree1, tree2, hybridTreePath(), visitor);
    \n-
    131 }
    \n-
    \n-
    132
    \n-
    134
    \n-
    135 } // namespace TypeTree
    \n-
    136} //namespace Dune
    \n-
    137
    \n-
    138#endif // DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n-\n-\n-\n-\n-\n-
    void applyToTreePair(Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)
    Apply visitor to a pair of TypeTrees.
    Definition pairtraversal.hh:128
    \n+
    104 // implementation of the traversal algorithm
    \n+
    105
    \n+
    107 template<typename Node, typename Functor, typename Reduction, typename Functor::result_type current_value, typename TreePath, bool doVisit>
    \n+
    108 struct accumulate_node_helper
    \n+
    109 {
    \n+
    110
    \n+
    111 typedef typename Functor::result_type result_type;
    \n+
    112
    \n+
    113 static const result_type result = current_value;
    \n+
    114
    \n+
    115 };
    \n+
    116
    \n+
    118 template<typename Node, typename Functor, typename Reduction, typename Functor::result_type current_value, typename TreePath>
    \n+
    119 struct accumulate_node_helper<Node,Functor,Reduction,current_value,TreePath,true>
    \n+
    120 {
    \n+
    121
    \n+
    122 typedef typename Functor::result_type result_type;
    \n+
    123
    \n+
    124 static const result_type result = Reduction::template reduce<current_value,Functor::template visit<Node,TreePath>::result>::result;
    \n+
    125
    \n+
    126 };
    \n+
    127
    \n+
    129 template<typename Tree, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, typename Tag>
    \n+
    130 struct accumulate_value;
    \n+
    131
    \n+
    133 template<typename LeafNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n+
    134 struct accumulate_value<LeafNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,LeafNodeTag>
    \n+
    135 {
    \n+
    136
    \n+
    137 typedef typename Functor::result_type result_type;
    \n+
    138
    \n+
    139 static const result_type result =
    \n+
    140
    \n+
    141 accumulate_node_helper<LeafNode,Functor,Reduction,current_value,TreePath,Functor::template doVisit<LeafNode,TreePath>::value>::result;
    \n+
    142
    \n+
    143 };
    \n+
    144
    \n+
    146 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, std::size_t i, std::size_t n>
    \n+
    147 struct accumulate_over_children
    \n+
    148 {
    \n+
    149
    \n+
    150 typedef typename Functor::result_type result_type;
    \n+
    151
    \n+
    152 typedef decltype(push_back(TreePath{},index_constant<i>{})) child_tree_path;
    \n+
    153
    \n+
    154 typedef typename Node::template Child<i>::Type child;
    \n+
    155
    \n+
    156 static const result_type child_result = accumulate_value<child,Functor,Reduction,ParentChildReduction,current_value,child_tree_path,NodeTag<child>>::result;
    \n+
    157
    \n+
    158 static const result_type result = accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,child_result,TreePath,i+1,n>::result;
    \n+
    159
    \n+
    160 };
    \n+
    161
    \n+
    163 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath, std::size_t n>
    \n+
    164 struct accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,current_value,TreePath,n,n>
    \n+
    165 {
    \n+
    166
    \n+
    167 typedef typename Functor::result_type result_type;
    \n+
    168
    \n+
    169 static const result_type result = current_value;
    \n+
    170
    \n+
    171 };
    \n+
    172
    \n+
    175 template<typename Node, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n+
    176 struct accumulate_value_generic_composite_node
    \n+
    177 {
    \n+
    178
    \n+
    179 typedef typename Functor::result_type result_type;
    \n+
    180
    \n+
    181 static const result_type child_result = accumulate_over_children<Node,Functor,Reduction,ParentChildReduction,current_value,TreePath,0,StaticDegree<Node>::value>::result;
    \n+
    182
    \n+
    183 static const result_type result =
    \n+
    184 accumulate_node_helper<Node,Functor,ParentChildReduction,child_result,TreePath,Functor::template doVisit<Node,TreePath>::value>::result;
    \n+
    185
    \n+
    186
    \n+
    187 };
    \n+
    188
    \n+
    190 template<typename PowerNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n+
    191 struct accumulate_value<PowerNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,PowerNodeTag>
    \n+
    192 : public accumulate_value_generic_composite_node<PowerNode,Functor,Reduction,ParentChildReduction,current_value,TreePath>
    \n+
    193 {};
    \n+
    194
    \n+
    196 template<typename CompositeNode, typename Functor, typename Reduction, typename ParentChildReduction, typename Functor::result_type current_value, typename TreePath>
    \n+
    197 struct accumulate_value<CompositeNode,Functor,Reduction,ParentChildReduction,current_value,TreePath,CompositeNodeTag>
    \n+
    198 : public accumulate_value_generic_composite_node<CompositeNode,Functor,Reduction,ParentChildReduction,current_value,TreePath>
    \n+
    199 {};
    \n+
    200
    \n+
    201 } // anonymous namespace
    \n+
    202
    \n+
    204
    \n+
    260 template<typename Tree, typename Functor, typename Reduction, typename Functor::result_type startValue, typename ParentChildReduction = Reduction>
    \n+
    \n+\n+
    262 {
    \n+
    263
    \n+
    265 typedef typename Functor::result_type result_type;
    \n+
    266
    \n+
    268 static const result_type result = accumulate_value<Tree,Functor,Reduction,ParentChildReduction,startValue,HybridTreePath<>,NodeTag<Tree>>::result;
    \n+
    269
    \n+
    270 };
    \n+
    \n+
    271
    \n+
    274 struct flattened_reduction;
    \n+
    275
    \n+
    278 struct bottom_up_reduction;
    \n+
    279
    \n+
    280 namespace {
    \n+
    281
    \n+
    282 // implementation of the traversal algorithm
    \n+
    283
    \n+
    286 template<typename Node, typename Functor, typename Reduction, typename current_type, typename TreePath, bool doVisit>
    \n+
    287 struct accumulate_type_node_helper
    \n+
    288 {
    \n+
    289
    \n+
    290 typedef current_type type;
    \n+
    291
    \n+
    292 };
    \n+
    293
    \n+
    295 template<typename Node, typename Functor, typename Reduction, typename current_type, typename TreePath>
    \n+
    296 struct accumulate_type_node_helper<Node,Functor,Reduction,current_type,TreePath,true>
    \n+
    297 {
    \n+
    298
    \n+
    299 typedef typename Reduction::template reduce<
    \n+
    300 current_type,
    \n+
    301 typename Functor::template visit<
    \n+
    302 Node,
    \n+
    303 TreePath
    \n+
    304 >::type
    \n+
    305 >::type type;
    \n+
    306
    \n+
    307 };
    \n+
    308
    \n+
    310 template<typename Tree, typename Policy, typename current_type, typename TreePath, typename Tag>
    \n+
    311 struct accumulate_type;
    \n+
    312
    \n+
    314 template<typename LeafNode, typename Policy, typename current_type, typename TreePath>
    \n+
    315 struct accumulate_type<LeafNode,Policy,current_type,TreePath,LeafNodeTag>
    \n+
    316 {
    \n+
    317
    \n+
    318 typedef typename accumulate_type_node_helper<
    \n+
    319 LeafNode,
    \n+
    320 typename Policy::functor,
    \n+
    321 typename Policy::sibling_reduction,
    \n+
    322 current_type,
    \n+
    323 TreePath,
    \n+
    324 Policy::functor::template doVisit<
    \n+
    325 LeafNode,
    \n+
    326 TreePath>::value
    \n+
    327 >::type type;
    \n+
    328
    \n+
    329 };
    \n+
    330
    \n+
    331
    \n+
    334 template<typename current_type, typename tree_path, typename start_type, typename reduction_strategy>
    \n+
    335 struct propagate_type_down_tree;
    \n+
    336
    \n+
    338 template<typename current_type, typename tree_path, typename start_type>
    \n+
    339 struct propagate_type_down_tree<
    \n+
    340 current_type,
    \n+
    341 tree_path,
    \n+
    342 start_type,
    \n+
    343 bottom_up_reduction
    \n+
    344 >
    \n+
    345 {
    \n+
    346 typedef current_type type;
    \n+
    347 };
    \n+
    348
    \n+
    350 template<typename current_type, typename tree_path, typename start_type>
    \n+
    351 struct propagate_type_down_tree<
    \n+
    352 current_type,
    \n+
    353 tree_path,
    \n+
    354 start_type,
    \n+
    355 flattened_reduction
    \n+
    356 >
    \n+
    357 {
    \n+
    358 typedef typename std::conditional<
    \n+
    359 TreePathBack<tree_path>::value == 0,
    \n+
    360 start_type,
    \n+
    361 current_type
    \n+
    362 >::type type;
    \n+
    363 };
    \n+
    364
    \n+
    365
    \n+
    367 template<typename Node, typename Policy, typename current_type, typename TreePath, std::size_t i, std::size_t n>
    \n+
    368 struct accumulate_type_over_children
    \n+
    369 {
    \n+
    370
    \n+
    371 typedef decltype(push_back(TreePath{},index_constant<i>{})) child_tree_path;
    \n+
    372
    \n+
    373 typedef typename Node::template Child<i>::Type child;
    \n+
    374
    \n+
    375 typedef typename accumulate_type<
    \n+
    376 child,
    \n+
    377 Policy,
    \n+
    378 // apply reduction choice (flat / hierarchic)
    \n+
    379 typename propagate_type_down_tree<
    \n+
    380 current_type,
    \n+
    381 child_tree_path,
    \n+
    382 typename Policy::start_type,
    \n+
    383 typename Policy::reduction_strategy
    \n+
    384 >::type,
    \n+
    385 child_tree_path,
    \n+
    386 NodeTag<child>
    \n+
    387 >::type child_result_type;
    \n+
    388
    \n+
    389 typedef typename accumulate_type_over_children<
    \n+
    390 Node,
    \n+
    391 Policy,
    \n+
    392 child_result_type,
    \n+
    393 TreePath,
    \n+
    394 i+1,
    \n+
    395 n
    \n+
    396 >::type type;
    \n+
    397
    \n+
    398 };
    \n+
    399
    \n+
    401 template<typename Node, typename Policy, typename current_type, typename TreePath, std::size_t n>
    \n+
    402 struct accumulate_type_over_children<Node,Policy,current_type,TreePath,n,n>
    \n+
    403 {
    \n+
    404
    \n+
    405 typedef current_type type;
    \n+
    406
    \n+
    407 };
    \n+
    408
    \n+
    409
    \n+
    412 template<typename Node, typename Policy, typename current_type, typename TreePath>
    \n+
    413 struct accumulate_type_generic_composite_node
    \n+
    414 {
    \n+
    415
    \n+
    416 typedef typename accumulate_type_over_children<
    \n+
    417 Node,
    \n+
    418 Policy,
    \n+
    419 current_type,
    \n+
    420 TreePath,
    \n+
    421 0,
    \n+
    422 StaticDegree<Node>::value
    \n+
    423 >::type children_result_type;
    \n+
    424
    \n+
    425 typedef typename accumulate_type_node_helper<
    \n+
    426 Node,
    \n+
    427 typename Policy::functor,
    \n+
    428 typename Policy::parent_child_reduction,
    \n+
    429 children_result_type,
    \n+
    430 TreePath,
    \n+
    431 Policy::functor::template doVisit<
    \n+
    432 Node,
    \n+
    433 TreePath
    \n+
    434 >::value
    \n+
    435 >::type type;
    \n+
    436
    \n+
    437 };
    \n+
    438
    \n+
    440 template<typename PowerNode, typename Policy, typename current_type, typename TreePath>
    \n+
    441 struct accumulate_type<PowerNode,Policy,current_type,TreePath,PowerNodeTag>
    \n+
    442 : public accumulate_type_generic_composite_node<PowerNode,Policy,current_type,TreePath>
    \n+
    443 {};
    \n+
    444
    \n+
    446 template<typename CompositeNode, typename Policy, typename current_type, typename TreePath>
    \n+
    447 struct accumulate_type<CompositeNode,Policy,current_type,TreePath,CompositeNodeTag>
    \n+
    448 : public accumulate_type_generic_composite_node<CompositeNode,Policy,current_type,TreePath>
    \n+
    449 {};
    \n+
    450
    \n+
    451 } // anonymous namespace
    \n+
    452
    \n+
    453
    \n+
    461 template<
    \n+
    462 typename Functor,
    \n+
    463 typename Reduction,
    \n+
    464 typename StartType,
    \n+
    465 typename ParentChildReduction = Reduction,
    \n+
    466 typename ReductionAlgorithm = flattened_reduction
    \n+
    467 >
    \n+
    \n+\n+
    469 {
    \n+
    470
    \n+
    498 typedef Functor functor;
    \n+
    499
    \n+
    519 typedef Reduction sibling_reduction;
    \n+
    520
    \n+
    527 typedef ParentChildReduction parent_child_reduction;
    \n+
    528
    \n+
    535 typedef StartType start_type;
    \n+
    536
    \n+
    541 typedef ReductionAlgorithm reduction_strategy;
    \n+
    542 };
    \n+
    \n+
    543
    \n+
    544
    \n+
    546
    \n+
    554 template<typename Tree, typename Policy>
    \n+
    \n+\n+
    556 {
    \n+
    557
    \n+
    559 typedef typename accumulate_type<
    \n+
    560 Tree,
    \n+
    561 Policy,
    \n+
    562 typename Policy::start_type,
    \n+\n+\n+
    565 >::type type;
    \n+
    566
    \n+
    567 };
    \n+
    \n+
    568
    \n+
    569
    \n+
    570
    \n+
    571
    \n+
    572
    \n+
    573 /***************************************************/
    \n+
    574
    \n+
    \n+
    575 namespace Experimental {
    \n+
    576 namespace Impl {
    \n+
    577
    \n+
    579 template<class T, class TreePath, class V, class U,
    \n+
    580 std::enable_if_t<std::decay_t<T>::isLeaf, int> = 0>
    \n+
    581 auto hybridApplyToTree(T&& tree, TreePath treePath, V&& visitor, U&& current_val)
    \n+
    582 {
    \n+
    583 return visitor.leaf(tree, treePath, std::forward<U>(current_val));
    \n+
    584 }
    \n+
    585
    \n+
    587 template<class T, class TreePath, class V, class U,
    \n+
    588 std::enable_if_t<not std::decay_t<T>::isLeaf, int> = 0>
    \n+
    589 auto hybridApplyToTree(T&& tree, TreePath treePath, V&& visitor, U&& current_val)
    \n+
    590 {
    \n+
    591 using Tree = std::remove_reference_t<T>;
    \n+
    592 using Visitor = std::remove_reference_t<V>;
    \n+
    593 auto pre_val = visitor.pre(tree, treePath, std::forward<U>(current_val));
    \n+
    594
    \n+
    595 // check which type of traversal is supported by the tree
    \n+
    596 using allowDynamicTraversal = Dune::Std::is_detected<Detail::DynamicTraversalConcept,Tree>;
    \n+
    597 using allowStaticTraversal = Dune::Std::is_detected<Detail::StaticTraversalConcept,Tree>;
    \n+
    598
    \n+
    599 // the tree must support either dynamic or static traversal
    \n+
    600 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n+
    601
    \n+
    602 // the visitor may specify preferred dynamic traversal
    \n+
    603 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n+
    604
    \n+
    605 // declare rule that applies visitor and current value to a child i. Returns next value
    \n+
    606 auto apply_i = [&](auto&& value, const auto& i){
    \n+
    607 auto&& child = tree.child(i);
    \n+
    608 using Child = std::decay_t<decltype(child)>;
    \n+
    609
    \n+
    610 auto val_before = visitor.beforeChild(tree, child, treePath, i, std::move(value));
    \n+
    611
    \n+
    612 // visits between children
    \n+
    613 auto val_in = Hybrid::ifElse(
    \n+
    614 Hybrid::equal_to(i,Indices::_0),
    \n+
    615 [&](auto id){return std::move(val_before);},
    \n+
    616 [&](auto id){return visitor.in(tree, treePath, std::move(val_before));}
    \n+
    617 );
    \n+
    618
    \n+
    619 constexpr bool visitChild = Visitor::template VisitChild<Tree,Child,TreePath>::value;
    \n+
    620 auto val_visit = [&](){
    \n+
    621 if constexpr (visitChild) {
    \n+
    622 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n+
    623 return hybridApplyToTree(child, childTreePath, visitor, std::move(val_in));
    \n+
    624 }
    \n+
    625 else
    \n+
    626 return std::move(val_in);
    \n+
    627 }();
    \n+
    628
    \n+
    629 return visitor.afterChild(tree, child, treePath, i, std::move(val_visit));
    \n+
    630 };
    \n+
    631
    \n+
    632 // apply visitor to children
    \n+
    633 auto in_val = [&](){
    \n+
    634 if constexpr (allowStaticTraversal::value && not preferDynamicTraversal::value) {
    \n+
    635 // get list of static indices
    \n+
    636 auto indices = std::make_index_sequence<Tree::degree()>{};
    \n+
    637
    \n+
    638 // unfold apply_i left to right
    \n+
    639 return unpackIntegerSequence([&](auto... i) {
    \n+
    659 return left_fold(std::move(apply_i),std::move(pre_val), i...);
    \n+
    660 }, indices);
    \n+
    661
    \n+
    662 } else {
    \n+
    663 // unfold first child to get type
    \n+
    664 auto i_val = apply_i(std::move(pre_val),std::size_t{0});
    \n+
    665 // dynamically loop rest of the children to accumulate remindng values
    \n+
    666 for(std::size_t i = 1; i < tree.degree(); i++)
    \n+
    667 i_val = apply_i(i_val,i);
    \n+
    668 return i_val;
    \n+
    669 }
    \n+
    670 }();
    \n+
    671
    \n+
    672 return visitor.post(tree, treePath, in_val);
    \n+
    673 }
    \n+
    674
    \n+
    675 }
    \n+
    676
    \n+
    700 template<typename Tree, typename Visitor, typename Init>
    \n+
    \n+
    701 auto hybridApplyToTree(Tree&& tree, Visitor&& visitor, Init&& init)
    \n+
    702 {
    \n+
    703 return Impl::hybridApplyToTree(tree, hybridTreePath(), visitor, init);
    \n+
    704 }
    \n+
    \n+
    705
    \n+
    706 } // namespace Experimental
    \n+
    \n+
    707
    \n+
    709 } // namespace TypeTree
    \n+
    \n+
    710} //namespace Dune
    \n+
    \n+
    711
    \n+
    712#endif // DUNE_TYPETREE_ACCUMULATE_STATIC_HH
    \n+\n+\n+\n+\n+
    static const result_type child_result
    Definition accumulate_static.hh:156
    \n+
    static const result_type result
    Definition accumulate_static.hh:113
    \n+
    typename impl::_Child< Node, indices... >::type Child
    Template alias for the type of a child node given by a list of child indices.
    Definition childextraction.hh:225
    \n+
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n+
    typename std::decay_t< Node >::NodeTag NodeTag
    Returns the node tag of the given Node.
    Definition nodeinterface.hh:70
    \n
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n
    Definition accumulate_static.hh:16
    \n-
    void applyToTreePair(T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)
    Definition pairtraversal.hh:40
    \n+
    Statically combine two values of type result_type using ||.
    Definition accumulate_static.hh:27
    \n+
    Definition accumulate_static.hh:30
    \n+
    static const result_type result
    Definition accumulate_static.hh:31
    \n+
    Statically combine two values of type result_type using &&.
    Definition accumulate_static.hh:38
    \n+
    Definition accumulate_static.hh:41
    \n+
    static const result_type result
    Definition accumulate_static.hh:42
    \n+
    Statically combine two values of type result_type using +.
    Definition accumulate_static.hh:49
    \n+
    Definition accumulate_static.hh:52
    \n+
    static const result_type result
    Definition accumulate_static.hh:53
    \n+
    Statically combine two values of type result_type using -.
    Definition accumulate_static.hh:60
    \n+
    Definition accumulate_static.hh:63
    \n+
    static const result_type result
    Definition accumulate_static.hh:64
    \n+
    Statically combine two values of type result_type using *.
    Definition accumulate_static.hh:71
    \n+
    Definition accumulate_static.hh:74
    \n+
    static const result_type result
    Definition accumulate_static.hh:75
    \n+
    Statically combine two values of type result_type by returning their minimum.
    Definition accumulate_static.hh:82
    \n+
    Definition accumulate_static.hh:85
    \n+
    static const result_type result
    Definition accumulate_static.hh:86
    \n+
    Statically combine two values of type result_type by returning their maximum.
    Definition accumulate_static.hh:93
    \n+
    Definition accumulate_static.hh:96
    \n+
    static const result_type result
    Definition accumulate_static.hh:97
    \n+
    Statically accumulate a value over the nodes of a TypeTree.
    Definition accumulate_static.hh:262
    \n+
    Functor::result_type result_type
    The result type of the computation.
    Definition accumulate_static.hh:265
    \n+
    static const result_type result
    The accumulated result of the computation.
    Definition accumulate_static.hh:268
    \n+
    Definition accumulate_static.hh:469
    \n+
    ParentChildReduction parent_child_reduction
    Definition accumulate_static.hh:527
    \n+
    Functor functor
    Definition accumulate_static.hh:498
    \n+
    StartType start_type
    Definition accumulate_static.hh:535
    \n+
    ReductionAlgorithm reduction_strategy
    Definition accumulate_static.hh:541
    \n+
    Reduction sibling_reduction
    Definition accumulate_static.hh:519
    \n+
    Statically accumulate a type over the nodes of a TypeTree.
    Definition accumulate_static.hh:556
    \n+
    accumulate_type< Tree, Policy, typenamePolicy::start_type, HybridTreePath<>, NodeTag< Tree > >::type type
    The accumulated result of the computation.
    Definition accumulate_static.hh:565
    \n+
    A hybrid version of TreePath that supports both compile time and run time indices.
    Definition treepath.hh:158
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,148 +1,592 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-pairtraversal.hh\n+accumulate_static.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_PAIRTRAVERSAL_HH\n-7#define DUNE_TYPETREE_PAIRTRAVERSAL_HH\n+6#ifndef DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n+7#define DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n 8\n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-16\n-17namespace _\bD_\bu_\bn_\be {\n-18 namespace TypeTree {\n-19\n-_\b2_\b5 namespace Detail {\n-26\n-27 /* The signature is the same as for the public applyToTreePair\n-28 * function in Dune::Typtree, despite the additionally passed\n-29 * treePath argument. The path passed here is associated to\n-30 * the tree and the relative paths of the children (wrt. to tree)\n-31 * are appended to this. Hence the behavior of the public function\n-32 * is resembled by passing an empty treePath.\n-33 */\n+9#include \n+10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+14\n+15\n+_\b1_\b6namespace _\bD_\bu_\bn_\be {\n+_\b1_\b7 namespace TypeTree {\n+18\n+25 template\n+_\b2_\b6 struct _\bo_\br_\b_\n+27 {\n+28 template\n+_\b2_\b9 struct _\br_\be_\bd_\bu_\bc_\be\n+30 {\n+_\b3_\b1 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 || r2;\n+32 };\n+33 };\n 34\n-35 /*\n-36 * This is the overload for leaf traversal\n-37 */\n-38 template::isLeaf or std::decay_t::isLeaf),\n-int> = 0>\n-_\b4_\b0 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(T1&& tree1, T2&& tree2, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n+36 template\n+_\b3_\b7 struct _\ba_\bn_\bd_\b_\n+38 {\n+39 template\n+_\b4_\b0 struct _\br_\be_\bd_\bu_\bc_\be\n 41 {\n-42 visitor.leaf(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-43 }\n-44\n-45 /*\n-46 * This is the general overload doing static child traversal.\n-47 */\n-48 template::isLeaf or std::decay_t::isLeaf),\n-int> = 0>\n-50 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(T1&& tree1, T2&& tree2, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n-51 {\n-52 // Do we really want to take care for const-ness of the Tree\n-53 // when instanciating VisitChild below? I'd rather expect this:\n-54 // using Tree1 = std::decay_t;\n-55 // using Tree2 = std::decay_t;\n-56 // using Visitor = std::decay_t;\n-57 using Tree1 = std::remove_reference_t;\n-58 using Tree2 = std::remove_reference_t;\n-59 using Visitor = std::remove_reference_t;\n-60 visitor.pre(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-61\n-62 // check which type of traversal is supported by the trees\n-63 using allowDynamicTraversal = std::conjunction<\n-64 Dune::Std::is_detected,\n-65 Dune::Std::is_detected>;\n-66 using allowStaticTraversal = std::conjunction<\n-67 Dune::Std::is_detected,\n-68 Dune::Std::is_detected>;\n-69\n-70 // both trees must support either dynamic or static traversal\n-71 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n-72\n-73 // the visitor may specify preferred dynamic traversal\n-74 using preferDynamicTraversal = std::bool_constant;\n-75\n-76 // create a dynamic or static index range\n-77 auto indices = [&]{\n-78 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)\n-79 return Dune::range(std::size_t(tree1.degree()));\n-80 else\n-81 return Dune::range(tree1.degree());\n-82 }();\n-83\n-84 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {\n-85 Dune::Hybrid::forEach(indices, [&](auto i) {\n-86 auto&& child1 = tree1.child(i);\n-87 auto&& child2 = tree2.child(i);\n-88 using Child1 = std::decay_t;\n-89 using Child2 = std::decay_t;\n-90\n-91 visitor.beforeChild(tree1, child1, tree2, child2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-92\n-93 // This requires that visitor.in(...) can always be instantiated,\n-94 // even if there's a single child only.\n-95 if (i>0)\n-96 visitor.in(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-97\n-98 constexpr bool visitChild = Visitor::template\n-VisitChild::value;\n-99 if constexpr(visitChild) {\n-100 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-101 _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(child1, child2, childTreePath, visitor);\n-102 }\n+_\b4_\b2 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 && r2;\n+43 };\n+44 };\n+45\n+47 template\n+_\b4_\b8 struct _\bp_\bl_\bu_\bs\n+49 {\n+50 template\n+_\b5_\b1 struct _\br_\be_\bd_\bu_\bc_\be\n+52 {\n+_\b5_\b3 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 + r2;\n+54 };\n+55 };\n+56\n+58 template\n+_\b5_\b9 struct _\bm_\bi_\bn_\bu_\bs\n+60 {\n+61 template\n+_\b6_\b2 struct _\br_\be_\bd_\bu_\bc_\be\n+63 {\n+_\b6_\b4 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 - r2;\n+65 };\n+66 };\n+67\n+69 template\n+_\b7_\b0 struct _\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+71 {\n+72 template\n+_\b7_\b3 struct _\br_\be_\bd_\bu_\bc_\be\n+74 {\n+_\b7_\b5 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 * r2;\n+76 };\n+77 };\n+78\n+80 template\n+_\b8_\b1 struct _\bm_\bi_\bn\n+82 {\n+83 template\n+_\b8_\b4 struct _\br_\be_\bd_\bu_\bc_\be\n+85 {\n+_\b8_\b6 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 < r2 ? r1 : r2;\n+87 };\n+88 };\n+89\n+91 template\n+_\b9_\b2 struct _\bm_\ba_\bx\n+93 {\n+94 template\n+_\b9_\b5 struct _\br_\be_\bd_\bu_\bc_\be\n+96 {\n+_\b9_\b7 static const result_type _\br_\be_\bs_\bu_\bl_\bt = r1 > r2 ? r1 : r2;\n+98 };\n+99 };\n+100\n+101\n+102 namespace {\n 103\n-104 visitor.afterChild(tree1, child1, tree2, child2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-105 });\n-106 }\n-107 visitor.post(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-108 }\n-109\n-110 } // namespace Detail\n-111\n-113\n-127 template\n-_\b1_\b2_\b8 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(Tree1&& tree1, Tree2&& tree2, Visitor&& visitor)\n-129 {\n-130 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(tree1, tree2, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor);\n-131 }\n-132\n-134\n-135 } // namespace TypeTree\n-136} //namespace Dune\n-137\n-138#endif // DUNE_TYPETREE_PAIRTRAVERSAL_HH\n-_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n+104 // implementation of the traversal algorithm\n+105\n+107 template\n+108 struct accumulate_node_helper\n+109 {\n+110\n+111 typedef typename Functor::result_type result_type;\n+112\n+_\b1_\b1_\b3 static const result_type _\br_\be_\bs_\bu_\bl_\bt = current_value;\n+114\n+115 };\n+116\n+118 template\n+119 struct\n+accumulate_node_helper\n+120 {\n+121\n+122 typedef typename Functor::result_type result_type;\n+123\n+124 static const result_type _\br_\be_\bs_\bu_\bl_\bt = Reduction::template\n+reduce::result>::result;\n+125\n+126 };\n+127\n+129 template\n+130 struct accumulate_value;\n+131\n+133 template\n+134 struct\n+accumulate_value\n+135 {\n+136\n+137 typedef typename Functor::result_type result_type;\n+138\n+139 static const result_type _\br_\be_\bs_\bu_\bl_\bt =\n+140\n+141\n+accumulate_node_helper::value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n+142\n+143 };\n+144\n+146 template\n+147 struct accumulate_over_children\n+148 {\n+149\n+150 typedef typename Functor::result_type result_type;\n+151\n+152 typedef decltype(_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(TreePath{},index_constant{}))\n+child_tree_path;\n+153\n+154 typedef typename Node::template _\bC_\bh_\bi_\bl_\bd::Type child;\n+155\n+_\b1_\b5_\b6 static const result_type child_result =\n+accumulate_value>::\n+result;\n+157\n+158 static const result_type result =\n+accumulate_over_children::\n+result;\n+159\n+160 };\n+161\n+163 template\n+164 struct\n+accumulate_over_children\n+165 {\n+166\n+167 typedef typename Functor::result_type result_type;\n+168\n+169 static const result_type _\br_\be_\bs_\bu_\bl_\bt = current_value;\n+170\n+171 };\n+172\n+175 template\n+176 struct accumulate_value_generic_composite_node\n+177 {\n+178\n+179 typedef typename Functor::result_type result_type;\n+180\n+181 static const result_type _\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bs_\bu_\bl_\bt =\n+accumulate_over_children::\n+value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n+182\n+183 static const result_type _\br_\be_\bs_\bu_\bl_\bt =\n+184\n+accumulate_node_helper::value>_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt;\n+185\n+186\n+187 };\n+188\n+190 template\n+191 struct\n+accumulate_value\n+192 : public\n+accumulate_value_generic_composite_node\n+193 {};\n+194\n+196 template\n+197 struct\n+accumulate_value\n+198 : public\n+accumulate_value_generic_composite_node\n+199 {};\n+200\n+201 } // anonymous namespace\n+202\n+204\n+260 template\n+_\b2_\b6_\b1 struct _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be\n+262 {\n+263\n+_\b2_\b6_\b5 typedef typename Functor::result_type _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be;\n+266\n+_\b2_\b6_\b8 static const _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be _\br_\be_\bs_\bu_\bl_\bt =\n+accumulate_value,_\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>>_\b:_\b:\n+_\br_\be_\bs_\bu_\bl_\bt;\n+269\n+270 };\n+271\n+274 struct flattened_reduction;\n+275\n+278 struct bottom_up_reduction;\n+279\n+280 namespace {\n+281\n+282 // implementation of the traversal algorithm\n+283\n+286 template\n+287 struct accumulate_type_node_helper\n+288 {\n+289\n+290 typedef current_type type;\n+291\n+292 };\n+293\n+295 template\n+296 struct\n+accumulate_type_node_helper\n+297 {\n+298\n+299 typedef typename Reduction::template reduce<\n+300 current_type,\n+301 typename Functor::template visit<\n+302 Node,\n+303 TreePath\n+304 >::type\n+305 >::type type;\n+306\n+307 };\n+308\n+310 template\n+311 struct accumulate_type;\n+312\n+314 template\n+315 struct accumulate_type\n+316 {\n+317\n+318 typedef typename accumulate_type_node_helper<\n+319 LeafNode,\n+320 typename Policy::functor,\n+321 typename Policy::sibling_reduction,\n+322 current_type,\n+323 TreePath,\n+324 Policy::functor::template doVisit<\n+325 LeafNode,\n+326 TreePath>::value\n+327 >::type type;\n+328\n+329 };\n+330\n+331\n+334 template\n+335 struct propagate_type_down_tree;\n+336\n+338 template\n+339 struct propagate_type_down_tree<\n+340 current_type,\n+341 tree_path,\n+342 start_type,\n+343 bottom_up_reduction\n+344 >\n+345 {\n+346 typedef current_type type;\n+347 };\n+348\n+350 template\n+351 struct propagate_type_down_tree<\n+352 current_type,\n+353 tree_path,\n+354 start_type,\n+355 flattened_reduction\n+356 >\n+357 {\n+358 typedef typename std::conditional<\n+359 TreePathBack::value == 0,\n+360 start_type,\n+361 current_type\n+362 >::type type;\n+363 };\n+364\n+365\n+367 template\n+368 struct accumulate_type_over_children\n+369 {\n+370\n+371 typedef decltype(_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(TreePath{},index_constant{}))\n+child_tree_path;\n+372\n+373 typedef typename Node::template Child::Type child;\n+374\n+375 typedef typename accumulate_type<\n+376 child,\n+377 Policy,\n+378 // apply reduction choice (flat / hierarchic)\n+379 typename propagate_type_down_tree<\n+380 current_type,\n+381 child_tree_path,\n+382 typename Policy::start_type,\n+383 typename Policy::reduction_strategy\n+384 >::type,\n+385 child_tree_path,\n+386 NodeTag\n+387 >::type child_result_type;\n+388\n+389 typedef typename accumulate_type_over_children<\n+390 Node,\n+391 Policy,\n+392 child_result_type,\n+393 TreePath,\n+394 i+1,\n+395 n\n+396 >::type type;\n+397\n+398 };\n+399\n+401 template\n+402 struct accumulate_type_over_children\n+403 {\n+404\n+405 typedef current_type type;\n+406\n+407 };\n+408\n+409\n+412 template\n+413 struct accumulate_type_generic_composite_node\n+414 {\n+415\n+416 typedef typename accumulate_type_over_children<\n+417 Node,\n+418 Policy,\n+419 current_type,\n+420 TreePath,\n+421 0,\n+422 StaticDegree::value\n+423 >::type children_result_type;\n+424\n+425 typedef typename accumulate_type_node_helper<\n+426 Node,\n+427 typename Policy::functor,\n+428 typename Policy::parent_child_reduction,\n+429 children_result_type,\n+430 TreePath,\n+431 Policy::functor::template doVisit<\n+432 Node,\n+433 TreePath\n+434 >::value\n+435 >::type type;\n+436\n+437 };\n+438\n+440 template\n+441 struct accumulate_type\n+442 : public\n+accumulate_type_generic_composite_node\n+443 {};\n+444\n+446 template\n+447 struct\n+accumulate_type\n+448 : public\n+accumulate_type_generic_composite_node\n+449 {};\n+450\n+451 } // anonymous namespace\n+452\n+453\n+461 template<\n+462 typename Functor,\n+463 typename Reduction,\n+464 typename StartType,\n+465 typename ParentChildReduction = Reduction,\n+466 typename ReductionAlgorithm = flattened_reduction\n+467 >\n+_\b4_\b6_\b8 struct _\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by\n+469 {\n+470\n+_\b4_\b9_\b8 typedef Functor _\bf_\bu_\bn_\bc_\bt_\bo_\br;\n+499\n+_\b5_\b1_\b9 typedef Reduction _\bs_\bi_\bb_\bl_\bi_\bn_\bg_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+520\n+_\b5_\b2_\b7 typedef ParentChildReduction _\bp_\ba_\br_\be_\bn_\bt_\b__\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+528\n+_\b5_\b3_\b5 typedef StartType _\bs_\bt_\ba_\br_\bt_\b__\bt_\by_\bp_\be;\n+536\n+_\b5_\b4_\b1 typedef ReductionAlgorithm _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b__\bs_\bt_\br_\ba_\bt_\be_\bg_\by;\n+542 };\n+543\n+544\n+546\n+554 template\n+_\b5_\b5_\b5 struct _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be\n+556 {\n+557\n+559 typedef typename accumulate_type<\n+560 Tree,\n+561 Policy,\n+562 typename Policy::start_type,\n+563 _\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\b<_\b>,\n+564 _\bN_\bo_\bd_\be_\bT_\ba_\bg_\b<_\bT_\br_\be_\be_\b>\n+_\b5_\b6_\b5 >::type _\bt_\by_\bp_\be;\n+566\n+567 };\n+568\n+569\n+570\n+571\n+572\n+573 /***************************************************/\n+574\n+_\b5_\b7_\b5 namespace Experimental {\n+576 namespace Impl {\n+577\n+579 template::isLeaf, int> = 0>\n+581 auto hybridApplyToTree(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor, U&&\n+current_val)\n+582 {\n+583 return visitor.leaf(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::forward(current_val));\n+584 }\n+585\n+587 template::isLeaf, int> = 0>\n+589 auto hybridApplyToTree(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor, U&&\n+current_val)\n+590 {\n+591 using Tree = std::remove_reference_t;\n+592 using Visitor = std::remove_reference_t;\n+593 auto pre_val = visitor.pre(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::forward(current_val));\n+594\n+595 // check which type of traversal is supported by the tree\n+596 using allowDynamicTraversal = Dune::Std::is_detected;\n+597 using allowStaticTraversal = Dune::Std::is_detected;\n+598\n+599 // the tree must support either dynamic or static traversal\n+600 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n+601\n+602 // the visitor may specify preferred dynamic traversal\n+603 using preferDynamicTraversal = std::bool_constant;\n+604\n+605 // declare rule that applies visitor and current value to a child i.\n+Returns next value\n+606 auto apply_i = [&](auto&& value, const auto& i){\n+607 auto&& _\bc_\bh_\bi_\bl_\bd = tree.child(i);\n+608 using _\bC_\bh_\bi_\bl_\bd = std::decay_t;\n+609\n+610 auto val_before = visitor.beforeChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i, std::move\n+(value));\n+611\n+612 // visits between children\n+613 auto val_in = Hybrid::ifElse(\n+614 Hybrid::equal_to(i,Indices::_0),\n+615 [&](auto id){return std::move(val_before);},\n+616 [&](auto id){return visitor.in(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, std::move(val_before));}\n+617 );\n+618\n+619 constexpr bool visitChild = Visitor::template\n+VisitChild::value;\n+620 auto val_visit = [&](){\n+621 if constexpr (visitChild) {\n+622 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+623 return hybridApplyToTree(_\bc_\bh_\bi_\bl_\bd, childTreePath, visitor, std::move(val_in));\n+624 }\n+625 else\n+626 return std::move(val_in);\n+627 }();\n+628\n+629 return visitor.afterChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i, std::move(val_visit));\n+630 };\n+631\n+632 // apply visitor to children\n+633 auto in_val = [&](){\n+634 if constexpr (allowStaticTraversal::value && not preferDynamicTraversal::\n+value) {\n+635 // get list of static indices\n+636 auto indices = std::make_index_sequence{};\n+637\n+638 // unfold apply_i left to right\n+639 return unpackIntegerSequence([&](auto... i) {\n+659 return left_fold(std::move(apply_i),std::move(pre_val), i...);\n+660 }, indices);\n+661\n+662 } else {\n+663 // unfold first child to get type\n+664 auto i_val = apply_i(std::move(pre_val),std::size_t{0});\n+665 // dynamically loop rest of the children to accumulate remindng values\n+666 for(std::size_t i = 1; i < tree.degree(); i++)\n+667 i_val = apply_i(i_val,i);\n+668 return i_val;\n+669 }\n+670 }();\n+671\n+672 return visitor.post(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, in_val);\n+673 }\n+674\n+675 }\n+676\n+700 template\n+_\b7_\b0_\b1 auto hybridApplyToTree(Tree&& tree, Visitor&& visitor, Init&& init)\n+702 {\n+703 return Impl::hybridApplyToTree(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor, init);\n+704 }\n+705\n+706 } // namespace Experimental\n+707\n+709 } // namespace TypeTree\n+710} //namespace Dune\n+711\n+712#endif // DUNE_TYPETREE_ACCUMULATE_STATIC_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br\n-void applyToTreePair(Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)\n-Apply visitor to a pair of TypeTrees.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pairtraversal.hh:128\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bs_\bu_\bl_\bt\n+static const result_type child_result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:156\n+_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n+typename impl::_Child< Node, indices... >::type Child\n+Template alias for the type of a child node given by a list of child indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ImplementationDefined child(Node &&node, Indices... indices)\n+Extracts the child of a node given by a sequence of compile-time and run-time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+typename std::decay_t< Node >::NodeTag NodeTag\n+Returns the node tag of the given Node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodeinterface.hh:70\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n T... > &tp, std::size_t i)\n Appends a run time index to a HybridTreePath.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto hybridTreePath(const T &... t)\n@@ -150,12 +594,105 @@\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto treePath(const T &... t)\n Constructs a new HybridTreePath from the given indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br\n-void applyToTreePair(T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pairtraversal.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b_\n+Statically combine two values of type result_type using ||.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bo_\br_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b_\n+Statically combine two values of type result_type using &&.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bn_\bd_\b__\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs\n+Statically combine two values of type result_type using +.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bl_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs\n+Statically combine two values of type result_type using -.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\bu_\bs_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+Statically combine two values of type result_type using *.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn\n+Statically combine two values of type result_type by returning their minimum.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\bi_\bn_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx\n+Statically combine two values of type result_type by returning their maximum.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b:_\b:_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bm_\ba_\bx_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be\n+Statically accumulate a value over the nodes of a TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n+Functor::result_type result_type\n+The result type of the computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bV_\ba_\bl_\bu_\be_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+The accumulated result of the computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bp_\ba_\br_\be_\bn_\bt_\b__\bc_\bh_\bi_\bl_\bd_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+ParentChildReduction parent_child_reduction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:527\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bf_\bu_\bn_\bc_\bt_\bo_\br\n+Functor functor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bs_\bt_\ba_\br_\bt_\b__\bt_\by_\bp_\be\n+StartType start_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn_\b__\bs_\bt_\br_\ba_\bt_\be_\bg_\by\n+ReductionAlgorithm reduction_strategy\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\by_\bp_\be_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bs_\bi_\bb_\bl_\bi_\bn_\bg_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+Reduction sibling_reduction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be\n+Statically accumulate a type over the nodes of a TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:556\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+accumulate_type< Tree, Policy, typenamePolicy::start_type, HybridTreePath<>,\n+NodeTag< Tree > >::type type\n+The accumulated result of the computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:565\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+A hybrid version of TreePath that supports both compile time and run time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:158\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00068.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00068.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: leafnode.hh File Reference\n+dune-typetree: pairtraversal.hh File Reference\n \n \n \n \n \n \n \n@@ -70,37 +70,46 @@\n
    \n \n
    \n
    \n
    \n \n-
    leafnode.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    pairtraversal.hh File Reference
    \n \n
    \n-
    #include <dune/typetree/nodetags.hh>
    \n-#include <cstddef>
    \n-#include <type_traits>
    \n+
    #include <dune/common/std/type_traits.hh>
    \n+#include <dune/typetree/nodeinterface.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/treepath.hh>
    \n+#include <dune/typetree/visitor.hh>
    \n+#include <dune/typetree/traversal.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::TypeTree::LeafNode
     Base class for leaf nodes in a dune-typetree. More...
     
    \n \n \n \n \n \n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::Detail
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class T1 , class T2 , class TreePath , class V , std::enable_if_t<(std::decay_t< T1 >::isLeaf or std::decay_t< T2 >::isLeaf), int > = 0>
    void Dune::TypeTree::Detail::applyToTreePair (T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)
     
    template<typename Tree1 , typename Tree2 , typename Visitor >
    void Dune::TypeTree::applyToTreePair (Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)
     Apply visitor to a pair of TypeTrees.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,35 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-leafnode.hh File Reference\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+pairtraversal.hh File Reference\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include \n-#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n-\u00a0 Base class for leaf nodes in a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template::isLeaf or std::decay_t< T2 >::isLeaf), int > = 0>\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br (T1 &&tree1, T2 &&tree2, TreePath\n+ _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V &&visitor)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br (Tree1 &&tree1, Tree2 &&tree2, Visitor\n+ &&visitor)\n+\u00a0 Apply visitor to a pair of TypeTrees.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00068_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00068_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: leafnode.hh Source File\n+dune-typetree: pairtraversal.hh Source File\n \n \n \n \n \n \n \n@@ -74,75 +74,152 @@\n \n
    \n \n
    \n
    \n
    \n-
    leafnode.hh
    \n+
    pairtraversal.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_LEAFNODE_HH
    \n-
    7#define DUNE_TYPETREE_LEAFNODE_HH
    \n+
    6#ifndef DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n+
    7#define DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n
    8
    \n-\n-
    10#include <cstddef>
    \n-
    11#include <type_traits>
    \n-
    12
    \n-
    13namespace Dune {
    \n-
    14 namespace TypeTree {
    \n-
    15
    \n-
    \n-\n-
    28 {
    \n-
    29
    \n-
    30 public:
    \n-
    31
    \n-
    33 static const bool isLeaf = true;
    \n+
    9#include <dune/common/std/type_traits.hh>
    \n+
    10
    \n+\n+\n+\n+\n+\n+
    16
    \n+
    17namespace Dune {
    \n+
    18 namespace TypeTree {
    \n+
    19
    \n+
    \n+
    25 namespace Detail {
    \n+
    26
    \n+
    27 /* The signature is the same as for the public applyToTreePair
    \n+
    28 * function in Dune::Typtree, despite the additionally passed
    \n+
    29 * treePath argument. The path passed here is associated to
    \n+
    30 * the tree and the relative paths of the children (wrt. to tree)
    \n+
    31 * are appended to this. Hence the behavior of the public function
    \n+
    32 * is resembled by passing an empty treePath.
    \n+
    33 */
    \n
    34
    \n-
    36 static const bool isPower = false;
    \n-
    37
    \n-
    39 static const bool isComposite = false;
    \n-
    40
    \n-\n-
    43
    \n-
    \n-
    44 static constexpr auto degree()
    \n-
    45 {
    \n-
    46 return std::integral_constant<std::size_t,0>{};
    \n-
    47 }
    \n-
    \n-
    48
    \n-
    49 protected:
    \n-
    50
    \n-
    52
    \n-\n-
    58 };
    \n-
    \n-
    59
    \n+
    35 /*
    \n+
    36 * This is the overload for leaf traversal
    \n+
    37 */
    \n+
    38 template<class T1, class T2, class TreePath, class V,
    \n+
    39 std::enable_if_t<(std::decay_t<T1>::isLeaf or std::decay_t<T2>::isLeaf), int> = 0>
    \n+
    \n+
    40 void applyToTreePair(T1&& tree1, T2&& tree2, TreePath treePath, V&& visitor)
    \n+
    41 {
    \n+
    42 visitor.leaf(tree1, tree2, treePath);
    \n+
    43 }
    \n+
    \n+
    44
    \n+
    45 /*
    \n+
    46 * This is the general overload doing static child traversal.
    \n+
    47 */
    \n+
    48 template<class T1, class T2, class TreePath, class V,
    \n+
    49 std::enable_if_t<not(std::decay_t<T1>::isLeaf or std::decay_t<T2>::isLeaf), int> = 0>
    \n+
    50 void applyToTreePair(T1&& tree1, T2&& tree2, TreePath treePath, V&& visitor)
    \n+
    51 {
    \n+
    52 // Do we really want to take care for const-ness of the Tree
    \n+
    53 // when instanciating VisitChild below? I'd rather expect this:
    \n+
    54 // using Tree1 = std::decay_t<T1>;
    \n+
    55 // using Tree2 = std::decay_t<T2>;
    \n+
    56 // using Visitor = std::decay_t<V>;
    \n+
    57 using Tree1 = std::remove_reference_t<T1>;
    \n+
    58 using Tree2 = std::remove_reference_t<T2>;
    \n+
    59 using Visitor = std::remove_reference_t<V>;
    \n+
    60 visitor.pre(tree1, tree2, treePath);
    \n
    61
    \n-
    62 } // namespace TypeTree
    \n-
    63} //namespace Dune
    \n-
    64
    \n-
    65#endif // DUNE_TYPETREE_POWERNODE_HH
    \n-\n+
    62 // check which type of traversal is supported by the trees
    \n+
    63 using allowDynamicTraversal = std::conjunction<
    \n+
    64 Dune::Std::is_detected<DynamicTraversalConcept,Tree1>,
    \n+
    65 Dune::Std::is_detected<DynamicTraversalConcept,Tree2>>;
    \n+
    66 using allowStaticTraversal = std::conjunction<
    \n+
    67 Dune::Std::is_detected<StaticTraversalConcept,Tree1>,
    \n+
    68 Dune::Std::is_detected<StaticTraversalConcept,Tree2>>;
    \n+
    69
    \n+
    70 // both trees must support either dynamic or static traversal
    \n+
    71 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n+
    72
    \n+
    73 // the visitor may specify preferred dynamic traversal
    \n+
    74 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n+
    75
    \n+
    76 // create a dynamic or static index range
    \n+
    77 auto indices = [&]{
    \n+
    78 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)
    \n+
    79 return Dune::range(std::size_t(tree1.degree()));
    \n+
    80 else
    \n+
    81 return Dune::range(tree1.degree());
    \n+
    82 }();
    \n+
    83
    \n+
    84 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {
    \n+
    85 Dune::Hybrid::forEach(indices, [&](auto i) {
    \n+
    86 auto&& child1 = tree1.child(i);
    \n+
    87 auto&& child2 = tree2.child(i);
    \n+
    88 using Child1 = std::decay_t<decltype(child1)>;
    \n+
    89 using Child2 = std::decay_t<decltype(child2)>;
    \n+
    90
    \n+
    91 visitor.beforeChild(tree1, child1, tree2, child2, treePath, i);
    \n+
    92
    \n+
    93 // This requires that visitor.in(...) can always be instantiated,
    \n+
    94 // even if there's a single child only.
    \n+
    95 if (i>0)
    \n+
    96 visitor.in(tree1, tree2, treePath);
    \n+
    97
    \n+
    98 constexpr bool visitChild = Visitor::template VisitChild<Tree1,Child1,Tree2,Child2,TreePath>::value;
    \n+
    99 if constexpr(visitChild) {
    \n+
    100 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n+
    101 applyToTreePair(child1, child2, childTreePath, visitor);
    \n+
    102 }
    \n+
    103
    \n+
    104 visitor.afterChild(tree1, child1, tree2, child2, treePath, i);
    \n+
    105 });
    \n+
    106 }
    \n+
    107 visitor.post(tree1, tree2, treePath);
    \n+
    108 }
    \n+
    109
    \n+
    110 } // namespace Detail
    \n+
    \n+
    111
    \n+
    113
    \n+
    127 template<typename Tree1, typename Tree2, typename Visitor>
    \n+
    \n+
    128 void applyToTreePair(Tree1&& tree1, Tree2&& tree2, Visitor&& visitor)
    \n+
    129 {
    \n+
    130 Detail::applyToTreePair(tree1, tree2, hybridTreePath(), visitor);
    \n+
    131 }
    \n+
    \n+
    132
    \n+
    134
    \n+
    135 } // namespace TypeTree
    \n+
    136} //namespace Dune
    \n+
    137
    \n+
    138#endif // DUNE_TYPETREE_PAIRTRAVERSAL_HH
    \n+\n+\n+\n+\n+\n+
    void applyToTreePair(Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)
    Apply visitor to a pair of TypeTrees.
    Definition pairtraversal.hh:128
    \n+
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n+
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n+
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n
    Definition accumulate_static.hh:16
    \n-
    Base class for leaf nodes in a dune-typetree.
    Definition leafnode.hh:28
    \n-
    LeafNodeTag NodeTag
    The type tag that describes a LeafNode.
    Definition leafnode.hh:42
    \n-
    static const bool isLeaf
    Mark this class as a leaf in a dune-typetree.
    Definition leafnode.hh:33
    \n-
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition leafnode.hh:36
    \n-
    LeafNode()
    Default constructor.
    Definition leafnode.hh:57
    \n-
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition leafnode.hh:39
    \n-
    static constexpr auto degree()
    Definition leafnode.hh:44
    \n-
    Tag designating a leaf node.
    Definition nodetags.hh:18
    \n+
    void applyToTreePair(T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)
    Definition pairtraversal.hh:40
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,88 +1,161 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-leafnode.hh\n+pairtraversal.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_LEAFNODE_HH\n-7#define DUNE_TYPETREE_LEAFNODE_HH\n+6#ifndef DUNE_TYPETREE_PAIRTRAVERSAL_HH\n+7#define DUNE_TYPETREE_PAIRTRAVERSAL_HH\n 8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-10#include \n-11#include \n-12\n-13namespace _\bD_\bu_\bn_\be {\n-14 namespace TypeTree {\n-15\n-_\b2_\b7 class _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n-28 {\n-29\n-30 public:\n-31\n-_\b3_\b3 static const bool _\bi_\bs_\bL_\be_\ba_\bf = true;\n+9#include \n+10\n+11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+16\n+17namespace _\bD_\bu_\bn_\be {\n+18 namespace TypeTree {\n+19\n+_\b2_\b5 namespace Detail {\n+26\n+27 /* The signature is the same as for the public applyToTreePair\n+28 * function in Dune::Typtree, despite the additionally passed\n+29 * treePath argument. The path passed here is associated to\n+30 * the tree and the relative paths of the children (wrt. to tree)\n+31 * are appended to this. Hence the behavior of the public function\n+32 * is resembled by passing an empty treePath.\n+33 */\n 34\n-_\b3_\b6 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n-37\n-_\b3_\b9 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n-40\n-_\b4_\b2 typedef _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-43\n-_\b4_\b4 static constexpr auto _\bd_\be_\bg_\br_\be_\be()\n-45 {\n-46 return std::integral_constant{};\n-47 }\n-48\n-49 protected:\n-50\n-52\n-_\b5_\b7 _\bL_\be_\ba_\bf_\bN_\bo_\bd_\be() {}\n-58 };\n-59\n+35 /*\n+36 * This is the overload for leaf traversal\n+37 */\n+38 template::isLeaf or std::decay_t::isLeaf),\n+int> = 0>\n+_\b4_\b0 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(T1&& tree1, T2&& tree2, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n+41 {\n+42 visitor.leaf(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+43 }\n+44\n+45 /*\n+46 * This is the general overload doing static child traversal.\n+47 */\n+48 template::isLeaf or std::decay_t::isLeaf),\n+int> = 0>\n+50 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(T1&& tree1, T2&& tree2, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n+51 {\n+52 // Do we really want to take care for const-ness of the Tree\n+53 // when instanciating VisitChild below? I'd rather expect this:\n+54 // using Tree1 = std::decay_t;\n+55 // using Tree2 = std::decay_t;\n+56 // using Visitor = std::decay_t;\n+57 using Tree1 = std::remove_reference_t;\n+58 using Tree2 = std::remove_reference_t;\n+59 using Visitor = std::remove_reference_t;\n+60 visitor.pre(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n 61\n-62 } // namespace TypeTree\n-63} //namespace Dune\n-64\n-65#endif // DUNE_TYPETREE_POWERNODE_HH\n+62 // check which type of traversal is supported by the trees\n+63 using allowDynamicTraversal = std::conjunction<\n+64 Dune::Std::is_detected,\n+65 Dune::Std::is_detected>;\n+66 using allowStaticTraversal = std::conjunction<\n+67 Dune::Std::is_detected,\n+68 Dune::Std::is_detected>;\n+69\n+70 // both trees must support either dynamic or static traversal\n+71 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n+72\n+73 // the visitor may specify preferred dynamic traversal\n+74 using preferDynamicTraversal = std::bool_constant;\n+75\n+76 // create a dynamic or static index range\n+77 auto indices = [&]{\n+78 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)\n+79 return Dune::range(std::size_t(tree1.degree()));\n+80 else\n+81 return Dune::range(tree1.degree());\n+82 }();\n+83\n+84 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {\n+85 Dune::Hybrid::forEach(indices, [&](auto i) {\n+86 auto&& child1 = tree1.child(i);\n+87 auto&& child2 = tree2.child(i);\n+88 using Child1 = std::decay_t;\n+89 using Child2 = std::decay_t;\n+90\n+91 visitor.beforeChild(tree1, child1, tree2, child2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+92\n+93 // This requires that visitor.in(...) can always be instantiated,\n+94 // even if there's a single child only.\n+95 if (i>0)\n+96 visitor.in(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+97\n+98 constexpr bool visitChild = Visitor::template\n+VisitChild::value;\n+99 if constexpr(visitChild) {\n+100 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+101 _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(child1, child2, childTreePath, visitor);\n+102 }\n+103\n+104 visitor.afterChild(tree1, child1, tree2, child2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n+105 });\n+106 }\n+107 visitor.post(tree1, tree2, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n+108 }\n+109\n+110 } // namespace Detail\n+111\n+113\n+127 template\n+_\b1_\b2_\b8 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(Tree1&& tree1, Tree2&& tree2, Visitor&& visitor)\n+129 {\n+130 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br(tree1, tree2, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor);\n+131 }\n+132\n+134\n+135 } // namespace TypeTree\n+136} //namespace Dune\n+137\n+138#endif // DUNE_TYPETREE_PAIRTRAVERSAL_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n+_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n+_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh\n+_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n+_\bn_\bo_\bd_\be_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br\n+void applyToTreePair(Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)\n+Apply visitor to a pair of TypeTrees.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pairtraversal.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n+T... > &tp, std::size_t i)\n+Appends a run time index to a HybridTreePath.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto hybridTreePath(const T &... t)\n+Constructs a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n+constexpr auto treePath(const T &... t)\n+Constructs a new HybridTreePath from the given indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n-Base class for leaf nodes in a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-LeafNodeTag NodeTag\n-The type tag that describes a LeafNode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n-static const bool isLeaf\n-Mark this class as a leaf in a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Mark this class as a non power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n-LeafNode()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a non composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static constexpr auto degree()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn leafnode.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a leaf node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:18\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be_\bP_\ba_\bi_\br\n+void applyToTreePair(T1 &&tree1, T2 &&tree2, TreePath treePath, V &&visitor)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pairtraversal.hh:40\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00071.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00071.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: filteredcompositenode.hh File Reference\n+dune-typetree: dynamicpowernode.hh File Reference\n \n \n \n \n \n \n \n@@ -72,35 +72,33 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    filteredcompositenode.hh File Reference
    \n+
    dynamicpowernode.hh File Reference
    \n
    \n
    \n-
    #include <memory>
    \n-#include <tuple>
    \n+
    #include <cassert>
    \n+#include <vector>
    \n+#include <memory>
    \n #include <type_traits>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/filters.hh>
    \n-#include <dune/common/shared_ptr.hh>
    \n #include <dune/common/typetraits.hh>
    \n-#include <dune/common/indices.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/typetree/nodetags.hh>
    \n+#include <dune/typetree/utility.hh>
    \n+#include <dune/typetree/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::TypeTree::FilteredCompositeNode< Node, Filter >
     Base class for composite nodes representing a filtered view on an underlying composite node. More...
     
    struct  Dune::TypeTree::FilteredCompositeNode< Node, Filter >::Child< k >
     Access to the type and storage type of the i-th child. More...
    class  Dune::TypeTree::DynamicPowerNode< T >
     Collect multiple instances of type T within a dune-typetree. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,28 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-filteredcompositenode.hh File Reference\n+dynamicpowernode.hh File Reference\n+#include \n+#include \n #include \n-#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n-#include \n #include \n-#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>\n-\u00a0 Base class for composite nodes representing a filtered view on an\n- underlying composite node. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b<_\b _\bk_\b _\b>\n-\u00a0 Access to the type and storage type of the i-th child. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Collect multiple instances of type T within a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00071_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00071_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: filteredcompositenode.hh Source File\n+dune-typetree: dynamicpowernode.hh Source File\n \n \n \n \n \n \n \n@@ -74,287 +74,221 @@\n \n
    \n \n
    \n \n
    \n-
    filteredcompositenode.hh
    \n+
    dynamicpowernode.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n-
    7#define DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n+
    6#ifndef DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n+
    7#define DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n
    8
    \n-
    9#include <memory>
    \n-
    10#include <tuple>
    \n-
    11#include <type_traits>
    \n-
    12
    \n-\n-\n-
    15#include <dune/common/shared_ptr.hh>
    \n-
    16#include <dune/common/typetraits.hh>
    \n-
    17#include <dune/common/indices.hh>
    \n-
    18
    \n-\n-\n-
    21
    \n-
    22namespace Dune {
    \n-
    23 namespace TypeTree {
    \n-
    24
    \n-
    30#ifndef DOXYGEN
    \n-
    31 namespace {
    \n-
    32
    \n-
    33 // ********************************************************************************
    \n-
    34 // Utility structs for filter construction and application
    \n-
    35 // ********************************************************************************
    \n+
    9#include <cassert>
    \n+
    10#include <vector>
    \n+
    11#include <memory>
    \n+
    12#include <type_traits>
    \n+
    13
    \n+
    14#include <dune/common/typetraits.hh>
    \n+
    15#include <dune/common/std/type_traits.hh>
    \n+
    16
    \n+\n+\n+\n+
    20
    \n+
    21namespace Dune {
    \n+
    22 namespace TypeTree {
    \n+
    23
    \n+
    33 template<typename T>
    \n+
    \n+\n+
    35 {
    \n
    36
    \n-
    37 // Gets the filter and wraps it in case of a SimpleFilter.
    \n-
    38 template<typename Filter, typename Tag>
    \n-
    39 struct get_filter;
    \n-
    40
    \n-
    41 // Helper struct to extract the child template parameter pack from the ChildTypes tuple.
    \n-
    42 template<typename Filter, typename Node, typename ChildTypes>
    \n-
    43 struct apply_filter_wrapper;
    \n+
    37 public:
    \n+
    38
    \n+
    40 static const bool isLeaf = false;
    \n+
    41
    \n+
    43 static const bool isPower = true;
    \n
    44
    \n-
    45 template<typename Filter, typename Node, typename... Children>
    \n-
    46 struct apply_filter_wrapper<Filter,Node,std::tuple<Children...> >
    \n-
    47 : public Filter::template apply<Node,Children...>
    \n-
    48 {};
    \n-
    49
    \n-
    50 // specialization for SimpleFilter
    \n-
    51 template<typename Filter>
    \n-
    52 struct get_filter<Filter,SimpleFilterTag>
    \n-
    53 {
    \n-
    54 struct type
    \n-
    55 {
    \n-
    56 template<typename Node, typename ChildTypes>
    \n-
    57 struct apply
    \n-
    58 : public apply_filter_wrapper<filter<Filter>,Node,ChildTypes>
    \n-
    59 {};
    \n-
    60 };
    \n-
    61 };
    \n+
    46 static const bool isComposite = false;
    \n+
    47
    \n+
    \n+
    49 std::size_t degree() const
    \n+
    50 {
    \n+
    51 return _children.size();
    \n+
    52 }
    \n+
    \n+
    53
    \n+\n+
    56
    \n+
    58 typedef T ChildType;
    \n+
    59
    \n+
    61 typedef std::shared_ptr<T> ChildStorageType;
    \n
    62
    \n-
    63 // specialization for AdvancedFilter
    \n-
    64 template<typename Filter>
    \n-
    65 struct get_filter<Filter,AdvancedFilterTag>
    \n-
    66 {
    \n-
    67 struct type
    \n-
    68 {
    \n-
    69 template<typename Node, typename ChildTypes>
    \n-
    70 struct apply
    \n-
    71 : public apply_filter_wrapper<Filter,Node,ChildTypes>
    \n-
    72 {};
    \n-
    73 };
    \n-
    74 };
    \n-
    75
    \n-
    76 } // anonymous namespace
    \n-
    77#endif // DOXYGEN
    \n-
    78
    \n-
    79
    \n-
    81 template<typename Node, typename Filter>
    \n-
    \n-\n-
    83 {
    \n+
    64 typedef std::shared_ptr<const T> ChildConstStorageType;
    \n+
    65
    \n+
    67 typedef std::vector<ChildStorageType> NodeStorage;
    \n+
    68
    \n+
    69
    \n+
    72
    \n+
    74
    \n+
    \n+
    77 ChildType& child (std::size_t i)
    \n+
    78 {
    \n+
    79 assert(i < degree() && "child index out of range");
    \n+
    80 return *_children[i];
    \n+
    81 }
    \n+
    \n+
    82
    \n
    84
    \n-
    85 typedef typename get_filter<Filter,typename Filter::FilterTag>::type filter;
    \n-
    86 typedef typename filter::template apply<Node,typename Node::ChildTypes>::type filter_result;
    \n-
    87 typedef typename filter_result::template apply<Node> mapped_children;
    \n-
    88
    \n-
    89 static const bool nodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
    \n-
    90
    \n-
    91 template<std::size_t k>
    \n-
    92 struct lazy_enable
    \n-
    93 {
    \n-
    94 static const bool value = !nodeIsConst;
    \n-
    95 };
    \n-
    96
    \n-
    97 public:
    \n-
    98
    \n-\n-
    101
    \n-
    103 typedef typename mapped_children::NodeStorage NodeStorage;
    \n+
    \n+
    87 const ChildType& child (std::size_t i) const
    \n+
    88 {
    \n+
    89 assert(i < degree() && "child index out of range");
    \n+
    90 return *_children[i];
    \n+
    91 }
    \n+
    \n+
    92
    \n+
    94
    \n+
    \n+\n+
    98 {
    \n+
    99 assert(i < degree() && "child index out of range");
    \n+
    100 return _children[i];
    \n+
    101 }
    \n+
    \n+
    102
    \n
    104
    \n-
    106 typedef typename mapped_children::ChildTypes ChildTypes;
    \n-
    107
    \n-
    109 static const bool isLeaf = false;
    \n-
    110
    \n-
    112 static const bool isPower = false;
    \n-
    113
    \n-
    115 static const bool isComposite = true;
    \n-
    116
    \n+
    \n+\n+
    111 {
    \n+
    112 assert(i < degree() && "child index out of range");
    \n+
    113 return _children[i];
    \n+
    114 }
    \n+
    \n+
    115
    \n
    \n-
    117 static constexpr auto degree ()
    \n+
    117 void setChild (std::size_t i, ChildType& t)
    \n
    118 {
    \n-
    119 return std::integral_constant<std::size_t,filter_result::size>{};
    \n-
    120 }
    \n+
    119 assert(i < degree() && "child index out of range");
    \n+
    120 _children[i] = stackobject_to_shared_ptr(t);
    \n+
    121 }
    \n+
    \n+
    122
    \n+
    \n+
    124 void setChild (std::size_t i, ChildType&& t)
    \n+
    125 {
    \n+
    126 assert(i < degree() && "child index out of range");
    \n+
    127 _children[i] = convert_arg(std::move(t));
    \n+
    128 }
    \n
    \n-
    121
    \n-
    123 template<std::size_t k>
    \n-
    \n-
    124 struct Child {
    \n-
    125
    \n-
    126#ifndef DOXYGEN
    \n-
    127
    \n-
    128 typedef typename std::tuple_element<k,typename mapped_children::Children>::type OriginalChild;
    \n
    129
    \n-
    130 static const std::size_t mapped_index = std::tuple_element<k,typename filter_result::IndexMap>::type::original_index;
    \n-
    131
    \n-
    132#endif // DOXYGEN
    \n-
    133
    \n-
    135 typedef typename OriginalChild::Type Type;
    \n+
    \n+
    131 void setChild (std::size_t i, ChildStorageType st)
    \n+
    132 {
    \n+
    133 assert(i < degree() && "child index out of range");
    \n+
    134 _children[i] = std::move(st);
    \n+
    135 }
    \n+
    \n
    136
    \n-
    138 typedef typename OriginalChild::type type;
    \n-
    139 };
    \n+
    \n+
    137 const NodeStorage& nodeStorage () const
    \n+
    138 {
    \n+
    139 return _children;
    \n+
    140 }
    \n
    \n-
    140
    \n+
    141
    \n
    143
    \n-
    145
    \n-
    148 template<std::size_t k,
    \n-
    149 typename std::enable_if<lazy_enable<k>::value, int>::type = 0>
    \n-
    \n-
    150 auto& child (index_constant<k> = {})
    \n-
    151 {
    \n-
    152 return _node->template child<Child<k>::mapped_index>();
    \n-
    153 }
    \n-
    \n+
    146
    \n+
    147 protected:
    \n+
    148
    \n+
    151 DynamicPowerNode () = delete;
    \n+
    152
    \n
    154
    \n-
    156
    \n-
    159 template<std::size_t k>
    \n-
    \n-
    160 const auto& child (index_constant<k> = {}) const
    \n-
    161 {
    \n-
    162 return _node->template child<Child<k>::mapped_index>();
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    166
    \n-
    169 template<std::size_t k,
    \n-
    170 typename std::enable_if<lazy_enable<k>::value, int>::type = 0>
    \n-
    \n-
    171 auto childStorage (index_constant<k> = {})
    \n-
    172 {
    \n-
    173 return _node->template childStorage<Child<k>::mapped_index>();
    \n-
    174 }
    \n-
    \n-
    175
    \n-
    177
    \n-
    180 template<std::size_t k>
    \n-
    \n-
    181 auto childStorage (index_constant<k> = {}) const
    \n+
    \n+
    162 explicit DynamicPowerNode (std::size_t size)
    \n+
    163 : _children(size)
    \n+
    164 {}
    \n+
    \n+
    165
    \n+
    \n+
    167 explicit DynamicPowerNode (NodeStorage children)
    \n+
    168 : _children(std::move(children))
    \n+
    169 {}
    \n+
    \n+
    170
    \n+
    171#ifdef DOXYGEN
    \n+
    172
    \n+
    \n+
    174 DynamicPowerNode (T& t1, T& t2, ...)
    \n+
    175 {}
    \n+
    \n+
    176
    \n+
    177#else
    \n+
    178
    \n+
    179 template<typename... Children,
    \n+
    180 std::enable_if_t<(std::is_same_v<ChildType, std::decay_t<Children>> &&...), bool> = true>
    \n+
    181 DynamicPowerNode (Children&&... children)
    \n
    182 {
    \n-
    183 return _node->template childStorage<Child<k>::mapped_index>();
    \n+
    183 _children = NodeStorage{convert_arg(std::forward<Children>(children))...};
    \n
    184 }
    \n-
    \n
    185
    \n-
    187 template<std::size_t k, class ChildType>
    \n-
    \n-
    188 void setChild (ChildType&& child, typename std::enable_if<lazy_enable<k>::value,void*>::type = 0)
    \n+
    186 template<typename... Children,
    \n+
    187 std::enable_if_t<(std::is_same_v<ChildType, std::decay_t<Children>> &&...), bool> = true>
    \n+
    188 DynamicPowerNode (std::shared_ptr<Children>... children)
    \n
    189 {
    \n-
    190 _node->template setChild<Child<k>::mapped_index>(std::forward<ChildType>(child));
    \n+
    190 _children = NodeStorage{std::move(children)...};
    \n
    191 }
    \n-
    \n
    192
    \n+
    193#endif // DOXYGEN
    \n
    194
    \n-
    197
    \n-
    198 protected:
    \n-
    199
    \n-
    201
    \n-
    204 template<bool enabled = !nodeIsConst>
    \n-
    205 typename std::enable_if<enabled,Node&>::type
    \n-
    \n-\n-
    207 {
    \n-
    208 return *_node;
    \n-
    209 }
    \n-
    \n-
    210
    \n-
    212
    \n-
    \n-
    215 const Node& unfiltered () const
    \n-
    216 {
    \n-
    217 return *_node;
    \n-
    218 }
    \n-
    \n-
    219
    \n-
    221
    \n-
    224 template<bool enabled = !nodeIsConst>
    \n-
    225 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
    \n-
    \n-\n-
    227 {
    \n-
    228 return _node;
    \n-
    229 }
    \n-
    \n-
    230
    \n-
    232
    \n-
    \n-
    235 std::shared_ptr<const Node> unfilteredStorage () const
    \n-
    236 {
    \n-
    237 return _node;
    \n-
    238 }
    \n-
    \n-
    239
    \n-
    241
    \n-
    242 public:
    \n-
    243
    \n-
    246
    \n-
    \n-
    248 FilteredCompositeNode (std::shared_ptr<Node> node)
    \n-
    249 : _node(std::move(node))
    \n-
    250 {}
    \n-
    \n-
    251
    \n-
    \n-\n-
    254 : _node(stackobject_to_shared_ptr(node))
    \n-
    255 {}
    \n-
    \n-
    256
    \n-
    258
    \n-
    259 private:
    \n-
    260 std::shared_ptr<Node> _node;
    \n-
    261 };
    \n-
    \n-
    262
    \n-
    264
    \n-
    265 } // namespace TypeTree
    \n-
    266} //namespace Dune
    \n-
    267
    \n-
    268#endif // DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH
    \n-\n-\n+
    196
    \n+
    197 private:
    \n+
    198 NodeStorage _children;
    \n+
    199 };
    \n+
    \n+
    200
    \n+
    202
    \n+
    203 } // namespace TypeTree
    \n+
    204} //namespace Dune
    \n+
    205
    \n+
    206#endif // DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n+\n+\n+\n
    Definition accumulate_static.hh:16
    \n-
    Base class for composite nodes representing a filtered view on an underlying composite node.
    Definition filteredcompositenode.hh:83
    \n-
    auto childStorage(index_constant< k >={}) const
    Returns the storage of the k-th child (const version).
    Definition filteredcompositenode.hh:181
    \n-
    static constexpr auto degree()
    Definition filteredcompositenode.hh:117
    \n-
    mapped_children::NodeStorage NodeStorage
    The type used for storing the children.
    Definition filteredcompositenode.hh:103
    \n-
    void setChild(ChildType &&child, typename std::enable_if< lazy_enable< k >::value, void * >::type=0)
    Sets the k-th child to the passed-in value.
    Definition filteredcompositenode.hh:188
    \n-
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition filteredcompositenode.hh:109
    \n-
    const Node & unfiltered() const
    Returns the unfiltered node (const version).
    Definition filteredcompositenode.hh:215
    \n-
    static const bool isComposite
    Mark this class as a composite in the dune-typetree.
    Definition filteredcompositenode.hh:115
    \n-
    std::enable_if< enabled, std::shared_ptr< Node > >::type unfilteredStorage()
    Returns the storage object of the unfiltered node.
    Definition filteredcompositenode.hh:226
    \n-
    static const bool isPower
    Mark this class as a non power in the dune-typetree.
    Definition filteredcompositenode.hh:112
    \n-
    FilteredCompositeNode(Node &node)
    Initialize the CompositeNode with a copy of the passed-in storage type.
    Definition filteredcompositenode.hh:253
    \n-
    FilteredCompositeNode(std::shared_ptr< Node > node)
    Initialize the CompositeNode with copies of the passed in Storage objects.
    Definition filteredcompositenode.hh:248
    \n-
    auto childStorage(index_constant< k >={})
    Returns the storage of the k-th child.
    Definition filteredcompositenode.hh:171
    \n-
    const auto & child(index_constant< k >={}) const
    Returns the k-th child (const version).
    Definition filteredcompositenode.hh:160
    \n-
    auto & child(index_constant< k >={})
    Returns the k-th child.
    Definition filteredcompositenode.hh:150
    \n-
    CompositeNodeTag NodeTag
    The type tag that describes a CompositeNode.
    Definition filteredcompositenode.hh:100
    \n-
    mapped_children::ChildTypes ChildTypes
    A tuple storing the types of all children.
    Definition filteredcompositenode.hh:106
    \n-
    std::enable_if< enabled, Node & >::type unfiltered()
    Returns the unfiltered node.
    Definition filteredcompositenode.hh:206
    \n-
    std::shared_ptr< const Node > unfilteredStorage() const
    Returns the storage object of the unfiltered node (const version).
    Definition filteredcompositenode.hh:235
    \n-
    Access to the type and storage type of the i-th child.
    Definition filteredcompositenode.hh:124
    \n-
    OriginalChild::type type
    The type of the child.
    Definition filteredcompositenode.hh:138
    \n-
    OriginalChild::Type Type
    The type of the child.
    Definition filteredcompositenode.hh:135
    \n-
    Tag designating a composite node.
    Definition nodetags.hh:27
    \n+
    Collect multiple instances of type T within a dune-typetree.
    Definition dynamicpowernode.hh:35
    \n+
    static const bool isPower
    Mark this class as a power in the dune-typetree.
    Definition dynamicpowernode.hh:43
    \n+
    std::vector< ChildStorageType > NodeStorage
    The type used for storing the children.
    Definition dynamicpowernode.hh:67
    \n+
    const NodeStorage & nodeStorage() const
    Definition dynamicpowernode.hh:137
    \n+
    ChildConstStorageType childStorage(std::size_t i) const
    Returns the storage of the i-th child (const version).
    Definition dynamicpowernode.hh:110
    \n+
    const ChildType & child(std::size_t i) const
    Returns the i-th child (const version).
    Definition dynamicpowernode.hh:87
    \n+
    std::shared_ptr< T > ChildStorageType
    The storage type of each child.
    Definition dynamicpowernode.hh:61
    \n+
    DynamicPowerNode(T &t1, T &t2,...)
    Initialize all children with the passed-in objects.
    Definition dynamicpowernode.hh:174
    \n+
    std::shared_ptr< const T > ChildConstStorageType
    The const version of the storage type of each child.
    Definition dynamicpowernode.hh:64
    \n+
    DynamicPowerNode(NodeStorage children)
    Initialize the DynamicPowerNode with a copy of the passed-in storage type.
    Definition dynamicpowernode.hh:167
    \n+
    DynamicPowerNodeTag NodeTag
    The type tag that describes the node.
    Definition dynamicpowernode.hh:55
    \n+
    T ChildType
    The type of each child.
    Definition dynamicpowernode.hh:58
    \n+
    void setChild(std::size_t i, ChildType &t)
    Sets the i-th child to the passed-in value.
    Definition dynamicpowernode.hh:117
    \n+
    void setChild(std::size_t i, ChildStorageType st)
    Sets the stored value representing the i-th child to the passed-in value.
    Definition dynamicpowernode.hh:131
    \n+
    DynamicPowerNode(std::size_t size)
    Construct a node with the given number of children.
    Definition dynamicpowernode.hh:162
    \n+
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition dynamicpowernode.hh:46
    \n+
    void setChild(std::size_t i, ChildType &&t)
    Store the passed value in i-th child.
    Definition dynamicpowernode.hh:124
    \n+
    ChildType & child(std::size_t i)
    Returns the i-th child.
    Definition dynamicpowernode.hh:77
    \n+
    std::size_t degree() const
    The number of children.
    Definition dynamicpowernode.hh:49
    \n+
    ChildStorageType childStorage(std::size_t i)
    Returns the storage of the i-th child.
    Definition dynamicpowernode.hh:97
    \n+
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition dynamicpowernode.hh:40
    \n+\n+
    Tag designating a power node with runtime degree.
    Definition nodetags.hh:24
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,333 +1,257 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-filteredcompositenode.hh\n+dynamicpowernode.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n-7#define DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n+6#ifndef DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n+7#define DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n 8\n-9#include \n-10#include \n-11#include \n-12\n-13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n-15#include \n-16#include \n-17#include \n-18\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-21\n-22namespace _\bD_\bu_\bn_\be {\n-23 namespace TypeTree {\n-24\n-30#ifndef DOXYGEN\n-31 namespace {\n-32\n-33 /\n-/\n-********************************************************************************\n-34 // Utility structs for filter construction and application\n-35 /\n-/\n-********************************************************************************\n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15#include \n+16\n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+20\n+21namespace _\bD_\bu_\bn_\be {\n+22 namespace TypeTree {\n+23\n+33 template\n+_\b3_\b4 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+35 {\n 36\n-37 // Gets the filter and wraps it in case of a SimpleFilter.\n-38 template\n-39 struct get_filter;\n-40\n-41 // Helper struct to extract the child template parameter pack from the\n-ChildTypes tuple.\n-42 template\n-43 struct apply_filter_wrapper;\n+37 public:\n+38\n+_\b4_\b0 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n+41\n+_\b4_\b3 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = true;\n 44\n-45 template\n-46 struct apply_filter_wrapper >\n-47 : public Filter::template apply\n-48 {};\n-49\n-50 // specialization for SimpleFilter\n-51 template\n-52 struct get_filter\n-53 {\n-54 struct type\n-55 {\n-56 template\n-57 struct apply\n-58 : public apply_filter_wrapper,Node,ChildTypes>\n-59 {};\n-60 };\n-61 };\n+_\b4_\b6 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n+47\n+_\b4_\b9 std::size_t _\bd_\be_\bg_\br_\be_\be() const\n+50 {\n+51 return _children.size();\n+52 }\n+53\n+_\b5_\b5 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n+56\n+_\b5_\b8 typedef T _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n+59\n+_\b6_\b1 typedef std::shared_ptr _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be;\n 62\n-63 // specialization for AdvancedFilter\n-64 template\n-65 struct get_filter\n-66 {\n-67 struct type\n-68 {\n-69 template\n-70 struct apply\n-71 : public apply_filter_wrapper\n-72 {};\n-73 };\n-74 };\n-75\n-76 } // anonymous namespace\n-77#endif // DOXYGEN\n-78\n-79\n-81 template\n-_\b8_\b2 class _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-83 {\n+_\b6_\b4 typedef std::shared_ptr _\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be;\n+65\n+_\b6_\b7 typedef std::vector _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+68\n+69\n+72\n+74\n+_\b7_\b7 _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n+78 {\n+79 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+80 return *_children[i];\n+81 }\n+82\n 84\n-85 typedef typename get_filter::type filter;\n-86 typedef typename filter::template apply::\n-type filter_result;\n-87 typedef typename filter_result::template apply mapped_children;\n-88\n-89 static const bool nodeIsConst = std::is_const::type>::value;\n-90\n-91 template\n-92 struct lazy_enable\n-93 {\n-94 static const bool value = !nodeIsConst;\n-95 };\n-96\n-97 public:\n-98\n-_\b1_\b0_\b0 typedef _\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-101\n-_\b1_\b0_\b3 typedef typename mapped_children::NodeStorage _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+_\b8_\b7 const _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n+88 {\n+89 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+90 return *_children[i];\n+91 }\n+92\n+94\n+_\b9_\b7 _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n+98 {\n+99 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+100 return _children[i];\n+101 }\n+102\n 104\n-_\b1_\b0_\b6 typedef typename mapped_children::ChildTypes _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n-107\n-_\b1_\b0_\b9 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n-110\n-_\b1_\b1_\b2 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = false;\n-113\n-_\b1_\b1_\b5 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = true;\n-116\n-_\b1_\b1_\b7 static constexpr auto _\bd_\be_\bg_\br_\be_\be ()\n+_\b1_\b1_\b0 _\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n+111 {\n+112 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+113 return _children[i];\n+114 }\n+115\n+_\b1_\b1_\b7 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& t)\n 118 {\n-119 return std::integral_constant{};\n-120 }\n-121\n-123 template\n-_\b1_\b2_\b4 struct _\bC_\bh_\bi_\bl_\bd {\n-125\n-126#ifndef DOXYGEN\n-127\n-128 typedef typename std::tuple_element::\n-type OriginalChild;\n+119 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+120 _children[i] = stackobject_to_shared_ptr(t);\n+121 }\n+122\n+_\b1_\b2_\b4 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be&& t)\n+125 {\n+126 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+127 _children[i] = convert_arg(std::move(t));\n+128 }\n 129\n-130 static const std::size_t mapped_index = std::tuple_element::type::original_index;\n-131\n-132#endif // DOXYGEN\n-133\n-_\b1_\b3_\b5 typedef typename OriginalChild::Type _\bT_\by_\bp_\be;\n+_\b1_\b3_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be st)\n+132 {\n+133 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n+134 _children[i] = std::move(st);\n+135 }\n 136\n-_\b1_\b3_\b8 typedef typename OriginalChild::type _\bt_\by_\bp_\be;\n-139 };\n-140\n+_\b1_\b3_\b7 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n+138 {\n+139 return _children;\n+140 }\n+141\n 143\n-145\n-148 template::value, int>::type = 0>\n-_\b1_\b5_\b0 auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {})\n-151 {\n-152 return _node->template child::mapped_index>();\n-153 }\n+146\n+147 protected:\n+148\n+_\b1_\b5_\b1 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be () = delete;\n+152\n 154\n-156\n-159 template\n-_\b1_\b6_\b0 const auto& _\bc_\bh_\bi_\bl_\bd (index_constant = {}) const\n-161 {\n-162 return _node->template child::mapped_index>();\n-163 }\n-164\n-166\n-169 template::value, int>::type = 0>\n-_\b1_\b7_\b1 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {})\n-172 {\n-173 return _node->template childStorage::mapped_index>();\n-174 }\n-175\n-177\n-180 template\n-_\b1_\b8_\b1 auto _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (index_constant = {}) const\n+_\b1_\b6_\b2 explicit _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::size_t size)\n+163 : _children(size)\n+164 {}\n+165\n+_\b1_\b6_\b7 explicit _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be children)\n+168 : _children(std::move(children))\n+169 {}\n+170\n+171#ifdef DOXYGEN\n+172\n+_\b1_\b7_\b4 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (T& t1, T& t2, ...)\n+175 {}\n+176\n+177#else\n+178\n+179 template> &&...),\n+bool> = true>\n+181 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (Children&&... children)\n 182 {\n-183 return _node->template childStorage::mapped_index>();\n+183 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{convert_arg(std::forward(children))...};\n 184 }\n 185\n-187 template\n-_\b1_\b8_\b8 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (ChildType&& _\bc_\bh_\bi_\bl_\bd, typename std::enable_if::\n-value,void*>::type = 0)\n+186 template> &&...),\n+bool> = true>\n+188 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::shared_ptr... children)\n 189 {\n-190 _node->template setChild::mapped_index>(std::forward\n-(_\bc_\bh_\bi_\bl_\bd));\n+190 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{std::move(children)...};\n 191 }\n 192\n+193#endif // DOXYGEN\n 194\n-197\n-198 protected:\n-199\n-201\n-204 template\n-205 typename std::enable_if::type\n-_\b2_\b0_\b6 _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd ()\n-207 {\n-208 return *_node;\n-209 }\n-210\n-212\n-_\b2_\b1_\b5 const Node& _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd () const\n-216 {\n-217 return *_node;\n-218 }\n-219\n-221\n-224 template\n-225 typename std::enable_if >::type\n-_\b2_\b2_\b6 _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be ()\n-227 {\n-228 return _node;\n-229 }\n-230\n-232\n-_\b2_\b3_\b5 std::shared_ptr _\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-236 {\n-237 return _node;\n-238 }\n-239\n-241\n-242 public:\n-243\n-246\n-_\b2_\b4_\b8 _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (std::shared_ptr node)\n-249 : _node(std::move(node))\n-250 {}\n-251\n-_\b2_\b5_\b3 _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be (Node& node)\n-254 : _node(stackobject_to_shared_ptr(node))\n-255 {}\n-256\n-258\n-259 private:\n-260 std::shared_ptr _node;\n-261 };\n-262\n-264\n-265 } // namespace TypeTree\n-266} //namespace Dune\n-267\n-268#endif // DUNE_TYPETREE_FILTEREDCOMPOSITENODE_HH\n+196\n+197 private:\n+198 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n+199 };\n+200\n+202\n+203 } // namespace TypeTree\n+204} //namespace Dune\n+205\n+206#endif // DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bf_\bi_\bl_\bt_\be_\br_\bs_\b._\bh_\bh\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-Base class for composite nodes representing a filtered view on an underlying\n-composite node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(index_constant< k >={}) const\n-Returns the storage of the k-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-static constexpr auto degree()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-mapped_children::NodeStorage NodeStorage\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+Collect multiple instances of type T within a dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n+static const bool isPower\n+Mark this class as a power in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::vector< ChildStorageType > NodeStorage\n The type used for storing the children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(ChildType &&child, typename std::enable_if< lazy_enable< k >::\n-value, void * >::type=0)\n-Sets the k-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+const NodeStorage & nodeStorage() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+ChildConstStorageType childStorage(std::size_t i) const\n+Returns the storage of the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+const ChildType & child(std::size_t i) const\n+Returns the i-th child (const version).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be\n+std::shared_ptr< T > ChildStorageType\n+The storage type of each child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+DynamicPowerNode(T &t1, T &t2,...)\n+Initialize all children with the passed-in objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be\n+std::shared_ptr< const T > ChildConstStorageType\n+The const version of the storage type of each child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+DynamicPowerNode(NodeStorage children)\n+Initialize the DynamicPowerNode with a copy of the passed-in storage type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:167\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+DynamicPowerNodeTag NodeTag\n+The type tag that describes the node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n+T ChildType\n+The type of each child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, ChildType &t)\n+Sets the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, ChildStorageType st)\n+Sets the stored value representing the i-th child to the passed-in value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+DynamicPowerNode(std::size_t size)\n+Construct a node with the given number of children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n+static const bool isComposite\n+Mark this class as a non composite in the dune-typetree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n+void setChild(std::size_t i, ChildType &&t)\n+Store the passed value in i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ChildType & child(std::size_t i)\n+Returns the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n+std::size_t degree() const\n+The number of children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n+ChildStorageType childStorage(std::size_t i)\n+Returns the storage of the i-th child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n static const bool isLeaf\n Mark this class as non leaf in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd\n-const Node & unfiltered() const\n-Returns the unfiltered node (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::enable_if< enabled, std::shared_ptr< Node > >::type unfilteredStorage()\n-Returns the storage object of the unfiltered node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Mark this class as a non power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-FilteredCompositeNode(Node &node)\n-Initialize the CompositeNode with a copy of the passed-in storage type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be\n-FilteredCompositeNode(std::shared_ptr< Node > node)\n-Initialize the CompositeNode with copies of the passed in Storage objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-auto childStorage(index_constant< k >={})\n-Returns the storage of the k-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const auto & child(index_constant< k >={}) const\n-Returns the k-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:160\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-auto & child(index_constant< k >={})\n-Returns the k-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-CompositeNodeTag NodeTag\n-The type tag that describes a CompositeNode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n-mapped_children::ChildTypes ChildTypes\n-A tuple storing the types of all children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd\n-std::enable_if< enabled, Node & >::type unfiltered()\n-Returns the unfiltered node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bu_\bn_\bf_\bi_\bl_\bt_\be_\br_\be_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::shared_ptr< const Node > unfilteredStorage() const\n-Returns the storage object of the unfiltered node (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n-Access to the type and storage type of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bt_\by_\bp_\be\n-OriginalChild::type type\n-The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\b:_\b:_\bT_\by_\bp_\be\n-OriginalChild::Type Type\n-The type of the child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filteredcompositenode.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a composite node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:27\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n+DynamicPowerNode()=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n+Tag designating a power node with runtime degree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00074.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00074.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: filters.hh File Reference\n+dune-typetree: fixedcapacitystack.hh File Reference\n \n \n \n \n \n \n \n@@ -72,61 +72,27 @@\n
  • dune
  • typetree
  • \n
    \n \n
    \n \n-
    filters.hh File Reference
    \n+
    fixedcapacitystack.hh File Reference
    \n
    \n
    \n-
    #include <tuple>
    \n-#include <dune/common/typetraits.hh>
    \n+
    #include <array>
    \n+#include <cassert>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n \n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    struct  Dune::TypeTree::FilterEntry< new_k, old_k >
     A filter entry describing the mapping of one child in the filtered node. More...
    class  Dune::TypeTree::FixedCapacityStackView< T >
     
    struct  Dune::TypeTree::FilterResult< FilterEntries >
     The result of a filter. More...
     
    struct  Dune::TypeTree::FilterResult< FilterEntries >::apply< Node >
     
    struct  Dune::TypeTree::SimpleFilterTag
     Tag describing a simple filter that can only decide whether or not to include a single given child. More...
     
    struct  Dune::TypeTree::AdvancedFilterTag
     Tag describing an advanced filter that has full control over the construction of the list of FilterEntries. More...
     
    struct  Dune::TypeTree::AdvancedFilter
     Base class for advanced filters. More...
     
    struct  Dune::TypeTree::AdvancedFilter::apply< Node, Children >
     Apply this filter to the given node and children. More...
     
    struct  Dune::TypeTree::SimpleFilter
     Default simple filter that accepts any node and leaves its child structure unchanged. More...
     
    struct  Dune::TypeTree::SimpleFilter::validate< Node >
     Validates the combination of filter and node. More...
     
    struct  Dune::TypeTree::SimpleFilter::apply< Child, new_index, old_index >
     Applies the filter to the given child node. More...
     
    struct  Dune::TypeTree::IndexFilter< indices >
     Filter class for FilteredCompositeNode that selects the children with the given indices. More...
     
    struct  Dune::TypeTree::filter< Filter >
     Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter. More...
     
    struct  Dune::TypeTree::filter< Filter >::apply< Node, Children >
     Apply the filter. More...
    class  Dune::TypeTree::FixedCapacityStack< T, capacity >
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,62 +1,22 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-filters.hh File Reference\n-#include \n-#include \n+fixedcapacitystack.hh File Reference\n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by_\b<_\b _\bn_\be_\bw_\b__\bk_\b,_\b _\bo_\bl_\bd_\b__\bk_\b _\b>\n-\u00a0 A filter entry describing the mapping of one child in the filtered\n- node. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b<_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\bi_\be_\bs_\b _\b>\n-\u00a0 The result of a filter. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\bi_\be_\bs_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-\u00a0 Tag describing a simple filter that can only decide whether or not to\n- include a single given child. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-\u00a0 Tag describing an advanced filter that has full control over the\n- construction of the list of FilterEntries. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n-\u00a0 Base class for advanced filters. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n-\u00a0 Apply this filter to the given node and children. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n-\u00a0 Default simple filter that accepts any node and leaves its child\n- structure unchanged. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n-\u00a0 Validates the combination of filter and node. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bC_\bh_\bi_\bl_\bd_\b,_\b _\bn_\be_\bw_\b__\bi_\bn_\bd_\be_\bx_\b,_\b _\bo_\bl_\bd_\b__\bi_\bn_\bd_\be_\bx_\b _\b>\n-\u00a0 Applies the filter to the given child node. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br_\b<_\b _\bi_\bn_\bd_\bi_\bc_\be_\bs_\b _\b>\n-\u00a0 Filter class for _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be that selects the children with\n- the given indices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>\n-\u00a0 Adapter class that takes a _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br, validated it and turns it\n- into an _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n-\u00a0 Apply the filter. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\b<_\b _\bT_\b,_\b _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00074_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00074_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: filters.hh Source File\n+dune-typetree: fixedcapacitystack.hh Source File\n \n \n \n \n \n \n \n@@ -74,261 +74,215 @@\n \n
    \n \n
    \n \n
    \n-
    filters.hh
    \n+
    fixedcapacitystack.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=8 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_FILTERS_HH
    \n-
    7#define DUNE_TYPETREE_FILTERS_HH
    \n+
    6#ifndef DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n+
    7#define DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n
    8
    \n-
    9#include <tuple>
    \n-
    10
    \n-
    11#include <dune/common/typetraits.hh>
    \n-
    12
    \n-
    13namespace Dune {
    \n-
    14 namespace TypeTree {
    \n+
    9#include <array>
    \n+
    10#include <cassert>
    \n+
    11
    \n+
    12namespace Dune {
    \n+
    13 namespace TypeTree {
    \n+
    14
    \n
    15
    \n-
    22 template<std::size_t new_k, std::size_t old_k>
    \n-
    \n-\n-
    24 {
    \n+
    19
    \n+
    20 template<typename T>
    \n+
    \n+\n+
    22 {
    \n+
    23
    \n+
    24 public:
    \n
    25
    \n-
    26#ifndef DOXYGEN
    \n-
    27
    \n-
    28 // The precise contents of this class is an implementation detail.
    \n-
    29
    \n-
    30 static const std::size_t filtered_index = new_k;
    \n-
    31 static const std::size_t original_index = old_k;
    \n-
    32
    \n-
    33#endif // DOXYGEN
    \n+
    26 struct Impl
    \n+
    27 {
    \n+
    28
    \n+
    29 Impl(T* data, std::size_t capacity)
    \n+
    30 : _data(data)
    \n+
    31 , _size(0)
    \n+
    32 , _capacity(capacity)
    \n+
    33 {}
    \n
    34
    \n-
    35 };
    \n+
    35 T * const _data;
    \n+
    36 std::size_t _size;
    \n+
    37 const std::size_t _capacity;
    \n+
    38 };
    \n+
    39
    \n+
    \n+\n+
    41 : _impl(impl)
    \n+
    42 {}
    \n
    \n-
    36
    \n-
    38 template<typename... FilterEntries>
    \n-
    \n-\n-
    40 {
    \n-
    41
    \n-
    42 static const std::size_t size = sizeof...(FilterEntries);
    \n
    43
    \n-
    44 typedef std::tuple<FilterEntries...> IndexMap;
    \n+
    44 public:
    \n
    45
    \n-
    46 template<typename Node>
    \n-
    \n-
    47 struct apply
    \n-
    48 {
    \n-
    49 typedef std::tuple<typename Node::template Child<FilterEntries::original_index>...> Children;
    \n-
    50 typedef std::tuple<typename Node::template Child<FilterEntries::original_index>::Type...> ChildTypes;
    \n-
    51 typedef std::tuple<std::shared_ptr<typename Node::template Child<FilterEntries::original_index>::Type>...> NodeStorage;
    \n-
    52 };
    \n-
    \n-
    53
    \n-
    54 };
    \n+
    \n+
    46 std::size_t size() const
    \n+
    47 {
    \n+
    48 return _impl._size;
    \n+
    49 }
    \n+
    \n+
    50
    \n+
    \n+
    51 std::size_t capacity() const
    \n+
    52 {
    \n+
    53 return _impl._capacity;
    \n+
    54 }
    \n
    \n
    55
    \n-
    57 struct SimpleFilterTag {};
    \n-
    58
    \n-\n-
    61
    \n-
    62
    \n-
    \n-\n-
    65 {
    \n-
    66
    \n-\n-
    69
    \n-
    70#ifdef DOXYGEN
    \n+
    \n+
    56 bool empty() const
    \n+
    57 {
    \n+
    58 return _impl._size == 0;
    \n+
    59 }
    \n+
    \n+
    60
    \n+
    \n+
    61 bool full() const
    \n+
    62 {
    \n+
    63 return _impl._size == _impl._capacity;
    \n+
    64 }
    \n+
    \n+
    65
    \n+
    \n+
    66 void push_back(const T& t)
    \n+
    67 {
    \n+
    68 assert(!full());
    \n+
    69 _impl._data[_impl._size++] = t;
    \n+
    70 }
    \n+
    \n
    71
    \n-
    73 template<typename Node, typename... Children>
    \n-
    \n-
    74 struct apply
    \n-
    75 {
    \n+
    \n+
    72 void pop_back()
    \n+
    73 {
    \n+
    74 assert(!empty());
    \n+
    75 --_impl._size;
    \n+
    76 }
    \n+
    \n
    77
    \n-
    80 typedef implementation-defined type;
    \n-
    81 };
    \n+
    \n+
    78 T& back()
    \n+
    79 {
    \n+
    80 assert(!empty());
    \n+
    81 return _impl._data[_impl._size-1];
    \n+
    82 }
    \n+
    \n+
    83
    \n+
    \n+
    84 const T& back() const
    \n+
    85 {
    \n+
    86 assert(!empty());
    \n+
    87 return _impl._data[_impl._size-1];
    \n+
    88 }
    \n+
    \n+
    89
    \n+
    \n+
    90 T& front()
    \n+
    91 {
    \n+
    92 assert(!empty());
    \n+
    93 return _impl._data[0];
    \n+
    94 }
    \n
    \n-
    82
    \n-
    83#endif // DOXYGEN
    \n-
    84
    \n-
    85 };
    \n-
    \n-
    86
    \n-
    88
    \n-
    \n-\n-
    94 {
    \n
    95
    \n-\n-
    98
    \n-
    99
    \n-
    101 template<typename Node>
    \n-
    \n-
    102 struct validate
    \n+
    \n+
    96 const T& front() const
    \n+
    97 {
    \n+
    98 assert(!empty());
    \n+
    99 return _impl._data[0];
    \n+
    100 }
    \n+
    \n+
    101
    \n+
    \n+
    102 T& operator[](std::size_t k)
    \n
    103 {
    \n-
    105 static const bool value = true;
    \n-
    106 };
    \n+
    104 assert(k < _impl._size);
    \n+
    105 return _impl._data[k];
    \n+
    106 }
    \n
    \n
    107
    \n-
    109
    \n-
    117 template<typename Child, std::size_t new_index, std::size_t old_index>
    \n-
    \n-
    118 struct apply
    \n-
    119 {
    \n-
    121 static const bool value = true;
    \n-
    122 };
    \n-
    \n-
    123
    \n-
    124 };
    \n-
    \n-
    125
    \n-
    126 namespace {
    \n-
    127
    \n-
    128 // ********************************************************************************
    \n-
    129 // IndexFilter helpers
    \n-
    130 // ********************************************************************************
    \n-
    131
    \n-
    132 template<typename Node, std::size_t new_index, std::size_t... indices>
    \n-
    133 struct index_filter_helper
    \n-
    134 {
    \n-
    135 template<typename... FilterEntries>
    \n-
    136 struct apply
    \n-
    137 {
    \n-
    138 typedef FilterResult<FilterEntries...> type;
    \n-
    139 };
    \n-
    140 };
    \n-
    141
    \n-
    142 template<typename Node, std::size_t new_index, std::size_t old_index, std::size_t... indices>
    \n-
    143 struct index_filter_helper<Node,new_index,old_index,indices...>
    \n-
    144 {
    \n-
    145 template<typename... FilterEntries>
    \n-
    146 struct apply
    \n-
    147 : public index_filter_helper<Node,new_index+1,indices...>::template apply<FilterEntries...,
    \n-
    148 FilterEntry<new_index,
    \n-
    149 old_index>
    \n-
    150 >
    \n-
    151 {};
    \n-
    152 };
    \n-
    153
    \n-
    154 } // anonymous namespace
    \n-
    155
    \n-
    156
    \n-
    158 template<std::size_t... indices>
    \n-
    \n-\n-
    160 : public AdvancedFilter
    \n-
    161 {
    \n-
    162
    \n-
    163#ifndef DOXYGEN
    \n-
    164
    \n-
    165 template<typename Node, typename... Children>
    \n-
    166 struct apply
    \n-
    167 {
    \n-
    168 typedef typename index_filter_helper<Node,0,indices...>::template apply<>::type type;
    \n-
    169 };
    \n-
    170
    \n-
    171#endif // DOXYGEN
    \n-
    172
    \n-
    173 };
    \n-
    \n-
    174
    \n-
    175
    \n-
    176 // ********************************************************************************
    \n-
    177 // filter: Wrapper class for turning a simple filter into an advanced filter
    \n-
    178 // usable by FilteredCompositeNode
    \n-
    179 // ********************************************************************************
    \n-
    180
    \n-
    181 namespace {
    \n-
    182
    \n-
    183 template<typename Filter, std::size_t new_k, std::size_t old_k, typename... tail>
    \n-
    184 struct filter_helper
    \n-
    185 {
    \n-
    186 template<typename... FilterDescriptors>
    \n-
    187 struct apply
    \n-
    188 {
    \n-
    189 typedef FilterResult<FilterDescriptors...> type;
    \n-
    190 };
    \n-
    191 };
    \n-
    192
    \n-
    193 template<typename Filter, std::size_t new_k, std::size_t old_k, typename child, typename... tail>
    \n-
    194 struct filter_helper<Filter,new_k,old_k,child,tail...>
    \n-
    195 {
    \n-
    196
    \n-
    197 template<typename... FilterDescriptors>
    \n-
    198 struct apply
    \n-
    199 : public std::conditional<Filter::template apply<child,new_k,old_k>::value,
    \n-
    200 typename filter_helper<Filter,new_k+1,old_k+1,tail...>::template apply<FilterDescriptors...,FilterEntry<new_k,old_k> >,
    \n-
    201 typename filter_helper<Filter,new_k,old_k+1,tail...>::template apply<FilterDescriptors...>
    \n-
    202 >::type
    \n-
    203 {};
    \n-
    204
    \n-
    205 };
    \n-
    206
    \n-
    207 } // anonymous namespace
    \n-
    208
    \n-
    210 template<typename Filter>
    \n-
    \n-
    211 struct filter
    \n-
    212 {
    \n-
    213
    \n-
    215 template<typename Node, typename... Children>
    \n-
    \n-
    216 struct apply
    \n-
    217 {
    \n-
    218
    \n-
    219 static_assert((Filter::template validate<Node>::value),"Invalid simple filter");
    \n-
    220
    \n-
    221 typedef typename filter_helper<Filter,0,0,Children...>::template apply<>::type type;
    \n-
    222
    \n-
    223 };
    \n-
    \n-
    224
    \n-
    225 };
    \n-
    \n-
    226
    \n-
    228
    \n-
    229 } // namespace TypeTree
    \n-
    230} //namespace Dune
    \n-
    231
    \n-
    232#endif // DUNE_TYPETREE_FILTERS_HH
    \n-
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n+
    \n+
    108 const T& operator[](std::size_t k) const
    \n+
    109 {
    \n+
    110 assert(k < _impl._size);
    \n+
    111 return _impl._data[k];
    \n+
    112 }
    \n+
    \n+
    113
    \n+
    114 private:
    \n+
    115 Impl& _impl;
    \n+
    116
    \n+
    117 };
    \n+
    \n+
    118
    \n+
    119
    \n+
    120 template<typename T, std::size_t capacity>
    \n+
    \n+\n+
    122 : private std::array<T,capacity>
    \n+
    123 , private FixedCapacityStackView<T>::Impl
    \n+
    124 , public FixedCapacityStackView<T>
    \n+
    125 {
    \n+
    126
    \n+\n+
    128
    \n+
    129 public:
    \n+
    130
    \n+
    131 using view_base::back;
    \n+
    132 using view_base::front;
    \n+
    133 using view_base::size;
    \n+
    134 using view_base::operator[];
    \n+
    135
    \n+
    \n+\n+
    137 : FixedCapacityStackView<T>::Impl(&(static_cast<std::array<T,capacity>&>(*this)[0]),capacity)
    \n+
    138 , FixedCapacityStackView<T>(static_cast<typename FixedCapacityStackView<T>::Impl&>(*this))
    \n+
    139 {}
    \n+
    \n+
    140
    \n+
    141 private:
    \n+
    142
    \n+
    143 //FixedCapacityStack(const FixedCapacityStack&);
    \n+
    144 FixedCapacityStack& operator=(const FixedCapacityStack&);
    \n+
    145
    \n+
    146 };
    \n+
    \n+
    147
    \n+
    149
    \n+
    150 } // namespace TypeTree
    \n+
    151} //namespace Dune
    \n+
    152
    \n+
    153#endif // DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH
    \n
    Definition accumulate_static.hh:16
    \n-
    A filter entry describing the mapping of one child in the filtered node.
    Definition filters.hh:24
    \n-
    The result of a filter.
    Definition filters.hh:40
    \n-
    std::tuple< FilterEntries... > IndexMap
    Definition filters.hh:44
    \n-
    static const std::size_t size
    Definition filters.hh:42
    \n-
    Definition filters.hh:48
    \n-
    std::tuple< typename Node::template Child< FilterEntries::original_index >... > Children
    Definition filters.hh:49
    \n-
    std::tuple< typename Node::template Child< FilterEntries::original_index >::Type... > ChildTypes
    Definition filters.hh:50
    \n-
    std::tuple< std::shared_ptr< typename Node::template Child< FilterEntries::original_index >::Type >... > NodeStorage
    Definition filters.hh:51
    \n-
    Tag describing a simple filter that can only decide whether or not to include a single given child.
    Definition filters.hh:57
    \n-
    Tag describing an advanced filter that has full control over the construction of the list of FilterEn...
    Definition filters.hh:60
    \n-
    Base class for advanced filters.
    Definition filters.hh:65
    \n-
    AdvancedFilterTag FilterTag
    Filter tag for deciding on filter application mechanism.
    Definition filters.hh:68
    \n-
    Apply this filter to the given node and children.
    Definition filters.hh:75
    \n-
    implementation defined type
    The result of the filtering process.
    Definition filters.hh:80
    \n-
    Default simple filter that accepts any node and leaves its child structure unchanged.
    Definition filters.hh:94
    \n-
    SimpleFilterTag FilterTag
    Filter tag for deciding on filter application mechanism.
    Definition filters.hh:97
    \n-
    Validates the combination of filter and node.
    Definition filters.hh:103
    \n-
    static const bool value
    True if the combination of filter and node is valid.
    Definition filters.hh:105
    \n-
    Applies the filter to the given child node.
    Definition filters.hh:119
    \n-
    static const bool value
    True if the child will be included in the filtered node.
    Definition filters.hh:121
    \n-
    Filter class for FilteredCompositeNode that selects the children with the given indices.
    Definition filters.hh:161
    \n-
    Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter.
    Definition filters.hh:212
    \n-
    Apply the filter.
    Definition filters.hh:217
    \n-
    filter_helper< Filter, 0, 0, Children... >::template apply ::type type
    Definition filters.hh:221
    \n+
    Definition fixedcapacitystack.hh:22
    \n+
    bool empty() const
    Definition fixedcapacitystack.hh:56
    \n+
    bool full() const
    Definition fixedcapacitystack.hh:61
    \n+
    T & operator[](std::size_t k)
    Definition fixedcapacitystack.hh:102
    \n+
    void pop_back()
    Definition fixedcapacitystack.hh:72
    \n+
    T & back()
    Definition fixedcapacitystack.hh:78
    \n+
    std::size_t capacity() const
    Definition fixedcapacitystack.hh:51
    \n+
    T & front()
    Definition fixedcapacitystack.hh:90
    \n+
    const T & front() const
    Definition fixedcapacitystack.hh:96
    \n+
    const T & operator[](std::size_t k) const
    Definition fixedcapacitystack.hh:108
    \n+
    void push_back(const T &t)
    Definition fixedcapacitystack.hh:66
    \n+
    const T & back() const
    Definition fixedcapacitystack.hh:84
    \n+
    std::size_t size() const
    Definition fixedcapacitystack.hh:46
    \n+
    FixedCapacityStackView(Impl &impl)
    Definition fixedcapacitystack.hh:40
    \n+
    Definition fixedcapacitystack.hh:125
    \n+
    FixedCapacityStack()
    Definition fixedcapacitystack.hh:136
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,320 +1,211 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-filters.hh\n+fixedcapacitystack.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n+1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=8 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_FILTERS_HH\n-7#define DUNE_TYPETREE_FILTERS_HH\n+6#ifndef DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n+7#define DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n 8\n-9#include \n-10\n-11#include \n-12\n-13namespace _\bD_\bu_\bn_\be {\n-14 namespace TypeTree {\n+9#include \n+10#include \n+11\n+12namespace _\bD_\bu_\bn_\be {\n+13 namespace TypeTree {\n+14\n 15\n-22 template\n-_\b2_\b3 struct _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by\n-24 {\n+19\n+20 template\n+_\b2_\b1 class _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n+22 {\n+23\n+24 public:\n 25\n-26#ifndef DOXYGEN\n-27\n-28 // The precise contents of this class is an implementation detail.\n-29\n-30 static const std::size_t filtered_index = new_k;\n-31 static const std::size_t original_index = old_k;\n-32\n-33#endif // DOXYGEN\n+26 struct Impl\n+27 {\n+28\n+29 Impl(T* data, std::size_t _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n+30 : _data(data)\n+31 , _size(0)\n+32 , _capacity(_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n+33 {}\n 34\n-35 };\n-36\n-38 template\n-_\b3_\b9 struct _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt\n-40 {\n-41\n-_\b4_\b2 static const std::size_t _\bs_\bi_\bz_\be = sizeof...(FilterEntries);\n+35 T * const _data;\n+36 std::size_t _size;\n+37 const std::size_t _capacity;\n+38 };\n+39\n+_\b4_\b0 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw(Impl& impl)\n+41 : _impl(impl)\n+42 {}\n 43\n-_\b4_\b4 typedef std::tuple _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+44 public:\n 45\n-46 template\n-_\b4_\b7 struct _\ba_\bp_\bp_\bl_\by\n-48 {\n-_\b4_\b9 typedef std::tuple...> _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn;\n-_\b5_\b0 typedef std::tuple::Type...> _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n-_\b5_\b1 typedef std::tuple::Type>...> _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-52 };\n-53\n-54 };\n+_\b4_\b6 std::size_t _\bs_\bi_\bz_\be() const\n+47 {\n+48 return _impl._size;\n+49 }\n+50\n+_\b5_\b1 std::size_t _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by() const\n+52 {\n+53 return _impl._capacity;\n+54 }\n 55\n-_\b5_\b7 struct _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg {};\n-58\n-_\b6_\b0 struct _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg {};\n-61\n-62\n-_\b6_\b4 struct _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n-65 {\n-66\n-_\b6_\b8 typedef _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg _\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg;\n-69\n-70#ifdef DOXYGEN\n+_\b5_\b6 bool _\be_\bm_\bp_\bt_\by() const\n+57 {\n+58 return _impl._size == 0;\n+59 }\n+60\n+_\b6_\b1 bool _\bf_\bu_\bl_\bl() const\n+62 {\n+63 return _impl._size == _impl._capacity;\n+64 }\n+65\n+_\b6_\b6 void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const T& t)\n+67 {\n+68 assert(!_\bf_\bu_\bl_\bl());\n+69 _impl._data[_impl._size++] = t;\n+70 }\n 71\n-73 template\n-_\b7_\b4 struct _\ba_\bp_\bp_\bl_\by\n-75 {\n+_\b7_\b2 void _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk()\n+73 {\n+74 assert(!_\be_\bm_\bp_\bt_\by());\n+75 --_impl._size;\n+76 }\n 77\n-_\b8_\b0 typedef implementation-defined _\bt_\by_\bp_\be;\n-81 };\n-82\n-83#endif // DOXYGEN\n-84\n-85 };\n-86\n-88\n-_\b9_\b3 struct _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n-94 {\n+_\b7_\b8 T& _\bb_\ba_\bc_\bk()\n+79 {\n+80 assert(!_\be_\bm_\bp_\bt_\by());\n+81 return _impl._data[_impl._size-1];\n+82 }\n+83\n+_\b8_\b4 const T& _\bb_\ba_\bc_\bk() const\n+85 {\n+86 assert(!_\be_\bm_\bp_\bt_\by());\n+87 return _impl._data[_impl._size-1];\n+88 }\n+89\n+_\b9_\b0 T& _\bf_\br_\bo_\bn_\bt()\n+91 {\n+92 assert(!_\be_\bm_\bp_\bt_\by());\n+93 return _impl._data[0];\n+94 }\n 95\n-_\b9_\b7 typedef _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg _\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg;\n-98\n-99\n-101 template\n-_\b1_\b0_\b2 struct _\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n+_\b9_\b6 const T& _\bf_\br_\bo_\bn_\bt() const\n+97 {\n+98 assert(!_\be_\bm_\bp_\bt_\by());\n+99 return _impl._data[0];\n+100 }\n+101\n+_\b1_\b0_\b2 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t k)\n 103 {\n-_\b1_\b0_\b5 static const bool _\bv_\ba_\bl_\bu_\be = true;\n-106 };\n+104 assert(k < _impl._size);\n+105 return _impl._data[k];\n+106 }\n 107\n-109\n-117 template\n-_\b1_\b1_\b8 struct _\ba_\bp_\bp_\bl_\by\n-119 {\n-_\b1_\b2_\b1 static const bool _\bv_\ba_\bl_\bu_\be = true;\n-122 };\n-123\n-124 };\n-125\n-126 namespace {\n-127\n-128 /\n-/\n-********************************************************************************\n-129 // IndexFilter helpers\n-130 /\n-/\n-********************************************************************************\n-131\n-132 template\n-133 struct index_filter_helper\n-134 {\n-135 template\n-136 struct apply\n-137 {\n-138 typedef _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt type;\n-139 };\n-140 };\n-141\n-142 template\n-143 struct index_filter_helper\n-144 {\n-145 template\n-146 struct apply\n-147 : public index_filter_helper::template\n-apply\n-150 >\n-151 {};\n-152 };\n-153\n-154 } // anonymous namespace\n-155\n-156\n-158 template\n-_\b1_\b5_\b9 struct _\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br\n-160 : public _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n-161 {\n-162\n-163#ifndef DOXYGEN\n-164\n-165 template\n-166 struct _\ba_\bp_\bp_\bl_\by\n-167 {\n-168 typedef typename index_filter_helper::template _\ba_\bp_\bp_\bl_\by_\b<_\b>_\b:_\b:\n-_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n-169 };\n-170\n-171#endif // DOXYGEN\n-172\n-173 };\n-174\n-175\n-176 /\n-/\n-********************************************************************************\n-177 // filter: Wrapper class for turning a simple filter into an advanced\n-filter\n-178 // usable by FilteredCompositeNode\n-179 /\n-/\n-********************************************************************************\n-180\n-181 namespace {\n-182\n-183 template\n-184 struct filter_helper\n-185 {\n-186 template\n-187 struct apply\n-188 {\n-189 typedef _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt type;\n-190 };\n-191 };\n-192\n-193 template\n-194 struct filter_helper\n-195 {\n-196\n-197 template\n-198 struct apply\n-199 : public std::conditional::value,\n-200 typename filter_helper::template\n-apply >,\n-201 typename filter_helper::template\n-apply\n-202 >::type\n-203 {};\n-204\n-205 };\n-206\n-207 } // anonymous namespace\n-208\n-210 template\n-_\b2_\b1_\b1 struct _\bf_\bi_\bl_\bt_\be_\br\n-212 {\n-213\n-215 template\n-_\b2_\b1_\b6 struct _\ba_\bp_\bp_\bl_\by\n-217 {\n-218\n-219 static_assert((Filter::template validate::value),\"Invalid simple\n-filter\");\n-220\n-_\b2_\b2_\b1 typedef typename filter_helper::template _\ba_\bp_\bp_\bl_\by_\b<_\b>_\b:_\b:\n-_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n-222\n-223 };\n-224\n-225 };\n-226\n-228\n-229 } // namespace TypeTree\n-230} //namespace Dune\n-231\n-232#endif // DUNE_TYPETREE_FILTERS_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ImplementationDefined child(Node &&node, Indices... indices)\n-Extracts the child of a node given by a sequence of compile-time and run-time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n+_\b1_\b0_\b8 const T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t k) const\n+109 {\n+110 assert(k < _impl._size);\n+111 return _impl._data[k];\n+112 }\n+113\n+114 private:\n+115 Impl& _impl;\n+116\n+117 };\n+118\n+119\n+120 template\n+_\b1_\b2_\b1 class _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n+122 : private std::array\n+123 , private _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw::Impl\n+124 , public _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n+125 {\n+126\n+127 typedef _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b<_\bT_\b> _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be;\n+128\n+129 public:\n+130\n+131 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bb_\ba_\bc_\bk;\n+132 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bf_\br_\bo_\bn_\bt;\n+133 using _\bv_\bi_\be_\bw_\b__\bb_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be;\n+134 using view_base::operator[];\n+135\n+_\b1_\b3_\b6 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk()\n+137 : _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw::Impl(&(static_cast&>\n+(*this)[0]),_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n+138 , _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw(static_cast::Impl&>(*this))\n+139 {}\n+140\n+141 private:\n+142\n+143 //FixedCapacityStack(const FixedCapacityStack&);\n+144 _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk& operator=(const _\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk&);\n+145\n+146 };\n+147\n+149\n+150 } // namespace TypeTree\n+151} //namespace Dune\n+152\n+153#endif // DUNE_TYPETREE_FIXEDCAPACITYSTACK_HH\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by\n-A filter entry describing the mapping of one child in the filtered node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt\n-The result of a filter.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-std::tuple< FilterEntries... > IndexMap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-static const std::size_t size\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n-std::tuple< typename Node::template Child< FilterEntries::original_index >... >\n-Children\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n-std::tuple< typename Node::template Child< FilterEntries::original_index >::\n-Type... > ChildTypes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::tuple< std::shared_ptr< typename Node::template Child< FilterEntries::\n-original_index >::Type >... > NodeStorage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-Tag describing a simple filter that can only decide whether or not to include a\n-single given child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-Tag describing an advanced filter that has full control over the construction\n-of the list of FilterEn...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n-Base class for advanced filters.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-AdvancedFilterTag FilterTag\n-Filter tag for deciding on filter application mechanism.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-Apply this filter to the given node and children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bt_\by_\bp_\be\n-implementation defined type\n-The result of the filtering process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n-Default simple filter that accepts any node and leaves its child structure\n-unchanged.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n-SimpleFilterTag FilterTag\n-Filter tag for deciding on filter application mechanism.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n-Validates the combination of filter and node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static const bool value\n-True if the combination of filter and node is valid.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-Applies the filter to the given child node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static const bool value\n-True if the child will be included in the filtered node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br\n-Filter class for FilteredCompositeNode that selects the children with the given\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br\n-Adapter class that takes a SimpleFilter, validated it and turns it into an\n-AdvancedFilter.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-Apply the filter.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:217\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bt_\by_\bp_\be\n-filter_helper< Filter, 0, 0, Children... >::template apply ::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:221\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\be_\bm_\bp_\bt_\by\n+bool empty() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\bu_\bl_\bl\n+bool full() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+T & operator[](std::size_t k)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n+void pop_back()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bb_\ba_\bc_\bk\n+T & back()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by\n+std::size_t capacity() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+T & front()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+const T & front() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const T & operator[](std::size_t k) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+void push_back(const T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bb_\ba_\bc_\bk\n+const T & back() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bs_\bi_\bz_\be\n+std::size_t size() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\bV_\bi_\be_\bw\n+FixedCapacityStackView(Impl &impl)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bF_\bi_\bx_\be_\bd_\bC_\ba_\bp_\ba_\bc_\bi_\bt_\by_\bS_\bt_\ba_\bc_\bk\n+FixedCapacityStack()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fixedcapacitystack.hh:136\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00077.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00077.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: dynamicpowernode.hh File Reference\n+dune-typetree: typetree.hh File Reference\n \n \n \n \n \n \n \n@@ -69,45 +69,32 @@\n \n
    \n \n
    \n
    \n
    \n- \n-
    dynamicpowernode.hh File Reference
    \n+
    typetree.hh File Reference
    \n
    \n
    \n-
    #include <cassert>
    \n-#include <vector>
    \n-#include <memory>
    \n-#include <type_traits>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/utility.hh>
    \n-#include <dune/typetree/typetraits.hh>
    \n+\n

    Go to the source code of this file.

    \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
    \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::TypeTree::DynamicPowerNode< T >
     Collect multiple instances of type T within a dune-typetree. More...
     
    \n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,29 +1,23 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-dynamicpowernode.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+typetree.hh File Reference\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 Collect multiple instances of type T within a _\bd_\bu_\bn_\be_\b-_\bt_\by_\bp_\be_\bt_\br_\be_\be. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00077_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00077_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: dynamicpowernode.hh Source File\n+dune-typetree: typetree.hh Source File\n \n \n \n \n \n \n \n@@ -74,221 +74,53 @@\n \n
    \n \n
    \n
    \n
    \n-
    dynamicpowernode.hh
    \n+
    typetree.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n-
    7#define DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n+
    6#ifndef DUNE_TYPETREE_HH
    \n+
    7#define DUNE_TYPETREE_HH
    \n
    8
    \n-
    9#include <cassert>
    \n-
    10#include <vector>
    \n-
    11#include <memory>
    \n-
    12#include <type_traits>
    \n-
    13
    \n-
    14#include <dune/common/typetraits.hh>
    \n-
    15#include <dune/common/std/type_traits.hh>
    \n-
    16
    \n-\n-\n-\n-
    20
    \n-
    21namespace Dune {
    \n-
    22 namespace TypeTree {
    \n-
    23
    \n-
    33 template<typename T>
    \n-
    \n-\n-
    35 {
    \n-
    36
    \n-
    37 public:
    \n-
    38
    \n-
    40 static const bool isLeaf = false;
    \n-
    41
    \n-
    43 static const bool isPower = true;
    \n-
    44
    \n-
    46 static const bool isComposite = false;
    \n-
    47
    \n-
    \n-
    49 std::size_t degree() const
    \n-
    50 {
    \n-
    51 return _children.size();
    \n-
    52 }
    \n-
    \n-
    53
    \n-\n-
    56
    \n-
    58 typedef T ChildType;
    \n-
    59
    \n-
    61 typedef std::shared_ptr<T> ChildStorageType;
    \n-
    62
    \n-
    64 typedef std::shared_ptr<const T> ChildConstStorageType;
    \n-
    65
    \n-
    67 typedef std::vector<ChildStorageType> NodeStorage;
    \n-
    68
    \n-
    69
    \n-
    72
    \n-
    74
    \n-
    \n-
    77 ChildType& child (std::size_t i)
    \n-
    78 {
    \n-
    79 assert(i < degree() && "child index out of range");
    \n-
    80 return *_children[i];
    \n-
    81 }
    \n-
    \n-
    82
    \n-
    84
    \n-
    \n-
    87 const ChildType& child (std::size_t i) const
    \n-
    88 {
    \n-
    89 assert(i < degree() && "child index out of range");
    \n-
    90 return *_children[i];
    \n-
    91 }
    \n-
    \n-
    92
    \n-
    94
    \n-
    \n-\n-
    98 {
    \n-
    99 assert(i < degree() && "child index out of range");
    \n-
    100 return _children[i];
    \n-
    101 }
    \n-
    \n-
    102
    \n-
    104
    \n-
    \n-\n-
    111 {
    \n-
    112 assert(i < degree() && "child index out of range");
    \n-
    113 return _children[i];
    \n-
    114 }
    \n-
    \n-
    115
    \n-
    \n-
    117 void setChild (std::size_t i, ChildType& t)
    \n-
    118 {
    \n-
    119 assert(i < degree() && "child index out of range");
    \n-
    120 _children[i] = stackobject_to_shared_ptr(t);
    \n-
    121 }
    \n-
    \n-
    122
    \n-
    \n-
    124 void setChild (std::size_t i, ChildType&& t)
    \n-
    125 {
    \n-
    126 assert(i < degree() && "child index out of range");
    \n-
    127 _children[i] = convert_arg(std::move(t));
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    \n-
    131 void setChild (std::size_t i, ChildStorageType st)
    \n-
    132 {
    \n-
    133 assert(i < degree() && "child index out of range");
    \n-
    134 _children[i] = std::move(st);
    \n-
    135 }
    \n-
    \n-
    136
    \n-
    \n-
    137 const NodeStorage& nodeStorage () const
    \n-
    138 {
    \n-
    139 return _children;
    \n-
    140 }
    \n-
    \n-
    141
    \n-
    143
    \n-
    146
    \n-
    147 protected:
    \n-
    148
    \n-
    151 DynamicPowerNode () = delete;
    \n-
    152
    \n-
    154
    \n-
    \n-
    162 explicit DynamicPowerNode (std::size_t size)
    \n-
    163 : _children(size)
    \n-
    164 {}
    \n-
    \n-
    165
    \n-
    \n-
    167 explicit DynamicPowerNode (NodeStorage children)
    \n-
    168 : _children(std::move(children))
    \n-
    169 {}
    \n-
    \n-
    170
    \n-
    171#ifdef DOXYGEN
    \n-
    172
    \n-
    \n-
    174 DynamicPowerNode (T& t1, T& t2, ...)
    \n-
    175 {}
    \n-
    \n-
    176
    \n-
    177#else
    \n-
    178
    \n-
    179 template<typename... Children,
    \n-
    180 std::enable_if_t<(std::is_same_v<ChildType, std::decay_t<Children>> &&...), bool> = true>
    \n-
    181 DynamicPowerNode (Children&&... children)
    \n-
    182 {
    \n-
    183 _children = NodeStorage{convert_arg(std::forward<Children>(children))...};
    \n-
    184 }
    \n-
    185
    \n-
    186 template<typename... Children,
    \n-
    187 std::enable_if_t<(std::is_same_v<ChildType, std::decay_t<Children>> &&...), bool> = true>
    \n-
    188 DynamicPowerNode (std::shared_ptr<Children>... children)
    \n-
    189 {
    \n-
    190 _children = NodeStorage{std::move(children)...};
    \n-
    191 }
    \n-
    192
    \n-
    193#endif // DOXYGEN
    \n-
    194
    \n-
    196
    \n-
    197 private:
    \n-
    198 NodeStorage _children;
    \n-
    199 };
    \n-
    \n-
    200
    \n-
    202
    \n-
    203 } // namespace TypeTree
    \n-
    204} //namespace Dune
    \n-
    205
    \n-
    206#endif // DUNE_TYPETREE_DYNAMICPOWERNODE_HH
    \n-\n-\n-\n-
    Definition accumulate_static.hh:16
    \n-
    Collect multiple instances of type T within a dune-typetree.
    Definition dynamicpowernode.hh:35
    \n-
    static const bool isPower
    Mark this class as a power in the dune-typetree.
    Definition dynamicpowernode.hh:43
    \n-
    std::vector< ChildStorageType > NodeStorage
    The type used for storing the children.
    Definition dynamicpowernode.hh:67
    \n-
    const NodeStorage & nodeStorage() const
    Definition dynamicpowernode.hh:137
    \n-
    ChildConstStorageType childStorage(std::size_t i) const
    Returns the storage of the i-th child (const version).
    Definition dynamicpowernode.hh:110
    \n-
    const ChildType & child(std::size_t i) const
    Returns the i-th child (const version).
    Definition dynamicpowernode.hh:87
    \n-
    std::shared_ptr< T > ChildStorageType
    The storage type of each child.
    Definition dynamicpowernode.hh:61
    \n-
    DynamicPowerNode(T &t1, T &t2,...)
    Initialize all children with the passed-in objects.
    Definition dynamicpowernode.hh:174
    \n-
    std::shared_ptr< const T > ChildConstStorageType
    The const version of the storage type of each child.
    Definition dynamicpowernode.hh:64
    \n-
    DynamicPowerNode(NodeStorage children)
    Initialize the DynamicPowerNode with a copy of the passed-in storage type.
    Definition dynamicpowernode.hh:167
    \n-
    DynamicPowerNodeTag NodeTag
    The type tag that describes the node.
    Definition dynamicpowernode.hh:55
    \n-
    T ChildType
    The type of each child.
    Definition dynamicpowernode.hh:58
    \n-
    void setChild(std::size_t i, ChildType &t)
    Sets the i-th child to the passed-in value.
    Definition dynamicpowernode.hh:117
    \n-
    void setChild(std::size_t i, ChildStorageType st)
    Sets the stored value representing the i-th child to the passed-in value.
    Definition dynamicpowernode.hh:131
    \n-
    DynamicPowerNode(std::size_t size)
    Construct a node with the given number of children.
    Definition dynamicpowernode.hh:162
    \n-
    static const bool isComposite
    Mark this class as a non composite in the dune-typetree.
    Definition dynamicpowernode.hh:46
    \n-
    void setChild(std::size_t i, ChildType &&t)
    Store the passed value in i-th child.
    Definition dynamicpowernode.hh:124
    \n-
    ChildType & child(std::size_t i)
    Returns the i-th child.
    Definition dynamicpowernode.hh:77
    \n-
    std::size_t degree() const
    The number of children.
    Definition dynamicpowernode.hh:49
    \n-
    ChildStorageType childStorage(std::size_t i)
    Returns the storage of the i-th child.
    Definition dynamicpowernode.hh:97
    \n-
    static const bool isLeaf
    Mark this class as non leaf in the dune-typetree.
    Definition dynamicpowernode.hh:40
    \n-\n-
    Tag designating a power node with runtime degree.
    Definition nodetags.hh:24
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+
    22
    \n+
    23#endif // DUNE_TYPETREE_HH
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,257 +1,48 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-dynamicpowernode.hh\n+typetree.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n-7#define DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n+6#ifndef DUNE_TYPETREE_HH\n+7#define DUNE_TYPETREE_HH\n 8\n-9#include \n-10#include \n-11#include \n-12#include \n-13\n-14#include \n-15#include \n-16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-20\n-21namespace _\bD_\bu_\bn_\be {\n-22 namespace TypeTree {\n-23\n-33 template\n-_\b3_\b4 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-35 {\n-36\n-37 public:\n-38\n-_\b4_\b0 static const bool _\bi_\bs_\bL_\be_\ba_\bf = false;\n-41\n-_\b4_\b3 static const bool _\bi_\bs_\bP_\bo_\bw_\be_\br = true;\n-44\n-_\b4_\b6 static const bool _\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be = false;\n-47\n-_\b4_\b9 std::size_t _\bd_\be_\bg_\br_\be_\be() const\n-50 {\n-51 return _children.size();\n-52 }\n-53\n-_\b5_\b5 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg _\bN_\bo_\bd_\be_\bT_\ba_\bg;\n-56\n-_\b5_\b8 typedef T _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be;\n-59\n-_\b6_\b1 typedef std::shared_ptr _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be;\n-62\n-_\b6_\b4 typedef std::shared_ptr _\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be;\n-65\n-_\b6_\b7 typedef std::vector _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n-68\n-69\n-72\n-74\n-_\b7_\b7 _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (std::size_t i)\n-78 {\n-79 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-80 return *_children[i];\n-81 }\n-82\n-84\n-_\b8_\b7 const _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& _\bc_\bh_\bi_\bl_\bd (std::size_t i) const\n-88 {\n-89 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-90 return *_children[i];\n-91 }\n-92\n-94\n-_\b9_\b7 _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i)\n-98 {\n-99 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-100 return _children[i];\n-101 }\n-102\n-104\n-_\b1_\b1_\b0 _\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be _\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be (std::size_t i) const\n-111 {\n-112 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-113 return _children[i];\n-114 }\n-115\n-_\b1_\b1_\b7 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be& t)\n-118 {\n-119 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-120 _children[i] = stackobject_to_shared_ptr(t);\n-121 }\n-122\n-_\b1_\b2_\b4 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be&& t)\n-125 {\n-126 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-127 _children[i] = convert_arg(std::move(t));\n-128 }\n-129\n-_\b1_\b3_\b1 void _\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd (std::size_t i, _\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be st)\n-132 {\n-133 assert(i < _\bd_\be_\bg_\br_\be_\be() && \"child index out of range\");\n-134 _children[i] = std::move(st);\n-135 }\n-136\n-_\b1_\b3_\b7 const _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be& _\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be () const\n-138 {\n-139 return _children;\n-140 }\n-141\n-143\n-146\n-147 protected:\n-148\n-_\b1_\b5_\b1 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be () = delete;\n-152\n-154\n-_\b1_\b6_\b2 explicit _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::size_t size)\n-163 : _children(size)\n-164 {}\n-165\n-_\b1_\b6_\b7 explicit _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be children)\n-168 : _children(std::move(children))\n-169 {}\n-170\n-171#ifdef DOXYGEN\n-172\n-_\b1_\b7_\b4 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (T& t1, T& t2, ...)\n-175 {}\n-176\n-177#else\n-178\n-179 template> &&...),\n-bool> = true>\n-181 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (Children&&... children)\n-182 {\n-183 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{convert_arg(std::forward(children))...};\n-184 }\n-185\n-186 template> &&...),\n-bool> = true>\n-188 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be (std::shared_ptr... children)\n-189 {\n-190 _children = _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be{std::move(children)...};\n-191 }\n-192\n-193#endif // DOXYGEN\n-194\n-196\n-197 private:\n-198 _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be _children;\n-199 };\n-200\n-202\n-203 } // namespace TypeTree\n-204} //namespace Dune\n-205\n-206#endif // DUNE_TYPETREE_DYNAMICPOWERNODE_HH\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+22\n+23#endif // DUNE_TYPETREE_HH\n _\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-Collect multiple instances of type T within a dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bP_\bo_\bw_\be_\br\n-static const bool isPower\n-Mark this class as a power in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-std::vector< ChildStorageType > NodeStorage\n-The type used for storing the children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n-const NodeStorage & nodeStorage() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-ChildConstStorageType childStorage(std::size_t i) const\n-Returns the storage of the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-const ChildType & child(std::size_t i) const\n-Returns the i-th child (const version).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be\n-std::shared_ptr< T > ChildStorageType\n-The storage type of each child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-DynamicPowerNode(T &t1, T &t2,...)\n-Initialize all children with the passed-in objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bC_\bo_\bn_\bs_\bt_\bS_\bt_\bo_\br_\ba_\bg_\be_\bT_\by_\bp_\be\n-std::shared_ptr< const T > ChildConstStorageType\n-The const version of the storage type of each child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-DynamicPowerNode(NodeStorage children)\n-Initialize the DynamicPowerNode with a copy of the passed-in storage type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-DynamicPowerNodeTag NodeTag\n-The type tag that describes the node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be\n-T ChildType\n-The type of each child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, ChildType &t)\n-Sets the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, ChildStorageType st)\n-Sets the stored value representing the i-th child to the passed-in value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-DynamicPowerNode(std::size_t size)\n-Construct a node with the given number of children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be\n-static const bool isComposite\n-Mark this class as a non composite in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bs_\be_\bt_\bC_\bh_\bi_\bl_\bd\n-void setChild(std::size_t i, ChildType &&t)\n-Store the passed value in i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ChildType & child(std::size_t i)\n-Returns the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bd_\be_\bg_\br_\be_\be\n-std::size_t degree() const\n-The number of children.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd_\bS_\bt_\bo_\br_\ba_\bg_\be\n-ChildStorageType childStorage(std::size_t i)\n-Returns the storage of the i-th child.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bi_\bs_\bL_\be_\ba_\bf\n-static const bool isLeaf\n-Mark this class as non leaf in the dune-typetree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynamicpowernode.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be\n-DynamicPowerNode()=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bP_\bo_\bw_\be_\br_\bN_\bo_\bd_\be_\bT_\ba_\bg\n-Tag designating a power node with runtime degree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn nodetags.hh:24\n+_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bl_\be_\ba_\bf_\bn_\bo_\bd_\be_\b._\bh_\bh\n+_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh\n+_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n+_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n+_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bn_\bo_\bd_\be_\b._\bh_\bh\n+_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be_\b__\bs_\bt_\ba_\bt_\bi_\bc_\b._\bh_\bh\n+_\bp_\ba_\bi_\br_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n+_\bd_\by_\bn_\ba_\bm_\bi_\bc_\bp_\bo_\bw_\be_\br_\bn_\bo_\bd_\be_\b._\bh_\bh\n+_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00080.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00080.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: traversal.hh File Reference\n+dune-typetree: traversalutilities.hh File Reference\n \n \n \n \n \n \n \n@@ -71,78 +71,101 @@\n \n \n \n
    \n \n-
    traversal.hh File Reference
    \n+
    traversalutilities.hh File Reference
    \n
    \n
    \n-
    #include <utility>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/typetree/childextraction.hh>
    \n-#include <dune/typetree/nodetags.hh>
    \n-#include <dune/typetree/treepath.hh>
    \n-#include <dune/typetree/visitor.hh>
    \n+\n

    Go to the source code of this file.

    \n \n \n \n \n \n \n-\n-\n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    namespace  Dune::TypeTree::Detail
     
    \n-\n-\n-\n-\n-\n-\n-\n

    \n-Typedefs

    template<class Tree >
    using Dune::TypeTree::Detail::DynamicTraversalConcept = decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u)))
     
    template<class Tree >
    using Dune::TypeTree::Detail::StaticTraversalConcept = decltype((std::integral_constant< std::size_t, Tree::degree()>{}))
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+

    \n Functions

    template<class Tree , TreePathType::Type pathType, class Prefix , std::enable_if_t< Tree::isLeaf, int > = 0>
    constexpr auto Dune::TypeTree::Detail::leafTreePathTuple (Prefix prefix)
     
    template<class Tree , TreePathType::Type pathType, class Prefix , std::size_t... indices, std::enable_if_t<(Tree::isComposite or(Tree::isPower and(pathType!=TreePathType::dynamic))), int > = 0>
    constexpr auto Dune::TypeTree::Detail::leafTreePathTuple (Prefix prefix, std::index_sequence< indices... >)
     
    template<class T , class TreePath , class V , std::enable_if_t< std::decay_t< T >::isLeaf, int > = 0>
    void Dune::TypeTree::Detail::applyToTree (T &&tree, TreePath treePath, V &&visitor)
     
    template<class T , class TreePath , class PreFunc , class LeafFunc , class PostFunc >
    void Dune::TypeTree::Detail::forEachNode (T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc &&postFunc)
     
    template<class Tree , TreePathType::Type pathType = TreePathType::dynamic>
    constexpr auto Dune::TypeTree::leafTreePathTuple ()
     Create tuple of tree paths to leafs.
     
    template<typename Tree , typename Visitor >
    void Dune::TypeTree::applyToTree (Tree &&tree, Visitor &&visitor)
     Apply visitor to TypeTree.
     
    template<class Tree , class NodeFunc >
    void Dune::TypeTree::forEachNode (Tree &&tree, NodeFunc &&nodeFunc)
     Traverse tree and visit each node.
     
    template<class Tree , class LeafFunc >
    void Dune::TypeTree::forEachLeafNode (Tree &&tree, LeafFunc &&leafFunc)
     Traverse tree and visit each leaf node.
     
    template<typename ResultType , typename Tree , typename F , typename R >
    ResultType Dune::TypeTree::reduceOverLeafs (const Tree &tree, F functor, R reduction, ResultType startValue)
     Calculate a quantity as a reduction over the leaf nodes of a TypeTree.
     
    \n+

    Variable Documentation

    \n+\n+

    ◆ _functor

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    F _functor
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ _reduction

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    R _reduction
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ _value

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    ResultType _value
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ treePathType

    \n+\n+
    \n+
    \n+\n+ \n+ \n+ \n+ \n
    \n+ \n+ \n+ \n+ \n+
    const TreePathType::Type treePathType = TreePathType::dynamic
    \n+
    \n+static
    \n+
    \n+\n+
    \n+
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,73 +1,33 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-traversal.hh File Reference\n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+traversalutilities.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((std::\n- declval< Tree >()._\bd_\be_\bg_\br_\be_\be(), std::declval< Tree >()._\bc_\bh_\bi_\bl_\bd(0u)))\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((std::\n- integral_constant< std::size_t, Tree::degree()>{}))\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template = 0>\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be (Prefix prefix)\n-\u00a0\n-template = 0>\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be (Prefix prefix, std::\n- index_sequence< indices... >)\n-\u00a0\n-template::isLeaf, int > = 0>\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (T &&tree, TreePath\n- _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V &&visitor)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be (T &&tree, TreePath\n- _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc\n- &&postFunc)\n-\u00a0\n-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be ()\n-\u00a0 Create tuple of tree paths to leafs.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be (Tree &&tree, Visitor &&visitor)\n-\u00a0 Apply visitor to _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be (Tree &&tree, NodeFunc &&nodeFunc)\n-\u00a0 Traverse tree and visit each node.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be (Tree &&tree, LeafFunc\n- &&leafFunc)\n-\u00a0 Traverse tree and visit each leaf node.\n-\u00a0\n+template\n+ResultType\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs (const Tree &tree, F functor, R\n+ reduction, ResultType startValue)\n+\u00a0 Calculate a quantity as a reduction over the leaf nodes of a\n+ _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n+\u00a0\n+*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_f\bfu\bun\bnc\bct\bto\bor\br *\b**\b**\b**\b**\b*\n+F _functor\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_r\bre\bed\bdu\buc\bct\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+R _reduction\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_v\bva\bal\blu\bue\be *\b**\b**\b**\b**\b*\n+ResultType _value\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0t\btr\bre\bee\beP\bPa\bat\bth\bhT\bTy\byp\bpe\be *\b**\b**\b**\b**\b*\n+const TreePathType::Type treePathType = TreePathType::dynamic static\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00080_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00080_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: traversal.hh Source File\n+dune-typetree: traversalutilities.hh Source File\n \n \n \n \n \n \n \n@@ -74,279 +74,88 @@\n \n
    \n \n
    \n
    \n
    \n-
    traversal.hh
    \n+
    traversalutilities.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n
    5
    \n-
    6#ifndef DUNE_TYPETREE_TRAVERSAL_HH
    \n-
    7#define DUNE_TYPETREE_TRAVERSAL_HH
    \n+
    6#ifndef DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n+
    7#define DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n
    8
    \n-
    9#include <utility>
    \n+\n
    10
    \n-
    11#include <dune/common/hybridutilities.hh>
    \n-
    12#include <dune/common/std/type_traits.hh>
    \n+
    11namespace Dune {
    \n+
    12 namespace TypeTree {
    \n
    13
    \n-\n-\n-\n-\n-
    18
    \n-
    19namespace Dune {
    \n-
    20 namespace TypeTree {
    \n-
    21
    \n-
    27#ifndef DOXYGEN
    \n-
    29 struct NoOp
    \n-
    30 {
    \n-
    31 template<class... T>
    \n-
    32 constexpr void operator()(T&&...) const { /* do nothing */ }
    \n-
    33 };
    \n-
    34#endif
    \n-
    35
    \n-
    36 namespace Detail {
    \n-
    37
    \n-
    38 // SFINAE template check that Tree has a degree() function and a child() function accepting integer indices
    \n-
    39 template<class Tree>
    \n-
    40 using DynamicTraversalConcept = decltype((
    \n-
    41 std::declval<Tree>().degree(),
    \n-
    42 std::declval<Tree>().child(0u)
    \n-
    43 ));
    \n-
    44
    \n-
    45 // SFINAE template check that Tree has static (constexpr) function Tree::degree()
    \n-
    46 template<class Tree>
    \n-
    47 using StaticTraversalConcept = decltype((
    \n-
    48 std::integral_constant<std::size_t, Tree::degree()>{}
    \n-
    49 ));
    \n-
    50
    \n+
    19 namespace {
    \n+
    20
    \n+
    22
    \n+
    27 template<typename F, typename R, typename ResultType>
    \n+
    28 struct LeafReductionVisitor
    \n+
    29 : public TypeTree::TreeVisitor
    \n+
    30 {
    \n+
    31
    \n+\n+
    33
    \n+
    34 template<typename Node, typename TreePath>
    \n+
    35 void leaf(const Node& node, TreePath treePath)
    \n+
    36 {
    \n+\n+
    38 }
    \n+
    39
    \n+
    40 LeafReductionVisitor(F functor, R reduction, ResultType startValue)
    \n+
    41 : _functor(functor)
    \n+
    42 , _reduction(reduction)
    \n+
    43 , _value(startValue)
    \n+
    44 {}
    \n+
    45
    \n+
    46 ResultType result() { return _value; }
    \n+
    47
    \n+\n+\n+
    50 ResultType _value;
    \n
    51
    \n-
    52 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n-
    53 std::enable_if_t<Tree::isLeaf, int> = 0>
    \n-
    \n-
    54 constexpr auto leafTreePathTuple(Prefix prefix)
    \n-
    55 {
    \n-
    56 return std::make_tuple(prefix);
    \n-
    57 }
    \n+
    52 };
    \n+
    53
    \n+
    54 } // anonymous namespace
    \n+
    55
    \n+
    57
    \n+
    82 template<typename ResultType, typename Tree, typename F, typename R>
    \n+
    \n+
    83 ResultType reduceOverLeafs(const Tree& tree, F functor, R reduction, ResultType startValue)
    \n+
    84 {
    \n+
    85 LeafReductionVisitor<F,R,ResultType> visitor(functor,reduction,startValue);
    \n+
    86 TypeTree::applyToTree(tree,visitor);
    \n+
    87 return visitor.result();
    \n+
    88 }
    \n
    \n-
    58
    \n-
    59 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n-
    60 std::enable_if_t<not Tree::isLeaf, int> = 0>
    \n-
    61 constexpr auto leafTreePathTuple(Prefix prefix);
    \n-
    62
    \n-
    63 template<class Tree, TreePathType::Type pathType, class Prefix, std::size_t... indices,
    \n-
    64 std::enable_if_t<(Tree::isComposite or (Tree::isPower and (pathType!=TreePathType::dynamic))), int> = 0>
    \n-
    \n-
    65 constexpr auto leafTreePathTuple(Prefix prefix, std::index_sequence<indices...>)
    \n-
    66 {
    \n-
    67 return std::tuple_cat(Detail::leafTreePathTuple<TypeTree::Child<Tree,indices>, pathType>(Dune::TypeTree::push_back(prefix, Dune::index_constant<indices>{}))...);
    \n-
    68 }
    \n-
    \n-
    69
    \n-
    70 template<class Tree, TreePathType::Type pathType, class Prefix, std::size_t... indices,
    \n-
    71 std::enable_if_t<(Tree::isPower and (pathType==TreePathType::dynamic)), int> = 0>
    \n-
    72 constexpr auto leafTreePathTuple(Prefix prefix, std::index_sequence<indices...>)
    \n-
    73 {
    \n-
    74 return std::tuple_cat(Detail::leafTreePathTuple<TypeTree::Child<Tree,indices>, pathType>(Dune::TypeTree::push_back(prefix, indices))...);
    \n-
    75 }
    \n-
    76
    \n-
    77 template<class Tree, TreePathType::Type pathType, class Prefix,
    \n-
    78 std::enable_if_t<not Tree::isLeaf, int>>
    \n-
    79 constexpr auto leafTreePathTuple(Prefix prefix)
    \n-
    80 {
    \n-
    81 return Detail::leafTreePathTuple<Tree, pathType>(prefix, std::make_index_sequence<Tree::degree()>{});
    \n-
    82 }
    \n-
    83
    \n-
    84 /* The signature is the same as for the public applyToTree
    \n-
    85 * function in Dune::Typetree, despite the additionally passed
    \n-
    86 * treePath argument. The path passed here is associated to
    \n-
    87 * the tree and the relative paths of the children (wrt. to tree)
    \n-
    88 * are appended to this. Hence the behavior of the public function
    \n-
    89 * is resembled by passing an empty treePath.
    \n-
    90 */
    \n+
    89
    \n
    91
    \n-
    92 /*
    \n-
    93 * This is the overload for leaf traversal
    \n-
    94 */
    \n-
    95 template<class T, class TreePath, class V,
    \n-
    96 std::enable_if_t<std::decay_t<T>::isLeaf, int> = 0>
    \n-
    \n-
    97 void applyToTree(T&& tree, TreePath treePath, V&& visitor)
    \n-
    98 {
    \n-
    99 visitor.leaf(tree, treePath);
    \n-
    100 }
    \n-
    \n-
    101
    \n-
    102 /*
    \n-
    103 * This is the general overload doing child traversal.
    \n-
    104 */
    \n-
    105 template<class T, class TreePath, class V,
    \n-
    106 std::enable_if_t<not std::decay_t<T>::isLeaf, int> = 0>
    \n-
    107 void applyToTree(T&& tree, TreePath treePath, V&& visitor)
    \n-
    108 {
    \n-
    109 using Tree = std::remove_reference_t<T>;
    \n-
    110 using Visitor = std::remove_reference_t<V>;
    \n-
    111 visitor.pre(tree, treePath);
    \n-
    112
    \n-
    113 // check which type of traversal is supported by the tree
    \n-
    114 using allowDynamicTraversal = Dune::Std::is_detected<DynamicTraversalConcept,Tree>;
    \n-
    115 using allowStaticTraversal = Dune::Std::is_detected<StaticTraversalConcept,Tree>;
    \n-
    116
    \n-
    117 // the tree must support either dynamic or static traversal
    \n-
    118 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n-
    119
    \n-
    120 // the visitor may specify preferred dynamic traversal
    \n-
    121 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
    \n-
    122
    \n-
    123 // create a dynamic or static index range
    \n-
    124 auto indices = [&]{
    \n-
    125 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)
    \n-
    126 return Dune::range(std::size_t(tree.degree()));
    \n-
    127 else
    \n-
    128 return Dune::range(tree.degree());
    \n-
    129 }();
    \n-
    130
    \n-
    131 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {
    \n-
    132 Hybrid::forEach(indices, [&](auto i) {
    \n-
    133 auto&& child = tree.child(i);
    \n-
    134 using Child = std::decay_t<decltype(child)>;
    \n-
    135
    \n-
    136 visitor.beforeChild(tree, child, treePath, i);
    \n-
    137
    \n-
    138 // This requires that visitor.in(...) can always be instantiated,
    \n-
    139 // even if there's a single child only.
    \n-
    140 if (i>0)
    \n-
    141 visitor.in(tree, treePath);
    \n-
    142
    \n-
    143 constexpr bool visitChild = Visitor::template VisitChild<Tree,Child,TreePath>::value;
    \n-
    144 if constexpr(visitChild) {
    \n-
    145 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n-
    146 applyToTree(child, childTreePath, visitor);
    \n-
    147 }
    \n-
    148
    \n-
    149 visitor.afterChild(tree, child, treePath, i);
    \n-
    150 });
    \n-
    151 }
    \n-
    152 visitor.post(tree, treePath);
    \n-
    153 }
    \n-
    154
    \n-
    155 /* Traverse tree and visit each node. The signature is the same
    \n-
    156 * as for the public forEachNode function in Dune::Typtree,
    \n-
    157 * despite the additionally passed treePath argument. The path
    \n-
    158 * passed here is associated to the tree and the relative
    \n-
    159 * paths of the children (wrt. to tree) are appended to this.
    \n-
    160 * Hence the behavior of the public function is resembled
    \n-
    161 * by passing an empty treePath.
    \n-
    162 */
    \n-
    163 template<class T, class TreePath, class PreFunc, class LeafFunc, class PostFunc>
    \n-
    \n-
    164 void forEachNode(T&& tree, TreePath treePath, PreFunc&& preFunc, LeafFunc&& leafFunc, PostFunc&& postFunc)
    \n-
    165 {
    \n-
    166 using Tree = std::decay_t<T>;
    \n-
    167 if constexpr(Tree::isLeaf) {
    \n-
    168 leafFunc(tree, treePath);
    \n-
    169 } else {
    \n-
    170 preFunc(tree, treePath);
    \n-
    171
    \n-
    172 // check which type of traversal is supported by the tree, prefer dynamic traversal
    \n-
    173 using allowDynamicTraversal = Dune::Std::is_detected<DynamicTraversalConcept,Tree>;
    \n-
    174 using allowStaticTraversal = Dune::Std::is_detected<StaticTraversalConcept,Tree>;
    \n-
    175
    \n-
    176 // the tree must support either dynamic or static traversal
    \n-
    177 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
    \n-
    178
    \n-
    179 if constexpr(allowDynamicTraversal::value) {
    \n-
    180 // Specialization for dynamic traversal
    \n-
    181 for (std::size_t i = 0; i < tree.degree(); ++i) {
    \n-
    182 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n-
    183 forEachNode(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);
    \n-
    184 }
    \n-
    185 } else if constexpr(allowStaticTraversal::value) {
    \n-
    186 // Specialization for static traversal
    \n-
    187 auto indices = std::make_index_sequence<Tree::degree()>{};
    \n-
    188 Hybrid::forEach(indices, [&](auto i) {
    \n-
    189 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
    \n-
    190 forEachNode(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);
    \n-
    191 });
    \n-
    192 }
    \n-
    193 postFunc(tree, treePath);
    \n-
    194 }
    \n-
    195 }
    \n-
    \n-
    196
    \n-
    197 } // namespace Detail
    \n-
    198
    \n-
    199
    \n-
    200 // ********************************************************************************
    \n-
    201 // Public Interface
    \n-
    202 // ********************************************************************************
    \n-
    203
    \n-
    217 template<class Tree, TreePathType::Type pathType=TreePathType::dynamic>
    \n-
    \n-
    218 constexpr auto leafTreePathTuple()
    \n-
    219 {
    \n-
    220 return Detail::leafTreePathTuple<std::decay_t<Tree>, pathType>(hybridTreePath());
    \n-
    221 }
    \n-
    \n-
    222
    \n-
    224
    \n-
    238 template<typename Tree, typename Visitor>
    \n-
    \n-
    239 void applyToTree(Tree&& tree, Visitor&& visitor)
    \n-
    240 {
    \n-
    241 Detail::applyToTree(tree, hybridTreePath(), visitor);
    \n-
    242 }
    \n-
    \n-
    243
    \n-
    253 template<class Tree, class NodeFunc>
    \n-
    \n-
    254 void forEachNode(Tree&& tree, NodeFunc&& nodeFunc)
    \n-
    255 {
    \n-
    256 Detail::forEachNode(tree, hybridTreePath(), nodeFunc, nodeFunc, NoOp{});
    \n-
    257 }
    \n-
    \n-
    258
    \n-
    268 template<class Tree, class LeafFunc>
    \n-
    \n-
    269 void forEachLeafNode(Tree&& tree, LeafFunc&& leafFunc)
    \n-
    270 {
    \n-
    271 Detail::forEachNode(tree, hybridTreePath(), NoOp{}, leafFunc, NoOp{});
    \n-
    272 }
    \n-
    \n-
    273
    \n-
    275
    \n-
    276 } // namespace TypeTree
    \n-
    277} //namespace Dune
    \n-
    278
    \n-
    279#endif // DUNE_TYPETREE_TRAVERSAL_HH
    \n-\n-\n-\n-\n-
    void forEachNode(Tree &&tree, NodeFunc &&nodeFunc)
    Traverse tree and visit each node.
    Definition traversal.hh:254
    \n-
    constexpr auto leafTreePathTuple()
    Create tuple of tree paths to leafs.
    Definition traversal.hh:218
    \n-
    void forEachLeafNode(Tree &&tree, LeafFunc &&leafFunc)
    Traverse tree and visit each leaf node.
    Definition traversal.hh:269
    \n+
    92 } // namespace TypeTree
    \n+
    93} //namespace Dune
    \n+
    94
    \n+
    95#endif // DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n+\n+
    static const result_type result
    Definition accumulate_static.hh:113
    \n+
    R _reduction
    Definition traversalutilities.hh:49
    \n+
    F _functor
    Definition traversalutilities.hh:48
    \n+
    static const TreePathType::Type treePathType
    Definition traversalutilities.hh:32
    \n+
    ResultType _value
    Definition traversalutilities.hh:50
    \n+
    ResultType reduceOverLeafs(const Tree &tree, F functor, R reduction, ResultType startValue)
    Calculate a quantity as a reduction over the leaf nodes of a TypeTree.
    Definition traversalutilities.hh:83
    \n
    void applyToTree(Tree &&tree, Visitor &&visitor)
    Apply visitor to TypeTree.
    Definition traversal.hh:239
    \n-
    typename impl::_Child< Node, indices... >::type Child
    Template alias for the type of a child node given by a list of child indices.
    Definition childextraction.hh:225
    \n-
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n-
    constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
    Appends a run time index to a HybridTreePath.
    Definition treepath.hh:416
    \n-
    constexpr auto hybridTreePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:312
    \n
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n
    Definition accumulate_static.hh:16
    \n-
    void forEachNode(T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc &&leafFunc, PostFunc &&postFunc)
    Definition traversal.hh:164
    \n-
    decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u))) DynamicTraversalConcept
    Definition traversal.hh:43
    \n-
    decltype((std::integral_constant< std::size_t, Tree::degree()>{})) StaticTraversalConcept
    Definition traversal.hh:49
    \n-
    void applyToTree(T &&tree, TreePath treePath, V &&visitor)
    Definition traversal.hh:97
    \n-
    constexpr auto leafTreePathTuple(Prefix prefix)
    Definition traversal.hh:54
    \n
    Type
    Definition treepath.hh:106
    \n
    @ dynamic
    Definition treepath.hh:106
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,332 +1,108 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-traversal.hh\n+traversalutilities.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n 5\n-6#ifndef DUNE_TYPETREE_TRAVERSAL_HH\n-7#define DUNE_TYPETREE_TRAVERSAL_HH\n+6#ifndef DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n+7#define DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n 8\n-9#include \n+9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n 10\n-11#include \n-12#include \n+11namespace _\bD_\bu_\bn_\be {\n+12 namespace TypeTree {\n 13\n-14#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh>\n-18\n-19namespace _\bD_\bu_\bn_\be {\n-20 namespace TypeTree {\n-21\n-27#ifndef DOXYGEN\n-29 struct NoOp\n+19 namespace {\n+20\n+22\n+27 template\n+28 struct LeafReductionVisitor\n+29 : public TypeTree::TreeVisitor\n 30 {\n-31 template\n-32 constexpr void operator()(T&&...) const { /* do nothing */ }\n-33 };\n-34#endif\n-35\n-36 namespace Detail {\n-37\n-38 // SFINAE template check that Tree has a degree() function and a child()\n-function accepting integer indices\n-39 template\n-_\b4_\b0 using _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((\n-41 std::declval().degree(),\n-42 std::declval().child(0u)\n-43 ));\n-44\n-45 // SFINAE template check that Tree has static (constexpr) function Tree::\n-degree()\n-46 template\n-_\b4_\b7 using _\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt = decltype((\n-48 std::integral_constant{}\n-49 ));\n-50\n+31\n+_\b3_\b2 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc;\n+33\n+34 template\n+35 void leaf(const Node& node, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n+36 {\n+37 _\b__\bv_\ba_\bl_\bu_\be = _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(_\b__\bv_\ba_\bl_\bu_\be,_\b__\bf_\bu_\bn_\bc_\bt_\bo_\br(node,_\bt_\br_\be_\be_\bP_\ba_\bt_\bh));\n+38 }\n+39\n+40 LeafReductionVisitor(F functor, R reduction, ResultType startValue)\n+41 : _\b__\bf_\bu_\bn_\bc_\bt_\bo_\br(functor)\n+42 , _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction)\n+43 , _\b__\bv_\ba_\bl_\bu_\be(startValue)\n+44 {}\n+45\n+46 ResultType _\br_\be_\bs_\bu_\bl_\bt() { return _\b__\bv_\ba_\bl_\bu_\be; }\n+47\n+_\b4_\b8 F _\b__\bf_\bu_\bn_\bc_\bt_\bo_\br;\n+_\b4_\b9 R _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+_\b5_\b0 ResultType _\b__\bv_\ba_\bl_\bu_\be;\n 51\n-52 template = 0>\n-_\b5_\b4 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix)\n-55 {\n-56 return std::make_tuple(prefix);\n-57 }\n-58\n-59 template = 0>\n-61 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix);\n-62\n-63 template = 0>\n-_\b6_\b5 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix, std::\n-index_sequence)\n-66 {\n-67 return std::tuple_cat(_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be<_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:\n-_\bC_\bh_\bi_\bl_\bd_\b<_\bT_\br_\be_\be_\b,_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b>, pathType>(_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(prefix, Dune::\n-index_constant{}))...);\n-68 }\n-69\n-70 template\n-= 0>\n-72 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix, std::\n-index_sequence)\n-73 {\n-74 return std::tuple_cat(_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be<_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:\n-_\bC_\bh_\bi_\bl_\bd_\b<_\bT_\br_\be_\be_\b,_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b>, pathType>(_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(prefix, indices))...);\n-75 }\n-76\n-77 template>\n-79 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be(Prefix prefix)\n-80 {\n-81 return Detail::leafTreePathTuple(prefix, std::\n-make_index_sequence{});\n-82 }\n-83\n-84 /* The signature is the same as for the public applyToTree\n-85 * function in Dune::Typetree, despite the additionally passed\n-86 * treePath argument. The path passed here is associated to\n-87 * the tree and the relative paths of the children (wrt. to tree)\n-88 * are appended to this. Hence the behavior of the public function\n-89 * is resembled by passing an empty treePath.\n-90 */\n+52 };\n+53\n+54 } // anonymous namespace\n+55\n+57\n+82 template\n+_\b8_\b3 ResultType _\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs(const Tree& tree, F functor, R reduction,\n+ResultType startValue)\n+84 {\n+85 LeafReductionVisitor visitor(functor,reduction,startValue);\n+86 _\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,visitor);\n+87 return visitor.result();\n+88 }\n+89\n 91\n-92 /*\n-93 * This is the overload for leaf traversal\n-94 */\n-95 template::isLeaf, int> = 0>\n-_\b9_\b7 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n-98 {\n-99 visitor.leaf(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-100 }\n-101\n-102 /*\n-103 * This is the general overload doing child traversal.\n-104 */\n-105 template::isLeaf, int> = 0>\n-107 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, V&& visitor)\n-108 {\n-109 using Tree = std::remove_reference_t;\n-110 using Visitor = std::remove_reference_t;\n-111 visitor.pre(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-112\n-113 // check which type of traversal is supported by the tree\n-114 using allowDynamicTraversal = Dune::Std::\n-is_detected;\n-115 using allowStaticTraversal = Dune::Std::\n-is_detected;\n-116\n-117 // the tree must support either dynamic or static traversal\n-118 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n-119\n-120 // the visitor may specify preferred dynamic traversal\n-121 using preferDynamicTraversal = std::bool_constant;\n-122\n-123 // create a dynamic or static index range\n-124 auto indices = [&]{\n-125 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)\n-126 return Dune::range(std::size_t(tree.degree()));\n-127 else\n-128 return Dune::range(tree.degree());\n-129 }();\n-130\n-131 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {\n-132 Hybrid::forEach(indices, [&](auto i) {\n-133 auto&& _\bc_\bh_\bi_\bl_\bd = tree.child(i);\n-134 using _\bC_\bh_\bi_\bl_\bd = std::decay_t;\n-135\n-136 visitor.beforeChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-137\n-138 // This requires that visitor.in(...) can always be instantiated,\n-139 // even if there's a single child only.\n-140 if (i>0)\n-141 visitor.in(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-142\n-143 constexpr bool visitChild = Visitor::template\n-VisitChild::value;\n-144 if constexpr(visitChild) {\n-145 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-146 _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(_\bc_\bh_\bi_\bl_\bd, childTreePath, visitor);\n-147 }\n-148\n-149 visitor.afterChild(tree, _\bc_\bh_\bi_\bl_\bd, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-150 });\n-151 }\n-152 visitor.post(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-153 }\n-154\n-155 /* Traverse tree and visit each node. The signature is the same\n-156 * as for the public forEachNode function in Dune::Typtree,\n-157 * despite the additionally passed treePath argument. The path\n-158 * passed here is associated to the tree and the relative\n-159 * paths of the children (wrt. to tree) are appended to this.\n-160 * Hence the behavior of the public function is resembled\n-161 * by passing an empty treePath.\n-162 */\n-163 template\n-_\b1_\b6_\b4 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(T&& tree, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh, PreFunc&& preFunc, LeafFunc&&\n-leafFunc, PostFunc&& postFunc)\n-165 {\n-166 using Tree = std::decay_t;\n-167 if constexpr(Tree::isLeaf) {\n-168 leafFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-169 } else {\n-170 preFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-171\n-172 // check which type of traversal is supported by the tree, prefer dynamic\n-traversal\n-173 using allowDynamicTraversal = Dune::Std::\n-is_detected;\n-174 using allowStaticTraversal = Dune::Std::\n-is_detected;\n-175\n-176 // the tree must support either dynamic or static traversal\n-177 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);\n-178\n-179 if constexpr(allowDynamicTraversal::value) {\n-180 // Specialization for dynamic traversal\n-181 for (std::size_t i = 0; i < tree.degree(); ++i) {\n-182 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-183 _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);\n-184 }\n-185 } else if constexpr(allowStaticTraversal::value) {\n-186 // Specialization for static traversal\n-187 auto indices = std::make_index_sequence{};\n-188 Hybrid::forEach(indices, [&](auto i) {\n-189 auto childTreePath = _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bt_\br_\be_\be_\bP_\ba_\bt_\bh, i);\n-190 _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree.child(i), childTreePath, preFunc, leafFunc, postFunc);\n-191 });\n-192 }\n-193 postFunc(tree, _\bt_\br_\be_\be_\bP_\ba_\bt_\bh);\n-194 }\n-195 }\n-196\n-197 } // namespace Detail\n-198\n-199\n-200 /\n-/\n-********************************************************************************\n-201 // Public Interface\n-202 /\n-/\n-********************************************************************************\n-203\n-217 template\n-_\b2_\b1_\b8 constexpr auto _\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be()\n-219 {\n-220 return Detail::leafTreePathTuple, pathType>\n-(_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh());\n-221 }\n-222\n-224\n-238 template\n-_\b2_\b3_\b9 void _\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(Tree&& tree, Visitor&& visitor)\n-240 {\n-241 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), visitor);\n-242 }\n-243\n-253 template\n-_\b2_\b5_\b4 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(Tree&& tree, NodeFunc&& nodeFunc)\n-255 {\n-256 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), nodeFunc, nodeFunc, NoOp{});\n-257 }\n-258\n-268 template\n-_\b2_\b6_\b9 void _\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be(Tree&& tree, LeafFunc&& leafFunc)\n-270 {\n-271 _\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be(tree, _\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh(), NoOp{}, leafFunc, NoOp{});\n-272 }\n-273\n-275\n-276 } // namespace TypeTree\n-277} //namespace Dune\n-278\n-279#endif // DUNE_TYPETREE_TRAVERSAL_HH\n-_\bv_\bi_\bs_\bi_\bt_\bo_\br_\b._\bh_\bh\n-_\bt_\br_\be_\be_\bp_\ba_\bt_\bh_\b._\bh_\bh\n-_\bc_\bh_\bi_\bl_\bd_\be_\bx_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bn_\bo_\bd_\be_\bt_\ba_\bg_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be\n-void forEachNode(Tree &&tree, NodeFunc &&nodeFunc)\n-Traverse tree and visit each node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be\n-constexpr auto leafTreePathTuple()\n-Create tuple of tree paths to leafs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bL_\be_\ba_\bf_\bN_\bo_\bd_\be\n-void forEachLeafNode(Tree &&tree, LeafFunc &&leafFunc)\n-Traverse tree and visit each leaf node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:269\n+92 } // namespace TypeTree\n+93} //namespace Dune\n+94\n+95#endif // DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n+_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n+_\br_\be_\bs_\bu_\bl_\bt\n+static const result_type result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n+_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+R _reduction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:49\n+_\b__\bf_\bu_\bn_\bc_\bt_\bo_\br\n+F _functor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:48\n+_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n+static const TreePathType::Type treePathType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:32\n+_\b__\bv_\ba_\bl_\bu_\be\n+ResultType _value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs\n+ResultType reduceOverLeafs(const Tree &tree, F functor, R reduction, ResultType\n+startValue)\n+Calculate a quantity as a reduction over the leaf nodes of a TypeTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:83\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n void applyToTree(Tree &&tree, Visitor &&visitor)\n Apply visitor to TypeTree.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bC_\bh_\bi_\bl_\bd\n-typename impl::_Child< Node, indices... >::type Child\n-Template alias for the type of a child node given by a list of child indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n-ImplementationDefined child(Node &&node, Indices... indices)\n-Extracts the child of a node given by a sequence of compile-time and run-time\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath<\n-T... > &tp, std::size_t i)\n-Appends a run time index to a HybridTreePath.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bh_\by_\bb_\br_\bi_\bd_\bT_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto hybridTreePath(const T &... t)\n-Constructs a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:312\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n constexpr auto treePath(const T &... t)\n Constructs a new HybridTreePath from the given indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh_\bN_\bo_\bd_\be\n-void forEachNode(T &&tree, TreePath treePath, PreFunc &&preFunc, LeafFunc\n-&&leafFunc, PostFunc &&postFunc)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt\n-decltype((std::declval< Tree >().degree(), std::declval< Tree >().child(0u)))\n-DynamicTraversalConcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bT_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\bC_\bo_\bn_\bc_\be_\bp_\bt\n-decltype((std::integral_constant< std::size_t, Tree::degree()>{}))\n-StaticTraversalConcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n-void applyToTree(T &&tree, TreePath treePath, V &&visitor)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bD_\be_\bt_\ba_\bi_\bl_\b:_\b:_\bl_\be_\ba_\bf_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\bu_\bp_\bl_\be\n-constexpr auto leafTreePathTuple(Prefix prefix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:54\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n Type\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n @ dynamic\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00083.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00083.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: traversalutilities.hh File Reference\n+dune-typetree: exceptions.hh File Reference\n \n \n \n \n \n \n \n@@ -70,102 +70,41 @@\n
    \n \n
    \n
    \n
    \n \n-
    traversalutilities.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    exceptions.hh File Reference
    \n \n
    \n-
    #include <dune/typetree/traversal.hh>
    \n+\n+

    TypeTree-specific exceptions. \n+More...

    \n+
    #include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::TypeTree::Exception
     Base class for all TypeTree exceptions. More...
     
    \n \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n-\n-\n-\n-\n-\n-

    \n-Functions

    template<typename ResultType , typename Tree , typename F , typename R >
    ResultType Dune::TypeTree::reduceOverLeafs (const Tree &tree, F functor, R reduction, ResultType startValue)
     Calculate a quantity as a reduction over the leaf nodes of a TypeTree.
     
    \n-

    Variable Documentation

    \n-\n-

    ◆ _functor

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    F _functor
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ _reduction

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    R _reduction
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ _value

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    ResultType _value
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ treePathType

    \n-\n-
    \n-
    \n-\n- \n- \n- \n- \n
    \n- \n- \n- \n- \n-
    const TreePathType::Type treePathType = TreePathType::dynamic
    \n-
    \n-static
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Detailed Description

    \n+

    TypeTree-specific exceptions.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,24 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-traversalutilities.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+exceptions.hh File Reference\n+TypeTree-specific exceptions. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+\u00a0 Base class for all _\bT_\by_\bp_\be_\bT_\br_\be_\be exceptions. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-ResultType\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs (const Tree &tree, F functor, R\n- reduction, ResultType startValue)\n-\u00a0 Calculate a quantity as a reduction over the leaf nodes of a\n- _\bT_\by_\bp_\be_\bT_\br_\be_\be.\n-\u00a0\n-*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_f\bfu\bun\bnc\bct\bto\bor\br *\b**\b**\b**\b**\b*\n-F _functor\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_r\bre\bed\bdu\buc\bct\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-R _reduction\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0_\b_v\bva\bal\blu\bue\be *\b**\b**\b**\b**\b*\n-ResultType _value\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0t\btr\bre\bee\beP\bPa\bat\bth\bhT\bTy\byp\bpe\be *\b**\b**\b**\b**\b*\n-const TreePathType::Type treePathType = TreePathType::dynamic static\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+TypeTree-specific exceptions.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00083_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00083_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: traversalutilities.hh Source File\n+dune-typetree: exceptions.hh Source File\n \n \n \n \n \n \n \n@@ -74,90 +74,41 @@\n \n
    \n \n
    \n \n
    \n-
    traversalutilities.hh
    \n+
    exceptions.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n-
    5
    \n-
    6#ifndef DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n-
    7#define DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n-
    8
    \n-\n-
    10
    \n-
    11namespace Dune {
    \n-
    12 namespace TypeTree {
    \n-
    13
    \n-
    19 namespace {
    \n-
    20
    \n+
    5#ifndef DUNE_TYPETREE_EXCEPTIONS_HH
    \n+
    6#define DUNE_TYPETREE_EXCEPTIONS_HH
    \n+
    7
    \n+
    8#include <dune/common/exceptions.hh>
    \n+
    9
    \n+
    15namespace Dune {
    \n+
    16 namespace TypeTree {
    \n+
    17
    \n+
    \n+\n+
    20 : public Dune::Exception
    \n+
    21 {};
    \n+
    \n
    22
    \n-
    27 template<typename F, typename R, typename ResultType>
    \n-
    28 struct LeafReductionVisitor
    \n-
    29 : public TypeTree::TreeVisitor
    \n-
    30 {
    \n-
    31
    \n-\n-
    33
    \n-
    34 template<typename Node, typename TreePath>
    \n-
    35 void leaf(const Node& node, TreePath treePath)
    \n-
    36 {
    \n-\n-
    38 }
    \n-
    39
    \n-
    40 LeafReductionVisitor(F functor, R reduction, ResultType startValue)
    \n-
    41 : _functor(functor)
    \n-
    42 , _reduction(reduction)
    \n-
    43 , _value(startValue)
    \n-
    44 {}
    \n-
    45
    \n-
    46 ResultType result() { return _value; }
    \n-
    47
    \n-\n-\n-
    50 ResultType _value;
    \n-
    51
    \n-
    52 };
    \n-
    53
    \n-
    54 } // anonymous namespace
    \n-
    55
    \n-
    57
    \n-
    82 template<typename ResultType, typename Tree, typename F, typename R>
    \n-
    \n-
    83 ResultType reduceOverLeafs(const Tree& tree, F functor, R reduction, ResultType startValue)
    \n-
    84 {
    \n-
    85 LeafReductionVisitor<F,R,ResultType> visitor(functor,reduction,startValue);
    \n-
    86 TypeTree::applyToTree(tree,visitor);
    \n-
    87 return visitor.result();
    \n-
    88 }
    \n-
    \n-
    89
    \n-
    91
    \n-
    92 } // namespace TypeTree
    \n-
    93} //namespace Dune
    \n-
    94
    \n-
    95#endif // DUNE_TYPETREE_TRAVERSALUTILITIES_HH
    \n-
    static const result_type result
    Definition accumulate_static.hh:113
    \n-\n-
    R _reduction
    Definition traversalutilities.hh:49
    \n-
    F _functor
    Definition traversalutilities.hh:48
    \n-
    static const TreePathType::Type treePathType
    Definition traversalutilities.hh:32
    \n-
    ResultType _value
    Definition traversalutilities.hh:50
    \n-
    ResultType reduceOverLeafs(const Tree &tree, F functor, R reduction, ResultType startValue)
    Calculate a quantity as a reduction over the leaf nodes of a TypeTree.
    Definition traversalutilities.hh:83
    \n-
    void applyToTree(Tree &&tree, Visitor &&visitor)
    Apply visitor to TypeTree.
    Definition traversal.hh:239
    \n-
    constexpr auto treePath(const T &... t)
    Constructs a new HybridTreePath from the given indices.
    Definition treepath.hh:326
    \n+
    23 } // namespace TypeTree
    \n+
    24} // namespace Dune
    \n+
    25
    \n+
    26#endif // DUNE_TYPETREE_EXCEPTIONS_HH
    \n
    Definition accumulate_static.hh:16
    \n-
    Type
    Definition treepath.hh:106
    \n-
    @ dynamic
    Definition treepath.hh:106
    \n+
    Base class for all TypeTree exceptions.
    Definition exceptions.hh:21
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,109 +1,37 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-traversalutilities.hh\n+exceptions.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n-5\n-6#ifndef DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n-7#define DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n-8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bt_\by_\bp_\be_\bt_\br_\be_\be_\b/_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh>\n-10\n-11namespace _\bD_\bu_\bn_\be {\n-12 namespace TypeTree {\n-13\n-19 namespace {\n-20\n+5#ifndef DUNE_TYPETREE_EXCEPTIONS_HH\n+6#define DUNE_TYPETREE_EXCEPTIONS_HH\n+7\n+8#include \n+9\n+15namespace _\bD_\bu_\bn_\be {\n+16 namespace TypeTree {\n+17\n+_\b1_\b9 class _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+20 : public Dune::Exception\n+21 {};\n 22\n-27 template\n-28 struct LeafReductionVisitor\n-29 : public TypeTree::TreeVisitor\n-30 {\n-31\n-_\b3_\b2 static const _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be _\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be = _\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc;\n-33\n-34 template\n-35 void leaf(const Node& node, TreePath _\bt_\br_\be_\be_\bP_\ba_\bt_\bh)\n-36 {\n-37 _\b__\bv_\ba_\bl_\bu_\be = _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(_\b__\bv_\ba_\bl_\bu_\be,_\b__\bf_\bu_\bn_\bc_\bt_\bo_\br(node,_\bt_\br_\be_\be_\bP_\ba_\bt_\bh));\n-38 }\n-39\n-40 LeafReductionVisitor(F functor, R reduction, ResultType startValue)\n-41 : _\b__\bf_\bu_\bn_\bc_\bt_\bo_\br(functor)\n-42 , _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction)\n-43 , _\b__\bv_\ba_\bl_\bu_\be(startValue)\n-44 {}\n-45\n-46 ResultType _\br_\be_\bs_\bu_\bl_\bt() { return _\b__\bv_\ba_\bl_\bu_\be; }\n-47\n-_\b4_\b8 F _\b__\bf_\bu_\bn_\bc_\bt_\bo_\br;\n-_\b4_\b9 R _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-_\b5_\b0 ResultType _\b__\bv_\ba_\bl_\bu_\be;\n-51\n-52 };\n-53\n-54 } // anonymous namespace\n-55\n-57\n-82 template\n-_\b8_\b3 ResultType _\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs(const Tree& tree, F functor, R reduction,\n-ResultType startValue)\n-84 {\n-85 LeafReductionVisitor visitor(functor,reduction,startValue);\n-86 _\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be(tree,visitor);\n-87 return visitor.result();\n-88 }\n-89\n-91\n-92 } // namespace TypeTree\n-93} //namespace Dune\n-94\n-95#endif // DUNE_TYPETREE_TRAVERSALUTILITIES_HH\n-_\br_\be_\bs_\bu_\bl_\bt\n-static const result_type result\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:113\n-_\bt_\br_\ba_\bv_\be_\br_\bs_\ba_\bl_\b._\bh_\bh\n-_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n-R _reduction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:49\n-_\b__\bf_\bu_\bn_\bc_\bt_\bo_\br\n-F _functor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:48\n-_\bt_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be\n-static const TreePathType::Type treePathType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:32\n-_\b__\bv_\ba_\bl_\bu_\be\n-ResultType _value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bd_\bu_\bc_\be_\bO_\bv_\be_\br_\bL_\be_\ba_\bf_\bs\n-ResultType reduceOverLeafs(const Tree &tree, F functor, R reduction, ResultType\n-startValue)\n-Calculate a quantity as a reduction over the leaf nodes of a TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversalutilities.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bo_\bT_\br_\be_\be\n-void applyToTree(Tree &&tree, Visitor &&visitor)\n-Apply visitor to TypeTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn traversal.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bt_\br_\be_\be_\bP_\ba_\bt_\bh\n-constexpr auto treePath(const T &... t)\n-Constructs a new HybridTreePath from the given indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:326\n+23 } // namespace TypeTree\n+24} // namespace Dune\n+25\n+26#endif // DUNE_TYPETREE_EXCEPTIONS_HH\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n-Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bT_\br_\be_\be_\bP_\ba_\bt_\bh_\bT_\by_\bp_\be_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc\n-@ dynamic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn treepath.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+Base class for all TypeTree exceptions.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:21\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00086.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00086.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: exceptions.hh File Reference\n+dune-typetree: filters.hh File Reference\n \n \n \n \n \n \n \n@@ -72,39 +72,70 @@\n
  • dune
  • typetree
  • \n \n \n
    \n \n-
    exceptions.hh File Reference
    \n+
    filters.hh File Reference
    \n
    \n
    \n-\n-

    TypeTree-specific exceptions. \n-More...

    \n-
    #include <dune/common/exceptions.hh>
    \n+
    #include <tuple>
    \n+#include <dune/common/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::TypeTree::Exception
     Base class for all TypeTree exceptions. More...
    struct  Dune::TypeTree::FilterEntry< new_k, old_k >
     A filter entry describing the mapping of one child in the filtered node. More...
     
    struct  Dune::TypeTree::FilterResult< FilterEntries >
     The result of a filter. More...
     
    struct  Dune::TypeTree::FilterResult< FilterEntries >::apply< Node >
     
    struct  Dune::TypeTree::SimpleFilterTag
     Tag describing a simple filter that can only decide whether or not to include a single given child. More...
     
    struct  Dune::TypeTree::AdvancedFilterTag
     Tag describing an advanced filter that has full control over the construction of the list of FilterEntries. More...
     
    struct  Dune::TypeTree::AdvancedFilter
     Base class for advanced filters. More...
     
    struct  Dune::TypeTree::AdvancedFilter::apply< Node, Children >
     Apply this filter to the given node and children. More...
     
    struct  Dune::TypeTree::SimpleFilter
     Default simple filter that accepts any node and leaves its child structure unchanged. More...
     
    struct  Dune::TypeTree::SimpleFilter::validate< Node >
     Validates the combination of filter and node. More...
     
    struct  Dune::TypeTree::SimpleFilter::apply< Child, new_index, old_index >
     Applies the filter to the given child node. More...
     
    struct  Dune::TypeTree::IndexFilter< indices >
     Filter class for FilteredCompositeNode that selects the children with the given indices. More...
     
    struct  Dune::TypeTree::filter< Filter >
     Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter. More...
     
    struct  Dune::TypeTree::filter< Filter >::apply< Node, Children >
     Apply the filter. More...
     
    \n \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::TypeTree
     
    \n-

    Detailed Description

    \n-

    TypeTree-specific exceptions.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,63 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-exceptions.hh File Reference\n-TypeTree-specific exceptions. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+filters.hh File Reference\n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-\u00a0 Base class for all _\bT_\by_\bp_\be_\bT_\br_\be_\be exceptions. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by_\b<_\b _\bn_\be_\bw_\b__\bk_\b,_\b _\bo_\bl_\bd_\b__\bk_\b _\b>\n+\u00a0 A filter entry describing the mapping of one child in the filtered\n+ node. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\bi_\be_\bs_\b _\b>\n+\u00a0 The result of a filter. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\bi_\be_\bs_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+\u00a0 Tag describing a simple filter that can only decide whether or not to\n+ include a single given child. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+\u00a0 Tag describing an advanced filter that has full control over the\n+ construction of the list of FilterEntries. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n+\u00a0 Base class for advanced filters. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n+\u00a0 Apply this filter to the given node and children. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n+\u00a0 Default simple filter that accepts any node and leaves its child\n+ structure unchanged. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be_\b<_\b _\bN_\bo_\bd_\be_\b _\b>\n+\u00a0 Validates the combination of filter and node. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bC_\bh_\bi_\bl_\bd_\b,_\b _\bn_\be_\bw_\b__\bi_\bn_\bd_\be_\bx_\b,_\b _\bo_\bl_\bd_\b__\bi_\bn_\bd_\be_\bx_\b _\b>\n+\u00a0 Applies the filter to the given child node. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br_\b<_\b _\bi_\bn_\bd_\bi_\bc_\be_\bs_\b _\b>\n+\u00a0 Filter class for _\bF_\bi_\bl_\bt_\be_\br_\be_\bd_\bC_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be_\bN_\bo_\bd_\be that selects the children with\n+ the given indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>\n+\u00a0 Adapter class that takes a _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br, validated it and turns it\n+ into an _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b<_\b _\bF_\bi_\bl_\bt_\be_\br_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b<_\b _\bN_\bo_\bd_\be_\b,_\b _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn_\b _\b>\n+\u00a0 Apply the filter. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-TypeTree-specific exceptions.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00086_source.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00086_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-typetree: exceptions.hh Source File\n+dune-typetree: filters.hh Source File\n \n \n \n \n \n \n \n@@ -74,41 +74,261 @@\n \n
    \n \n
    \n \n
    \n-
    exceptions.hh
    \n+
    filters.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-PDELab-exception
    \n-
    5#ifndef DUNE_TYPETREE_EXCEPTIONS_HH
    \n-
    6#define DUNE_TYPETREE_EXCEPTIONS_HH
    \n-
    7
    \n-
    8#include <dune/common/exceptions.hh>
    \n-
    9
    \n-
    15namespace Dune {
    \n-
    16 namespace TypeTree {
    \n-
    17
    \n-
    \n-\n-
    20 : public Dune::Exception
    \n-
    21 {};
    \n-
    \n-
    22
    \n-
    23 } // namespace TypeTree
    \n-
    24} // namespace Dune
    \n+
    5
    \n+
    6#ifndef DUNE_TYPETREE_FILTERS_HH
    \n+
    7#define DUNE_TYPETREE_FILTERS_HH
    \n+
    8
    \n+
    9#include <tuple>
    \n+
    10
    \n+
    11#include <dune/common/typetraits.hh>
    \n+
    12
    \n+
    13namespace Dune {
    \n+
    14 namespace TypeTree {
    \n+
    15
    \n+
    22 template<std::size_t new_k, std::size_t old_k>
    \n+
    \n+\n+
    24 {
    \n
    25
    \n-
    26#endif // DUNE_TYPETREE_EXCEPTIONS_HH
    \n+
    26#ifndef DOXYGEN
    \n+
    27
    \n+
    28 // The precise contents of this class is an implementation detail.
    \n+
    29
    \n+
    30 static const std::size_t filtered_index = new_k;
    \n+
    31 static const std::size_t original_index = old_k;
    \n+
    32
    \n+
    33#endif // DOXYGEN
    \n+
    34
    \n+
    35 };
    \n+
    \n+
    36
    \n+
    38 template<typename... FilterEntries>
    \n+
    \n+\n+
    40 {
    \n+
    41
    \n+
    42 static const std::size_t size = sizeof...(FilterEntries);
    \n+
    43
    \n+
    44 typedef std::tuple<FilterEntries...> IndexMap;
    \n+
    45
    \n+
    46 template<typename Node>
    \n+
    \n+
    47 struct apply
    \n+
    48 {
    \n+
    49 typedef std::tuple<typename Node::template Child<FilterEntries::original_index>...> Children;
    \n+
    50 typedef std::tuple<typename Node::template Child<FilterEntries::original_index>::Type...> ChildTypes;
    \n+
    51 typedef std::tuple<std::shared_ptr<typename Node::template Child<FilterEntries::original_index>::Type>...> NodeStorage;
    \n+
    52 };
    \n+
    \n+
    53
    \n+
    54 };
    \n+
    \n+
    55
    \n+
    57 struct SimpleFilterTag {};
    \n+
    58
    \n+\n+
    61
    \n+
    62
    \n+
    \n+\n+
    65 {
    \n+
    66
    \n+\n+
    69
    \n+
    70#ifdef DOXYGEN
    \n+
    71
    \n+
    73 template<typename Node, typename... Children>
    \n+
    \n+
    74 struct apply
    \n+
    75 {
    \n+
    77
    \n+
    80 typedef implementation-defined type;
    \n+
    81 };
    \n+
    \n+
    82
    \n+
    83#endif // DOXYGEN
    \n+
    84
    \n+
    85 };
    \n+
    \n+
    86
    \n+
    88
    \n+
    \n+\n+
    94 {
    \n+
    95
    \n+\n+
    98
    \n+
    99
    \n+
    101 template<typename Node>
    \n+
    \n+
    102 struct validate
    \n+
    103 {
    \n+
    105 static const bool value = true;
    \n+
    106 };
    \n+
    \n+
    107
    \n+
    109
    \n+
    117 template<typename Child, std::size_t new_index, std::size_t old_index>
    \n+
    \n+
    118 struct apply
    \n+
    119 {
    \n+
    121 static const bool value = true;
    \n+
    122 };
    \n+
    \n+
    123
    \n+
    124 };
    \n+
    \n+
    125
    \n+
    126 namespace {
    \n+
    127
    \n+
    128 // ********************************************************************************
    \n+
    129 // IndexFilter helpers
    \n+
    130 // ********************************************************************************
    \n+
    131
    \n+
    132 template<typename Node, std::size_t new_index, std::size_t... indices>
    \n+
    133 struct index_filter_helper
    \n+
    134 {
    \n+
    135 template<typename... FilterEntries>
    \n+
    136 struct apply
    \n+
    137 {
    \n+
    138 typedef FilterResult<FilterEntries...> type;
    \n+
    139 };
    \n+
    140 };
    \n+
    141
    \n+
    142 template<typename Node, std::size_t new_index, std::size_t old_index, std::size_t... indices>
    \n+
    143 struct index_filter_helper<Node,new_index,old_index,indices...>
    \n+
    144 {
    \n+
    145 template<typename... FilterEntries>
    \n+
    146 struct apply
    \n+
    147 : public index_filter_helper<Node,new_index+1,indices...>::template apply<FilterEntries...,
    \n+
    148 FilterEntry<new_index,
    \n+
    149 old_index>
    \n+
    150 >
    \n+
    151 {};
    \n+
    152 };
    \n+
    153
    \n+
    154 } // anonymous namespace
    \n+
    155
    \n+
    156
    \n+
    158 template<std::size_t... indices>
    \n+
    \n+\n+
    160 : public AdvancedFilter
    \n+
    161 {
    \n+
    162
    \n+
    163#ifndef DOXYGEN
    \n+
    164
    \n+
    165 template<typename Node, typename... Children>
    \n+
    166 struct apply
    \n+
    167 {
    \n+
    168 typedef typename index_filter_helper<Node,0,indices...>::template apply<>::type type;
    \n+
    169 };
    \n+
    170
    \n+
    171#endif // DOXYGEN
    \n+
    172
    \n+
    173 };
    \n+
    \n+
    174
    \n+
    175
    \n+
    176 // ********************************************************************************
    \n+
    177 // filter: Wrapper class for turning a simple filter into an advanced filter
    \n+
    178 // usable by FilteredCompositeNode
    \n+
    179 // ********************************************************************************
    \n+
    180
    \n+
    181 namespace {
    \n+
    182
    \n+
    183 template<typename Filter, std::size_t new_k, std::size_t old_k, typename... tail>
    \n+
    184 struct filter_helper
    \n+
    185 {
    \n+
    186 template<typename... FilterDescriptors>
    \n+
    187 struct apply
    \n+
    188 {
    \n+
    189 typedef FilterResult<FilterDescriptors...> type;
    \n+
    190 };
    \n+
    191 };
    \n+
    192
    \n+
    193 template<typename Filter, std::size_t new_k, std::size_t old_k, typename child, typename... tail>
    \n+
    194 struct filter_helper<Filter,new_k,old_k,child,tail...>
    \n+
    195 {
    \n+
    196
    \n+
    197 template<typename... FilterDescriptors>
    \n+
    198 struct apply
    \n+
    199 : public std::conditional<Filter::template apply<child,new_k,old_k>::value,
    \n+
    200 typename filter_helper<Filter,new_k+1,old_k+1,tail...>::template apply<FilterDescriptors...,FilterEntry<new_k,old_k> >,
    \n+
    201 typename filter_helper<Filter,new_k,old_k+1,tail...>::template apply<FilterDescriptors...>
    \n+
    202 >::type
    \n+
    203 {};
    \n+
    204
    \n+
    205 };
    \n+
    206
    \n+
    207 } // anonymous namespace
    \n+
    208
    \n+
    210 template<typename Filter>
    \n+
    \n+
    211 struct filter
    \n+
    212 {
    \n+
    213
    \n+
    215 template<typename Node, typename... Children>
    \n+
    \n+
    216 struct apply
    \n+
    217 {
    \n+
    218
    \n+
    219 static_assert((Filter::template validate<Node>::value),"Invalid simple filter");
    \n+
    220
    \n+
    221 typedef typename filter_helper<Filter,0,0,Children...>::template apply<>::type type;
    \n+
    222
    \n+
    223 };
    \n+
    \n+
    224
    \n+
    225 };
    \n+
    \n+
    226
    \n+
    228
    \n+
    229 } // namespace TypeTree
    \n+
    230} //namespace Dune
    \n+
    231
    \n+
    232#endif // DUNE_TYPETREE_FILTERS_HH
    \n+
    ImplementationDefined child(Node &&node, Indices... indices)
    Extracts the child of a node given by a sequence of compile-time and run-time indices.
    Definition childextraction.hh:128
    \n
    Definition accumulate_static.hh:16
    \n-
    Base class for all TypeTree exceptions.
    Definition exceptions.hh:21
    \n+
    A filter entry describing the mapping of one child in the filtered node.
    Definition filters.hh:24
    \n+
    The result of a filter.
    Definition filters.hh:40
    \n+
    std::tuple< FilterEntries... > IndexMap
    Definition filters.hh:44
    \n+
    static const std::size_t size
    Definition filters.hh:42
    \n+
    Definition filters.hh:48
    \n+
    std::tuple< typename Node::template Child< FilterEntries::original_index >... > Children
    Definition filters.hh:49
    \n+
    std::tuple< typename Node::template Child< FilterEntries::original_index >::Type... > ChildTypes
    Definition filters.hh:50
    \n+
    std::tuple< std::shared_ptr< typename Node::template Child< FilterEntries::original_index >::Type >... > NodeStorage
    Definition filters.hh:51
    \n+
    Tag describing a simple filter that can only decide whether or not to include a single given child.
    Definition filters.hh:57
    \n+
    Tag describing an advanced filter that has full control over the construction of the list of FilterEn...
    Definition filters.hh:60
    \n+
    Base class for advanced filters.
    Definition filters.hh:65
    \n+
    AdvancedFilterTag FilterTag
    Filter tag for deciding on filter application mechanism.
    Definition filters.hh:68
    \n+
    Apply this filter to the given node and children.
    Definition filters.hh:75
    \n+
    implementation defined type
    The result of the filtering process.
    Definition filters.hh:80
    \n+
    Default simple filter that accepts any node and leaves its child structure unchanged.
    Definition filters.hh:94
    \n+
    SimpleFilterTag FilterTag
    Filter tag for deciding on filter application mechanism.
    Definition filters.hh:97
    \n+
    Validates the combination of filter and node.
    Definition filters.hh:103
    \n+
    static const bool value
    True if the combination of filter and node is valid.
    Definition filters.hh:105
    \n+
    Applies the filter to the given child node.
    Definition filters.hh:119
    \n+
    static const bool value
    True if the child will be included in the filtered node.
    Definition filters.hh:121
    \n+
    Filter class for FilteredCompositeNode that selects the children with the given indices.
    Definition filters.hh:161
    \n+
    Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter.
    Definition filters.hh:212
    \n+
    Apply the filter.
    Definition filters.hh:217
    \n+
    filter_helper< Filter, 0, 0, Children... >::template apply ::type type
    Definition filters.hh:221
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,320 @@\n dune-typetree\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bt_\by_\bp_\be_\bt_\br_\be_\be\n-exceptions.hh\n+filters.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-\n PDELab-exception\n-5#ifndef DUNE_TYPETREE_EXCEPTIONS_HH\n-6#define DUNE_TYPETREE_EXCEPTIONS_HH\n-7\n-8#include \n-9\n-15namespace _\bD_\bu_\bn_\be {\n-16 namespace TypeTree {\n-17\n-_\b1_\b9 class _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-20 : public Dune::Exception\n-21 {};\n-22\n-23 } // namespace TypeTree\n-24} // namespace Dune\n+5\n+6#ifndef DUNE_TYPETREE_FILTERS_HH\n+7#define DUNE_TYPETREE_FILTERS_HH\n+8\n+9#include \n+10\n+11#include \n+12\n+13namespace _\bD_\bu_\bn_\be {\n+14 namespace TypeTree {\n+15\n+22 template\n+_\b2_\b3 struct _\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by\n+24 {\n 25\n-26#endif // DUNE_TYPETREE_EXCEPTIONS_HH\n+26#ifndef DOXYGEN\n+27\n+28 // The precise contents of this class is an implementation detail.\n+29\n+30 static const std::size_t filtered_index = new_k;\n+31 static const std::size_t original_index = old_k;\n+32\n+33#endif // DOXYGEN\n+34\n+35 };\n+36\n+38 template\n+_\b3_\b9 struct _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt\n+40 {\n+41\n+_\b4_\b2 static const std::size_t _\bs_\bi_\bz_\be = sizeof...(FilterEntries);\n+43\n+_\b4_\b4 typedef std::tuple _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+45\n+46 template\n+_\b4_\b7 struct _\ba_\bp_\bp_\bl_\by\n+48 {\n+_\b4_\b9 typedef std::tuple...> _\bC_\bh_\bi_\bl_\bd_\br_\be_\bn;\n+_\b5_\b0 typedef std::tuple::Type...> _\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs;\n+_\b5_\b1 typedef std::tuple::Type>...> _\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be;\n+52 };\n+53\n+54 };\n+55\n+_\b5_\b7 struct _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg {};\n+58\n+_\b6_\b0 struct _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg {};\n+61\n+62\n+_\b6_\b4 struct _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n+65 {\n+66\n+_\b6_\b8 typedef _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg _\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg;\n+69\n+70#ifdef DOXYGEN\n+71\n+73 template\n+_\b7_\b4 struct _\ba_\bp_\bp_\bl_\by\n+75 {\n+77\n+_\b8_\b0 typedef implementation-defined _\bt_\by_\bp_\be;\n+81 };\n+82\n+83#endif // DOXYGEN\n+84\n+85 };\n+86\n+88\n+_\b9_\b3 struct _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n+94 {\n+95\n+_\b9_\b7 typedef _\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg _\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg;\n+98\n+99\n+101 template\n+_\b1_\b0_\b2 struct _\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n+103 {\n+_\b1_\b0_\b5 static const bool _\bv_\ba_\bl_\bu_\be = true;\n+106 };\n+107\n+109\n+117 template\n+_\b1_\b1_\b8 struct _\ba_\bp_\bp_\bl_\by\n+119 {\n+_\b1_\b2_\b1 static const bool _\bv_\ba_\bl_\bu_\be = true;\n+122 };\n+123\n+124 };\n+125\n+126 namespace {\n+127\n+128 /\n+/\n+********************************************************************************\n+129 // IndexFilter helpers\n+130 /\n+/\n+********************************************************************************\n+131\n+132 template\n+133 struct index_filter_helper\n+134 {\n+135 template\n+136 struct apply\n+137 {\n+138 typedef _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt type;\n+139 };\n+140 };\n+141\n+142 template\n+143 struct index_filter_helper\n+144 {\n+145 template\n+146 struct apply\n+147 : public index_filter_helper::template\n+apply\n+150 >\n+151 {};\n+152 };\n+153\n+154 } // anonymous namespace\n+155\n+156\n+158 template\n+_\b1_\b5_\b9 struct _\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br\n+160 : public _\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n+161 {\n+162\n+163#ifndef DOXYGEN\n+164\n+165 template\n+166 struct _\ba_\bp_\bp_\bl_\by\n+167 {\n+168 typedef typename index_filter_helper::template _\ba_\bp_\bp_\bl_\by_\b<_\b>_\b:_\b:\n+_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n+169 };\n+170\n+171#endif // DOXYGEN\n+172\n+173 };\n+174\n+175\n+176 /\n+/\n+********************************************************************************\n+177 // filter: Wrapper class for turning a simple filter into an advanced\n+filter\n+178 // usable by FilteredCompositeNode\n+179 /\n+/\n+********************************************************************************\n+180\n+181 namespace {\n+182\n+183 template\n+184 struct filter_helper\n+185 {\n+186 template\n+187 struct apply\n+188 {\n+189 typedef _\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt type;\n+190 };\n+191 };\n+192\n+193 template\n+194 struct filter_helper\n+195 {\n+196\n+197 template\n+198 struct apply\n+199 : public std::conditional::value,\n+200 typename filter_helper::template\n+apply >,\n+201 typename filter_helper::template\n+apply\n+202 >::type\n+203 {};\n+204\n+205 };\n+206\n+207 } // anonymous namespace\n+208\n+210 template\n+_\b2_\b1_\b1 struct _\bf_\bi_\bl_\bt_\be_\br\n+212 {\n+213\n+215 template\n+_\b2_\b1_\b6 struct _\ba_\bp_\bp_\bl_\by\n+217 {\n+218\n+219 static_assert((Filter::template validate::value),\"Invalid simple\n+filter\");\n+220\n+_\b2_\b2_\b1 typedef typename filter_helper::template _\ba_\bp_\bp_\bl_\by_\b<_\b>_\b:_\b:\n+_\bt_\by_\bp_\be _\bt_\by_\bp_\be;\n+222\n+223 };\n+224\n+225 };\n+226\n+228\n+229 } // namespace TypeTree\n+230} //namespace Dune\n+231\n+232#endif // DUNE_TYPETREE_FILTERS_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bc_\bh_\bi_\bl_\bd\n+ImplementationDefined child(Node &&node, Indices... indices)\n+Extracts the child of a node given by a sequence of compile-time and run-time\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn childextraction.hh:128\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn accumulate_static.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-Base class for all TypeTree exceptions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bE_\bn_\bt_\br_\by\n+A filter entry describing the mapping of one child in the filtered node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt\n+The result of a filter.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+std::tuple< FilterEntries... > IndexMap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+static const std::size_t size\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\br_\be_\bn\n+std::tuple< typename Node::template Child< FilterEntries::original_index >... >\n+Children\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bC_\bh_\bi_\bl_\bd_\bT_\by_\bp_\be_\bs\n+std::tuple< typename Node::template Child< FilterEntries::original_index >::\n+Type... > ChildTypes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bN_\bo_\bd_\be_\bS_\bt_\bo_\br_\ba_\bg_\be\n+std::tuple< std::shared_ptr< typename Node::template Child< FilterEntries::\n+original_index >::Type >... > NodeStorage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+Tag describing a simple filter that can only decide whether or not to include a\n+single given child.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+Tag describing an advanced filter that has full control over the construction\n+of the list of FilterEn...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br\n+Base class for advanced filters.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+AdvancedFilterTag FilterTag\n+Filter tag for deciding on filter application mechanism.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+Apply this filter to the given node and children.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bA_\bd_\bv_\ba_\bn_\bc_\be_\bd_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bt_\by_\bp_\be\n+implementation defined type\n+The result of the filtering process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br\n+Default simple filter that accepts any node and leaves its child structure\n+unchanged.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bF_\bi_\bl_\bt_\be_\br_\bT_\ba_\bg\n+SimpleFilterTag FilterTag\n+Filter tag for deciding on filter application mechanism.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n+Validates the combination of filter and node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static const bool value\n+True if the combination of filter and node is valid.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+Applies the filter to the given child node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bS_\bi_\bm_\bp_\bl_\be_\bF_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static const bool value\n+True if the child will be included in the filtered node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bF_\bi_\bl_\bt_\be_\br\n+Filter class for FilteredCompositeNode that selects the children with the given\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br\n+Adapter class that takes a SimpleFilter, validated it and turns it into an\n+AdvancedFilter.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+Apply the filter.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bT_\br_\be_\be_\b:_\b:_\bf_\bi_\bl_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\b:_\b:_\bt_\by_\bp_\be\n+filter_helper< Filter, 0, 0, Children... >::template apply ::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn filters.hh:221\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00090.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00090.html", "unified_diff": "@@ -214,16 +214,16 @@\n )\n \n \n \n
    \n \n

    Apply visitor to TypeTree.

    \n-
    \n-\n+

    This function applies the given visitor to the given tree. Both visitor and tree may be const or non-const (if the compiler supports rvalue references, they may even be a non-const temporary).

    \n
    Note
    The visitor must implement the interface laid out by DefaultVisitor (most easily achieved by inheriting from it) and specify the required type of tree traversal (static or dynamic) by inheriting from either StaticTraversal or DynamicTraversal.
    \n
    Parameters
    \n \n \n \n
    treeThe tree the visitor will be applied to.
    visitorThe visitor to apply to the tree.
    \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00924.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00924.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::or_< result_type > Struct Template Reference
    \n
    \n
    \n \n

    Statically combine two values of type result_type using ||. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::or_< result_type >

    Statically combine two values of type result_type using ||.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00928.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00928.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::or_< result_type >::reduce< r1, r2 > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 || r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00932.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00932.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::and_< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type using &&. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::and_< result_type >

    Statically combine two values of type result_type using &&.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00936.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00936.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::and_< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 && r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00940.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00940.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::plus< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type using +. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::plus< result_type >

    Statically combine two values of type result_type using +.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00944.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00944.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::plus< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 + r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00948.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00948.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::minus< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type using -. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::minus< result_type >

    Statically combine two values of type result_type using -.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00952.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00952.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::minus< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 - r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00956.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00956.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::multiply< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type using *. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::multiply< result_type >

    Statically combine two values of type result_type using *.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00960.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00960.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::multiply< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 * r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00964.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00964.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::min< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type by returning their minimum. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::min< result_type >

    Statically combine two values of type result_type by returning their minimum.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00968.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00968.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::min< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 < r2 ? r1 : r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00972.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00972.html", "unified_diff": "@@ -78,26 +78,26 @@\n
    Dune::TypeTree::max< result_type > Struct Template Reference
    \n \n
    \n \n

    Statically combine two values of type result_type by returning their maximum. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Classes

    struct  reduce
     
    \n

    Detailed Description

    \n
    template<typename result_type>
    \n struct Dune::TypeTree::max< result_type >

    Statically combine two values of type result_type by returning their maximum.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a00976.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a00976.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::max< result_type >::reduce< r1, r2 > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const result_type result = r1 > r2 ? r1 : r2
     
    \n

    Member Data Documentation

    \n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01016.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01016.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::TypeTree::AccumulateValue< Tree, Functor, Reduction, startValue, ParentChildReduction > Struct Template Reference
    \n \n
    \n \n

    Statically accumulate a value over the nodes of a TypeTree. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n \n

    \n Public Types

    typedef Functor::result_type result_type
     The result type of the computation.
     
    \n@@ -124,19 +124,19 @@\n
    static const bool value = true;
    \n
    };
    \n
    \n
    // Calculate the per-node result.
    \n
    template<typename Node, typename TreePath>
    \n
    struct visit
    \n
    {
    \n-
    static const result_type result = ...;
    \n+
    static const result_type result = ...;
    \n
    };
    \n
    \n
    };
    \n-
    static const result_type result
    Definition accumulate_static.hh:113
    \n+
    static const result_type result
    Definition accumulate_static.hh:113
    \n
    Functor::result_type result_type
    The result type of the computation.
    Definition accumulate_static.hh:265
    \n
    Template Parameters
    \n
    \n \n
    ReductionThe reduction operator used to accumulate the per-node results.
    \n \n \n@@ -145,15 +145,15 @@\n
    struct ReductionOperator
    \n
    {
    \n
    \n
    // combine two per-node results
    \n
    template<result_type r1, result_type r2>
    \n
    struct reduce
    \n
    {
    \n-
    static const result_type result = ...;
    \n+
    static const result_type result = ...;
    \n
    };
    \n
    \n
    };
    \n
    Template Parameters
    \n \n \n
    startValueThe starting value fed into the initial accumulation step.
    \n@@ -202,15 +202,15 @@\n
    \n \n

    The accumulated result of the computation.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01068.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01068.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TypeAccumulationPolicy< Functor, Reduction, StartType, ParentChildReduction, ReductionAlgorithm > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n \n \n@@ -220,15 +220,15 @@\n

    \n Public Types

    typedef Functor functor
     
    typedef Reduction sibling_reduction
     
    \n
    \n

    The initial result type. This type will be feed as first operand to the reduction operators when doing the first accumulation (and there is no calculated result to accumulate with yet).

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01072.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01072.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::AccumulateType< Tree, Policy > Struct Template Reference
    \n \n
    \n \n

    Statically accumulate a type over the nodes of a TypeTree. \n More...

    \n \n-

    #include <dune/typetree/accumulate_static.hh>

    \n+

    #include <dune/typetree/accumulate_static.hh>

    \n \n \n \n \n \n

    \n Public Types

    typedef accumulate_type< Tree, Policy, typenamePolicy::start_type, HybridTreePath<>, NodeTag< Tree > >::type type
     The accumulated result of the computation.
     
    \n@@ -118,15 +118,15 @@\n
    \n \n

    The accumulated result of the computation.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01076.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01076.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::TypeTree::CompositeNode< Children > Class Template Reference
    \n \n
    \n \n

    Base class for composite nodes based on variadic templates. \n More...

    \n \n-

    #include <dune/typetree/compositenode.hh>

    \n+

    #include <dune/typetree/compositenode.hh>

    \n \n \n \n \n \n

    \n Classes

    struct  Child
     Access to the type and storage type of the i-th child. More...
     
    \n@@ -819,15 +819,15 @@\n
    \n \n

    Mark this class as a non power in the dune-typetree.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01080.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01080.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::CompositeNode< Children >::Child< k > Struct Template Reference
    \n \n
    \n \n

    Access to the type and storage type of the i-th child. \n More...

    \n \n-

    #include <dune/typetree/compositenode.hh>

    \n+

    #include <dune/typetree/compositenode.hh>

    \n
    \n \n \n \n \n \n@@ -136,15 +136,15 @@\n
    \n \n

    The type of the child.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01084.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01084.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::TypeTree::DynamicPowerNode< T > Class Template Reference
    \n \n
    \n \n

    Collect multiple instances of type T within a dune-typetree. \n More...

    \n \n-

    #include <dune/typetree/dynamicpowernode.hh>

    \n+

    #include <dune/typetree/dynamicpowernode.hh>

    \n

    \n Public Types

    typedef std::tuple_element< k, ChildTypes >::type Type
     The type of the child.
     
    typedef std::tuple_element< k, ChildTypes >::type type
    \n \n \n \n \n \n@@ -776,15 +776,15 @@\n
    \n \n

    Mark this class as a power in the dune-typetree.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01088.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01088.html", "unified_diff": "@@ -76,29 +76,29 @@\n
    Dune::TypeTree::Exception Class Reference
    \n \n
    \n \n

    Base class for all TypeTree exceptions. \n More...

    \n \n-

    #include <dune/typetree/exceptions.hh>

    \n+

    #include <dune/typetree/exceptions.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::Exception:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n

    Detailed Description

    \n

    Base class for all TypeTree exceptions.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01092.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01092.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::TypeTree::FilteredCompositeNode< Node, Filter > Class Template Reference
    \n \n
    \n \n

    Base class for composite nodes representing a filtered view on an underlying composite node. \n More...

    \n \n-

    #include <dune/typetree/filteredcompositenode.hh>

    \n+

    #include <dune/typetree/filteredcompositenode.hh>

    \n

    \n Public Types

    typedef DynamicPowerNodeTag NodeTag
     The type tag that describes the node.
     
    typedef T ChildType
    \n \n \n \n \n

    \n Classes

    struct  Child
     Access to the type and storage type of the i-th child. More...
     
    \n@@ -693,15 +693,15 @@\n
    \n \n

    Mark this class as a non power in the dune-typetree.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01100.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01100.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::FilteredCompositeNode< Node, Filter >::Child< k > Struct Template Reference
    \n \n
    \n \n

    Access to the type and storage type of the i-th child. \n More...

    \n \n-

    #include <dune/typetree/filteredcompositenode.hh>

    \n+

    #include <dune/typetree/filteredcompositenode.hh>

    \n
    \n \n \n \n \n \n@@ -136,15 +136,15 @@\n
    \n \n

    The type of the child.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01104.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01104.html", "unified_diff": "@@ -76,20 +76,20 @@\n
    Dune::TypeTree::FilterEntry< new_k, old_k > Struct Template Reference
    \n \n
    \n \n

    A filter entry describing the mapping of one child in the filtered node. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n

    Detailed Description

    \n
    template<std::size_t new_k, std::size_t old_k>
    \n struct Dune::TypeTree::FilterEntry< new_k, old_k >

    A filter entry describing the mapping of one child in the filtered node.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01108.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01108.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::TypeTree::FilterResult< FilterEntries > Struct Template Reference
    \n \n
    \n \n

    The result of a filter. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n

    \n Public Types

    typedef OriginalChild::Type Type
     The type of the child.
     
    typedef OriginalChild::type type
    \n \n \n \n

    \n Classes

    struct  apply
     
    \n \n

    \n@@ -144,15 +144,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01112.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01112.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::FilterResult< FilterEntries >::apply< Node > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n \n \n@@ -143,15 +143,15 @@\n \n

    \n Public Types

    typedef std::tuple< typename Node::template Child< FilterEntries::original_index >... > Children
     
    typedef std::tuple< typename Node::template Child< FilterEntries::original_index >::Type... > ChildTypes
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01116.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01116.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::SimpleFilterTag Struct Reference
    \n \n
    \n \n

    Tag describing a simple filter that can only decide whether or not to include a single given child. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n

    Detailed Description

    \n

    Tag describing a simple filter that can only decide whether or not to include a single given child.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01120.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01120.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::AdvancedFilterTag Struct Reference
    \n \n
    \n \n

    Tag describing an advanced filter that has full control over the construction of the list of FilterEntries. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n

    Detailed Description

    \n

    Tag describing an advanced filter that has full control over the construction of the list of FilterEntries.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01124.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01124.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::TypeTree::AdvancedFilter Struct Reference
    \n \n
    \n \n

    Base class for advanced filters. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::AdvancedFilter:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -124,15 +124,15 @@\n
    \n \n

    Filter tag for deciding on filter application mechanism.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01128.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01128.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::AdvancedFilter::apply< Node, Children > Struct Template Reference
    \n \n
    \n \n

    Apply this filter to the given node and children. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n \n

    \n Public Types

    typedef implementation defined type
     The result of the filtering process.
     
    \n@@ -111,15 +111,15 @@\n \n

    The result of the filtering process.

    \n

    This type must be a model of FilterResult.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01132.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01132.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::TypeTree::SimpleFilter Struct Reference
    \n \n
    \n \n

    Default simple filter that accepts any node and leaves its child structure unchanged. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n \n \n@@ -118,15 +118,15 @@\n
    \n \n

    Filter tag for deciding on filter application mechanism.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01136.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01136.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::SimpleFilter::validate< Node > Struct Template Reference
    \n \n
    \n \n

    Validates the combination of filter and node. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n

    \n Classes

    struct  apply
     Applies the filter to the given child node. More...
     
    struct  validate
    \n \n \n \n \n

    \n Static Public Attributes

    static const bool value = true
     True if the combination of filter and node is valid.
     
    \n@@ -118,15 +118,15 @@\n
    \n \n

    True if the combination of filter and node is valid.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01140.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01140.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::SimpleFilter::apply< Child, new_index, old_index > Struct Template Reference
    \n \n
    \n \n

    Applies the filter to the given child node. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n \n

    \n Static Public Attributes

    static const bool value = true
     True if the child will be included in the filtered node.
     
    \n@@ -127,15 +127,15 @@\n
    \n \n

    True if the child will be included in the filtered node.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01160.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01160.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::IndexFilter< indices > Struct Template Reference
    \n \n
    \n \n

    Filter class for FilteredCompositeNode that selects the children with the given indices. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::IndexFilter< indices >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -126,15 +126,15 @@\n
    \n \n

    Filter tag for deciding on filter application mechanism.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01180.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01180.html", "unified_diff": "@@ -78,27 +78,27 @@\n
    Dune::TypeTree::filter< Filter > Struct Template Reference
    \n \n
    \n \n

    Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n \n

    \n Classes

    struct  apply
     Apply the filter. More...
     
    \n

    Detailed Description

    \n
    template<typename Filter>
    \n struct Dune::TypeTree::filter< Filter >

    Adapter class that takes a SimpleFilter, validated it and turns it into an AdvancedFilter.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01184.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01184.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::filter< Filter >::apply< Node, Children > Struct Template Reference
    \n \n
    \n \n

    Apply the filter. \n More...

    \n \n-

    #include <dune/typetree/filters.hh>

    \n+

    #include <dune/typetree/filters.hh>

    \n \n \n \n \n

    \n Public Types

    typedef filter_helper< Filter, 0, 0, Children... >::template apply ::type type
     
    \n

    Detailed Description

    \n@@ -110,15 +110,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01188.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01188.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::TypeTree::FixedCapacityStackView< T > Class Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/fixedcapacitystack.hh>

    \n+

    #include <dune/typetree/fixedcapacitystack.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::FixedCapacityStackView< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -481,15 +481,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01196.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01196.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::FixedCapacityStack< T, capacity > Class Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/fixedcapacitystack.hh>

    \n+

    #include <dune/typetree/fixedcapacitystack.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::FixedCapacityStack< T, capacity >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -478,15 +478,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01200.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01200.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::GenericLeafNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -275,15 +275,15 @@\n \n

    \n Public Types

    typedef TransformedNode transformed_type
     
    typedef std::shared_ptr< transformed_typetransformed_storage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01204.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01204.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -279,15 +279,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01208.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01208.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -156,15 +156,15 @@\n \n

    \n Public Types

    typedef TransformedNodeTemplate< TC >::type type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01212.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01212.html", "unified_diff": "@@ -77,15 +77,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::GenericPowerNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::GenericPowerNodeTransformation< SourceNode, Transformation, TransformedNode >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -93,19 +93,19 @@\n \"\"\n \"\"\n \n
    \n \n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Static Public Member Functions

    static result< TC >::type transform (const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    static result< TC >::type transform (const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
     
    static result< TC >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    static result< TC >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
     
    static result< TC >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
    static result< TC >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
     
    \n \n \n \n

    \n Static Public Attributes

    static const bool recursive
     
    \n@@ -116,29 +116,29 @@\n
    \n
    \n \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n \n \n \n \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -158,29 +158,29 @@\n
    \n
    \n
    static result< TC >::type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC >::type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (const SourceNode & s,
    const Transformation & t,
    const std::array< std::shared_ptr< TC >, result< TC >::degree > & const std::array< std::shared_ptr< TC >, result< TC >::degree > & children 
    )
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n \n \n \n \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -200,29 +200,29 @@\n
    \n
    \n
    static result< TC >::type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC >::type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (std::shared_ptr< const SourceNode > s,
    const Transformation & t,
    const std::array< std::shared_ptr< TC >, result< TC >::degree > & const std::array< std::shared_ptr< TC >, result< TC >::degree > & children 
    )
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n \n \n \n \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -243,28 +243,28 @@\n
    \n
    \n
    static result< TC >::storage_type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage static result< TC >::storage_type Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage (std::shared_ptr< const SourceNode > s,
    const Transformation & t,
    const std::array< std::shared_ptr< TC >, result< TC >::degree > & const std::array< std::shared_ptr< TC >, result< TC >::degree > & children 
    )
    \n \n \n \n \n
    \n \n \n- \n+ \n \n
    const bool Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursiveconst bool Dune::TypeTree::TemplatizedGenericPowerNodeTransformation< SourceNode, Transformation, GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursive
    \n
    \n staticinherited
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01216.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01216.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -279,15 +279,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01220.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01220.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -123,15 +123,15 @@\n \n

    \n Public Types

    typedef TransformedNodeTemplate< TC >::type type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01224.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01224.html", "unified_diff": "@@ -77,15 +77,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::GenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::GenericDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -93,19 +93,19 @@\n \"\"\n \"\"\n \n
    \n \n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Static Public Member Functions

    static result< TC >::type transform (const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    static result< TC >::type transform (const SourceNode &s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
     
    static result< TC >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    static result< TC >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
     
    static result< TC >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
    static result< TC >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, const std::vector< std::shared_ptr< TC > > &children)
     
    \n \n \n \n

    \n Static Public Attributes

    static const bool recursive
     
    \n@@ -116,15 +116,15 @@\n
    \n
    \n \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -158,15 +158,15 @@\n
    \n
    \n
    static result< TC >::type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC >::type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (const SourceNode & s,
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -200,15 +200,15 @@\n
    \n
    \n
    static result< TC >::type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC >::type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (std::shared_ptr< const SourceNode > s,
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -243,28 +243,28 @@\n
    \n
    \n
    static result< TC >::storage_type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage static result< TC >::storage_type Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage (std::shared_ptr< const SourceNode > s,
    \n \n \n \n \n
    \n \n \n- \n+ \n \n
    const bool Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursiveconst bool Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation< SourceNode, Transformation, GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursive
    \n
    \n staticinherited
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01228.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01228.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -279,15 +279,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01232.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01232.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNodeTemplate >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -123,15 +123,15 @@\n \n

    \n Public Types

    typedef TransformedNodeTemplate< TC... >::type type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01236.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01236.html", "unified_diff": "@@ -77,15 +77,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::GenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n+

    #include <dune/typetree/generictransformationdescriptors.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::GenericCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -93,19 +93,19 @@\n \"\"\n \"\"\n \n
    \n \n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Static Public Member Functions

    static result< TC... >::type transform (const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
    static result< TC... >::type transform (const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
     
    static result< TC... >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    static result< TC... >::type transform (std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
     
    static result< TC... >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
    static result< TC... >::storage_type transform_storage (std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
     
    \n \n \n \n

    \n Static Public Attributes

    static const bool recursive
     
    \n@@ -116,15 +116,15 @@\n
    \n
    \n \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -158,15 +158,15 @@\n
    \n
    \n
    static result< TC... >::type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC... >::type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (const SourceNode & s,
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -200,15 +200,15 @@\n
    \n
    \n
    static result< TC... >::type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform static result< TC... >::type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform (std::shared_ptr< const SourceNode > s,
    \n \n \n
    \n \n \n- \n+ \n \n \n \n \n \n \n \n@@ -243,28 +243,28 @@\n
    \n
    \n
    static result< TC... >::storage_type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage static result< TC... >::storage_type Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::transform_storage (std::shared_ptr< const SourceNode > s,
    \n \n \n \n \n
    \n \n \n- \n+ \n \n
    const bool Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursiveconst bool Dune::TypeTree::TemplatizedGenericCompositeNodeTransformation< SourceNode, Transformation, GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::template result >::recursive
    \n
    \n staticinherited
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01240.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01240.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::TypeTree::LeafNode Class Reference
    \n \n
    \n \n

    Base class for leaf nodes in a dune-typetree. \n More...

    \n \n-

    #include <dune/typetree/leafnode.hh>

    \n+

    #include <dune/typetree/leafnode.hh>

    \n \n \n \n \n \n

    \n Public Types

    typedef LeafNodeTag NodeTag
     The type tag that describes a LeafNode.
     
    \n@@ -262,15 +262,15 @@\n
    \n \n

    Mark this class as a non power in the dune-typetree.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01244.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01244.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::TypeTree::NodeInterface Struct Reference
    \n \n
    \n \n

    Interface for nodes in a dune-typetree. \n More...

    \n \n-

    #include <dune/typetree/nodeinterface.hh>

    \n+

    #include <dune/typetree/nodeinterface.hh>

    \n
    \n \n \n \n \n \n@@ -255,15 +255,15 @@\n
    \n \n

    Whether this is a power node in the dune-typetree.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01248.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01248.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::LeafNodeTag Struct Reference
    \n \n
    \n \n

    Tag designating a leaf node. \n More...

    \n \n-

    #include <dune/typetree/nodetags.hh>

    \n+

    #include <dune/typetree/nodetags.hh>

    \n

    Detailed Description

    \n

    Tag designating a leaf node.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01252.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01252.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::PowerNodeTag Struct Reference
    \n \n
    \n \n

    Tag designating a power node. \n More...

    \n \n-

    #include <dune/typetree/nodetags.hh>

    \n+

    #include <dune/typetree/nodetags.hh>

    \n

    Detailed Description

    \n

    Tag designating a power node.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01256.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01256.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::DynamicPowerNodeTag Struct Reference
    \n \n
    \n \n

    Tag designating a power node with runtime degree. \n More...

    \n \n-

    #include <dune/typetree/nodetags.hh>

    \n+

    #include <dune/typetree/nodetags.hh>

    \n

    Detailed Description

    \n

    Tag designating a power node with runtime degree.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01260.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01260.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::TypeTree::CompositeNodeTag Struct Reference
    \n \n
    \n \n

    Tag designating a composite node. \n More...

    \n \n-

    #include <dune/typetree/nodetags.hh>

    \n+

    #include <dune/typetree/nodetags.hh>

    \n

    Detailed Description

    \n

    Tag designating a composite node.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01264.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01264.html", "unified_diff": "@@ -75,23 +75,23 @@\n
    \n \n
    Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n
    \n

    \n Public Types

    typedef ImplementationDefined NodeTag
     The type tag that describes what kind of node this is.
     
    typedef ImplementationDefined NodeStorage
    \n \n \n \n

    \n Classes

    struct  result
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01268.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01268.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::GenericPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n+

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n \n \n \n \n

    \n Public Types

    typedef TransformedNode< SourceNode, TC, StaticDegree< SourceNode >::value > type
     
    \n

    Member Typedef Documentation

    \n@@ -103,15 +103,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01272.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01272.html", "unified_diff": "@@ -75,23 +75,23 @@\n
    \n \n
    Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n+

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n \n \n \n \n

    \n Classes

    struct  result
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01276.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01276.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n+

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n \n \n \n \n

    \n Public Types

    typedef TransformedNode< SourceNode, TC > type
     
    \n

    Member Typedef Documentation

    \n@@ -103,15 +103,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01280.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01280.html", "unified_diff": "@@ -75,23 +75,23 @@\n
    \n \n
    Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n+

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n \n \n \n \n

    \n Classes

    struct  result
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01284.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01284.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::GenericCompositeNodeTransformationTemplate< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n+

    #include <dune/typetree/powercompositenodetransformationtemplates.hh>

    \n \n \n \n \n

    \n Public Types

    typedef TransformedNode< SourceNode, TC... > type
     
    \n

    Member Typedef Documentation

    \n@@ -103,15 +103,15 @@\n
    \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01288.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01288.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::TypeTree::PowerNode< T, k > Class Template Reference
    \n \n
    \n \n

    Collect k instances of type T within a dune-typetree. \n More...

    \n \n-

    #include <dune/typetree/powernode.hh>

    \n+

    #include <dune/typetree/powernode.hh>

    \n \n \n \n \n \n

    \n Classes

    struct  Child
     Access to the type and storage type of the i-th child. More...
     
    \n@@ -1116,15 +1116,15 @@\n
    \n \n

    Mark this class as a power in the dune-typetree.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01292.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01292.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::PowerNode< T, k >::Child< i > Struct Template Reference
    \n \n
    \n \n

    Access to the type and storage type of the i-th child. \n More...

    \n \n-

    #include <dune/typetree/powernode.hh>

    \n+

    #include <dune/typetree/powernode.hh>

    \n
    \n \n \n \n \n \n@@ -136,15 +136,15 @@\n
    \n \n

    The type of the child.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01296.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01296.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::TypeTree::ProxyNode< Node > Class Template Reference
    \n \n
    \n \n

    Base class for nodes acting as a proxy for an existing node. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::ProxyNode< Node >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -503,15 +503,15 @@\n
    \n \n

    Mark this class as a non power in the dune-typetree.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01300.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01300.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::StaticChildAccessors< ProxiedNode > Class Template Reference
    \n \n
    \n \n

    Mixin class providing methods for child access with compile-time parameter. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::StaticChildAccessors< ProxiedNode >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -340,15 +340,15 @@\n
    \n \n

    Sets the i-th child to the passed-in value.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01308.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01308.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::TypeTree::StaticChildAccessors< ProxiedNode >::Child< k > Struct Template Reference
    \n \n
    \n \n

    Access to the type and storage type of the i-th child. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::StaticChildAccessors< ProxiedNode >::Child< k >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -92,15 +92,15 @@\n \n
    \n

    Detailed Description

    \n
    template<typename ProxiedNode>
    \n template<std::size_t k>
    \n struct Dune::TypeTree::StaticChildAccessors< ProxiedNode >::Child< k >

    Access to the type and storage type of the i-th child.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01312.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01312.html", "unified_diff": "@@ -78,15 +78,15 @@\n
    Dune::TypeTree::DynamicChildAccessors< ProxiedNode > Class Template Reference
    \n \n
    \n \n

    Mixin class providing methods for child access with run-time parameter. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::DynamicChildAccessors< ProxiedNode >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -524,15 +524,15 @@\n
    \n \n

    Sets the i-th child to the passed-in value.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01316.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01316.html", "unified_diff": "@@ -91,15 +91,15 @@\n \"\"\n \n \n

    Detailed Description

    \n
    template<typename Node, typename NodeTag>
    \n struct Dune::TypeTree::ProxyNodeBase< Node, NodeTag >

    Tag-based dispatch to appropriate base class that provides necessary functionality.

    \n

    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01320.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01320.html", "unified_diff": "@@ -76,20 +76,20 @@\n
    Dune::TypeTree::ProxyNodeBase< Node, LeafNodeTag > Struct Template Reference
    \n \n
    \n \n

    ProxyNode base class for LeafNode. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n

    Detailed Description

    \n
    template<typename Node>
    \n struct Dune::TypeTree::ProxyNodeBase< Node, LeafNodeTag >

    ProxyNode base class for LeafNode.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01324.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01324.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::ProxyNodeBase< Node, CompositeNodeTag > Struct Template Reference
    \n \n
    \n \n

    ProxyNode base class for CompositeNode. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::ProxyNodeBase< Node, CompositeNodeTag >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -338,15 +338,15 @@\n
    \n \n

    Sets the i-th child to the passed-in value.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01328.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01328.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::ProxyNodeBase< Node, PowerNodeTag > Struct Template Reference
    \n \n
    \n \n

    ProxyNode base class for PowerNode. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::ProxyNodeBase< Node, PowerNodeTag >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -545,15 +545,15 @@\n
    \n \n

    Sets the i-th child to the passed-in value.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01332.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01332.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::ProxyNodeBase< Node, DynamicPowerNodeTag > Struct Template Reference
    \n \n
    \n \n

    ProxyNode base class for DynamicPowerNode. \n More...

    \n \n-

    #include <dune/typetree/proxynode.hh>

    \n+

    #include <dune/typetree/proxynode.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::ProxyNodeBase< Node, DynamicPowerNodeTag >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -545,15 +545,15 @@\n
    \n \n

    Sets the i-th child to the passed-in value.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01336.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01336.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members\n
    Dune::TypeTree::SimpleLeafNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n

    \n Public Types

    typedef T Type
     The type of the child.
     
    typedef T type
    \n \n \n \n \n \n@@ -235,15 +235,15 @@\n \n

    \n Public Types

    typedef TransformedNode transformed_type
     
    typedef std::shared_ptr< transformed_typetransformed_storage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01340.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01340.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n

    \n Classes

    struct  result
     
    \n \n

    \n@@ -218,15 +218,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01344.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01344.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::SimplePowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -156,15 +156,15 @@\n \n

    \n Public Types

    typedef TransformedNode< TC, StaticDegree< SourceNode >::value > type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01348.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01348.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n

    \n Classes

    struct  result
     
    \n \n

    \n@@ -218,15 +218,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01352.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01352.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::SimpleDynamicPowerNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -123,15 +123,15 @@\n \n

    \n Public Types

    typedef TransformedNode< TC > type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01356.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01356.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n

    \n Classes

    struct  result
     
    \n \n

    \n@@ -218,15 +218,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01360.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01360.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::SimpleCompositeNodeTransformation< SourceNode, Transformation, TransformedNode >::result< TC > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n+

    #include <dune/typetree/simpletransformationdescriptors.hh>

    \n \n \n \n \n \n \n@@ -123,15 +123,15 @@\n \n

    \n Public Types

    typedef TransformedNode< TC... > type
     
    typedef std::shared_ptr< typestorage_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01364.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01364.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::TypeTree::TransformTree< SourceTree, Transformation, Tag, recursive > Struct Template Reference
    \n \n
    \n \n

    Transform a TypeTree. \n More...

    \n \n-

    #include <dune/typetree/transformation.hh>

    \n+

    #include <dune/typetree/transformation.hh>

    \n \n \n \n \n \n \n@@ -397,15 +397,15 @@\n

    \n Public Types

    typedef transformed_type type
     The type of the transformed tree.
     
    typedef type Type
    \n
    \n

    Apply transformation to storage type of an existing tree, returning a heap-allocated storage type instance of the transformed tree.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01372.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01372.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::Detail::ContainerFactory< LeafToValue > Class Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treecontainer.hh>

    \n+

    #include <dune/typetree/treecontainer.hh>

    \n \n \n \n \n \n \n@@ -157,15 +157,15 @@\n \n

    \n Public Member Functions

     ContainerFactory (LeafToValue leafToValue)
     Create ContainerFactory.
     
    template<class Node >
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01376.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01376.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::Detail::TreeContainerVectorBackend< Container > Class Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treecontainer.hh>

    \n+

    #include <dune/typetree/treecontainer.hh>

    \n \n \n \n \n \n \n@@ -348,15 +348,15 @@\n
    \n \n

    Resize the (nested) container depending on the degree of the tree nodes.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01380.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01380.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::Detail::LeafToDefaultConstructibleValue< LeafToValue > Struct Template Reference
    \n \n

    \n Public Member Functions

     TreeContainerVectorBackend (Container &&container)
     Move the passed container into the internal storage.
     
    template<class Tree , TypeTreeConcept< Tree > = true>
    \n \n \n \n \n

    \n Public Member Functions

    template<class Node >
    auto operator() (const Node &node) const
     
    \n@@ -116,15 +116,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01392.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01392.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::TypeTree::HybridTreePath< T > Class Template Reference
    \n \n
    \n \n

    A hybrid version of TreePath that supports both compile time and run time indices. \n More...

    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n \n \n \n \n \n

    \n Public Types

    using index_sequence = std::index_sequence_for< T... >
     An index_sequence for the entries in this HybridTreePath.
     
    \n@@ -647,15 +647,15 @@\n
    \n \n

    Get the size (length) of this path.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01396.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01396.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathSize< typename > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01400.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01400.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathPushBack< typename, size_t > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01404.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01404.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathPushFront< typename, size_t > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01408.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01408.html", "unified_diff": "@@ -85,15 +85,15 @@\n \"\"\n \"\"\n \"\"\n \"\"\n \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01412.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01412.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathFront< typename > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01416.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01416.html", "unified_diff": "@@ -85,15 +85,15 @@\n \"\"\n \"\"\n \"\"\n \"\"\n \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01420.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01420.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathPopFront< typename > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01424.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01424.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::TypeTree::TreePathConcat< typename, typename > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01428.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01428.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::TypeTree::TreePathSize< HybridTreePath< index_constant< i >... > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePathSize< HybridTreePath< index_constant< i >... > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01432.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01432.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TreePathPushBack< HybridTreePath< index_constant< i >... >, k > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n \n \n \n

    \n Public Types

    typedef HybridTreePath< index_constant< i >..., index_constant< k > > type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n
    \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01436.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01436.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TreePathPushFront< HybridTreePath< index_constant< i >... >, k > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n \n \n \n \n

    \n Public Types

    typedef HybridTreePath< index_constant< k >, index_constant< i >... > type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01440.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01440.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< k > > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< k > > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01444.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01444.html", "unified_diff": "@@ -73,29 +73,29 @@\n \n \n
    \n
    Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01448.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01448.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::TypeTree::TreePathFront< HybridTreePath< index_constant< k >, index_constant< i >... > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePathFront< HybridTreePath< index_constant< k >, index_constant< i >... > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01452.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01452.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< k > >, i... > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n \n \n \n \n

    \n Public Types

    typedef HybridTreePath< index_constant< i >... > type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n
    \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01456.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01456.html", "unified_diff": "@@ -73,29 +73,29 @@\n \n \n
    \n
    Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... >, i... > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePathPopBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... >, i... >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01460.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01460.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TreePathPopFront< HybridTreePath< index_constant< k >, index_constant< i >... > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n \n \n \n \n

    \n Public Types

    typedef HybridTreePath< index_constant< i >... > type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01464.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01464.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::TreePathConcat< HybridTreePath< index_constant< i >... >, HybridTreePath< index_constant< k >... > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/treepath.hh>

    \n+

    #include <dune/typetree/treepath.hh>

    \n \n \n \n \n

    \n Public Types

    typedef HybridTreePath< index_constant< i >..., index_constant< k >... > type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01468.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01468.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::first_type< T > Struct Template Reference
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01472.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01472.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::first_type< T0, T... > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Types

    typedef T0 type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01476.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01476.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::has_node_tag< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n \n \n@@ -191,15 +191,15 @@\n
    \n \n

    True if class T defines a NodeTag.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01480.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01480.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_node_tag< T >::yes Struct Reference
    \n \n

    \n Classes

    struct  no
     
    struct  yes
     
    \n \n \n \n

    \n Public Attributes

    char dummy [1]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01484.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01484.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_node_tag< T >::no Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [2]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01488.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01488.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::has_node_tag_value< T, V > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n \n \n@@ -193,15 +193,15 @@\n
    \n \n

    True if class T defines a NodeTag of type V.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01492.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01492.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_node_tag_value< T, V >::maybe< N > Struct Template Reference
    \n \n

    \n Classes

    struct  maybe
     
    struct  no
     
    \n \n \n \n

    \n Public Attributes

    char dummy [N+1]
     
    \n

    Member Data Documentation

    \n@@ -103,15 +103,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01496.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01496.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_node_tag_value< T, V >::yes Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [2]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01500.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01500.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_node_tag_value< T, V >::no Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [1]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01504.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01504.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::has_implementation_tag< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n \n \n@@ -191,15 +191,15 @@\n
    \n \n

    True if class T defines an ImplementationTag.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01508.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01508.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_implementation_tag< T >::yes Struct Reference
    \n \n

    \n Classes

    struct  no
     
    struct  yes
     
    \n \n \n \n

    \n Public Attributes

    char dummy [1]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01512.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01512.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_implementation_tag< T >::no Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [2]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01516.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01516.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::has_implementation_tag_value< T, V > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n \n \n@@ -193,15 +193,15 @@\n
    \n \n

    True if class T defines an ImplementationTag of type V.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01520.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01520.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_implementation_tag_value< T, V >::maybe< N > Struct Template Reference
    \n \n

    \n Classes

    struct  maybe
     
    struct  no
     
    \n \n \n \n

    \n Public Attributes

    char dummy [N+1]
     
    \n

    Member Data Documentation

    \n@@ -103,15 +103,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01524.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01524.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_implementation_tag_value< T, V >::yes Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [2]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01528.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01528.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::has_implementation_tag_value< T, V >::no Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Attributes

    char dummy [1]
     
    \n

    Member Data Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01532.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01532.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::TypeTree::AlwaysVoid< typename > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Types

    typedef void type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01536.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01536.html", "unified_diff": "@@ -76,20 +76,20 @@\n
    Dune::TypeTree::meta_function Struct Reference
    \n \n
    \n \n

    Marker tag declaring a meta function. \n More...

    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n

    Detailed Description

    \n

    Marker tag declaring a meta function.

    \n

    Just inherit from this type to cause lazy evaluation

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01540.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01540.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::lazy_evaluate< F > Struct Template Reference
    \n \n
    \n \n

    Helper meta function to delay evaluation of F. \n More...

    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Types

    typedef F::type type
     
    \n

    Detailed Description

    \n@@ -107,15 +107,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01544.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01544.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::lazy_identity< F > Struct Template Reference
    \n \n
    \n \n

    Identity function. \n More...

    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Types

    typedef F type
     
    \n

    Detailed Description

    \n@@ -107,15 +107,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01548.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01548.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::evaluate_if_meta_function< F > Struct Template Reference
    \n \n
    \n \n

    Meta function that evaluates its argument iff it inherits from meta_function. \n More...

    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n \n \n \n \n

    \n Public Types

    typedef std::conditional< std::is_base_of< meta_function, F >::value, lazy_evaluate< F >, lazy_identity< F > >::type::type type
     
    \n

    Detailed Description

    \n@@ -107,15 +107,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01552.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01552.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::TypeTree::IsTreePath< T > Struct Template Reference
    \n \n
    \n \n

    Check if type represents a tree path. \n More...

    \n \n-

    #include <dune/typetree/typetraits.hh>

    \n+

    #include <dune/typetree/typetraits.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::IsTreePath< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -98,15 +98,15 @@\n
    Template Parameters
    \n \n \n
    TCheck if this type represents a tree path
    \n
    \n
    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01556.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01556.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::TreeInfo< Tree, Tag > Struct Template Reference
    \n \n
    \n \n

    Struct for obtaining some basic structural information about a TypeTree. \n More...

    \n \n-

    #include <dune/typetree/utility.hh>

    \n+

    #include <dune/typetree/utility.hh>

    \n \n \n \n \n \n \n@@ -184,15 +184,15 @@\n
    \n \n

    The total number of nodes in the TypeTree.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01560.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01560.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::DefaultVisitor Struct Reference
    \n \n
    \n \n

    Visitor interface and base class for TypeTree visitors. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::DefaultVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -451,15 +451,15 @@\n

    \n Static Public Attributes

    static const std::size_t depth = NodeInfo::depth
     The depth of the TypeTree.
     
    static const std::size_t nodeCount = NodeInfo::nodeCount
    \n
    \n
    \n \n \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01564.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01564.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::DefaultPairVisitor Struct Reference
    \n \n
    \n \n

    Visitor interface and base class for visitors of pairs of TypeTrees. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::DefaultPairVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -514,15 +514,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01568.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01568.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::Experimental::DefaultHybridVisitor Struct Reference
    \n \n
    \n \n

    Hybrid visitor interface and base class for TypeTree hybrid visitors. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::Experimental::DefaultHybridVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -501,15 +501,15 @@\n \n \n
    Returns
    The result of applying this visitor to u.
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01572.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01572.html", "unified_diff": "@@ -78,15 +78,15 @@\n
    Dune::TypeTree::VisitDirectChildren Struct Reference
    \n \n
    \n \n

    Mixin base class for visitors that only want to visit the direct children of a node. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::VisitDirectChildren:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -102,15 +102,15 @@\n  Template struct for determining whether or not to visit a given child. More...
    \n  \n \n

    Detailed Description

    \n

    Mixin base class for visitors that only want to visit the direct children of a node.

    \n

    This mixin class will reject all children presented to it, causing the algorithm to only visit the root node and call DefaultVisitor::beforeChild() and DefaultVisitor::afterChild() for its direct children.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01576.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01576.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::VisitDirectChildren::VisitChild< Node1, Child1, Node2, Child2, TreePath > Struct Template Reference
    \n
    \n
    \n \n

    Template struct for determining whether or not to visit a given child. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n \n \n \n \n \n

    \n Static Public Attributes

    static const bool value = false
     Do not visit any child.
     
    \n@@ -118,15 +118,15 @@\n
    \n \n

    Do not visit any child.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01580.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01580.html", "unified_diff": "@@ -78,15 +78,15 @@\n
    Dune::TypeTree::VisitTree Struct Reference
    \n \n
    \n \n

    Mixin base class for visitors that want to visit the complete tree. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::VisitTree:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -108,15 +108,15 @@\n  Template struct for determining whether or not to visit a given child. More...
    \n  \n \n

    Detailed Description

    \n

    Mixin base class for visitors that want to visit the complete tree.

    \n

    This mixin class will accept all children presented to it and thus make the iterator traverse the entire tree.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01584.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01584.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::VisitTree::VisitChild< Node1, Child1, Node2, Child2, TreePath > Struct Template Reference
    \n
    \n
    \n \n

    Template struct for determining whether or not to visit a given child. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n \n \n \n \n \n

    \n Static Public Attributes

    static const bool value = true
     Visit any child.
     
    \n@@ -118,15 +118,15 @@\n
    \n \n

    Visit any child.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01588.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01588.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::StaticTraversal Struct Reference
    \n \n
    \n \n

    Mixin base class for visitors that require a static TreePath during traversal. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::StaticTraversal:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -131,15 +131,15 @@\n
    \n \n

    Use the static tree traversal algorithm.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01592.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01592.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::DynamicTraversal Struct Reference
    \n \n
    \n \n

    Mixin base class for visitors that only need a dynamic TreePath during traversal. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n \n \n \n \n \n

    \n Static Public Attributes

    static const TreePathType::Type treePathType = TreePathType::dynamic
     Use the dynamic tree traversal algorithm.
     
    \n@@ -117,15 +117,15 @@\n
    \n \n

    Use the dynamic tree traversal algorithm.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01596.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01596.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::TreeVisitor Struct Reference
    \n \n
    \n \n

    Convenience base class for visiting the entire tree. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreeVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -442,15 +442,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01600.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01600.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::DirectChildrenVisitor Struct Reference
    \n \n
    \n \n

    Convenience base class for visiting the direct children of a node. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::DirectChildrenVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -442,15 +442,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01604.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01604.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::TreePairVisitor Struct Reference
    \n \n
    \n \n

    Convenience base class for visiting an entire tree pair. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::TreePairVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -499,15 +499,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01608.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01608.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::TypeTree::DirectChildrenPairVisitor Struct Reference
    \n \n
    \n \n

    Convenience base class for visiting the direct children of a node pair. \n More...

    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::DirectChildrenPairVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -499,15 +499,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01612.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01612.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::Experimental::Info::LeafCounterVisitor Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::Experimental::Info::LeafCounterVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -686,15 +686,15 @@\n
    \n \n

    Use the static tree traversal algorithm.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01616.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01616.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::Experimental::Info::NodeCounterVisitor Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::Experimental::Info::NodeCounterVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -733,15 +733,15 @@\n
    \n \n

    Use the static tree traversal algorithm.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/a01620.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/a01620.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::TypeTree::Experimental::Info::DepthVisitor Struct Reference
    \n \n
    \n \n-

    #include <dune/typetree/visitor.hh>

    \n+

    #include <dune/typetree/visitor.hh>

    \n
    \n Inheritance diagram for Dune::TypeTree::Experimental::Info::DepthVisitor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -566,15 +566,15 @@\n
    \n \n

    Use the static tree traversal algorithm.

    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/dir_5e74c06688912037f4b476b8dc05fab9.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/dir_5e74c06688912037f4b476b8dc05fab9.html", "unified_diff": "@@ -84,68 +84,68 @@\n \"\"\n \"\"\n \n \n \n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Files

     accumulate_static.hh
     accumulate_static.hh
     
     childextraction.hh
     childextraction.hh
     
     compositenode.hh
     compositenode.hh
     
     dynamicpowernode.hh
     dynamicpowernode.hh
     
     exceptions.hh
     TypeTree-specific exceptions.
     exceptions.hh
     TypeTree-specific exceptions.
     
     filteredcompositenode.hh
     filteredcompositenode.hh
     
     filters.hh
     filters.hh
     
     fixedcapacitystack.hh
     fixedcapacitystack.hh
     
     generictransformationdescriptors.hh
     generictransformationdescriptors.hh
     
     leafnode.hh
     leafnode.hh
     
     nodeinterface.hh
     nodeinterface.hh
     
     nodetags.hh
     nodetags.hh
     
     pairtraversal.hh
     pairtraversal.hh
     
     powercompositenodetransformationtemplates.hh
     powercompositenodetransformationtemplates.hh
     
     powernode.hh
     powernode.hh
     
     proxynode.hh
     proxynode.hh
     
     simpletransformationdescriptors.hh
     simpletransformationdescriptors.hh
     
     transformation.hh
     transformation.hh
     
     transformationutilities.hh
     transformationutilities.hh
     
     traversal.hh
     traversal.hh
     
     traversalutilities.hh
     traversalutilities.hh
     
     treecontainer.hh
     treecontainer.hh
     
     treepath.hh
     treepath.hh
     
     typetraits.hh
     typetraits.hh
     
     typetree.hh
     typetree.hh
     
     utility.hh
     utility.hh
     
     visitor.hh
     visitor.hh
     
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/dune-typetree.tag.gz", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/dune-typetree.tag.gz", "unified_diff": null, "details": [{"source1": "dune-typetree.tag", "source2": "dune-typetree.tag", "unified_diff": null, "details": [{"source1": "dune-typetree.tag", "source2": "dune-typetree.tag", "unified_diff": "@@ -9,19 +9,19 @@\n modules.txt\n /build/reproducible-path/dune-typetree-2.10.0/doc/doxygen/\n a00005.html\n \n \n accumulate_static.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00032.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n- dune/typetree/treepath.hh\n- dune/typetree/utility.hh\n+ a00065.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n+ dune/typetree/treepath.hh\n+ dune/typetree/utility.hh\n Dune::TypeTree::or_\n Dune::TypeTree::or_::reduce\n Dune::TypeTree::and_\n Dune::TypeTree::and_::reduce\n Dune::TypeTree::plus\n Dune::TypeTree::plus::reduce\n Dune::TypeTree::minus\n@@ -37,81 +37,81 @@\n Dune::TypeTree::AccumulateType\n Dune\n Dune::TypeTree\n Dune::TypeTree::Experimental\n \n static const result_type\n result\n- a00032.html\n+ a00065.html\n acd23380b12c1509b3b3f31b893af75c8\n \n \n \n static const result_type\n child_result\n- a00032.html\n+ a00065.html\n a5c902ae13e1b03f88e252f9fd9f85952\n \n \n \n \n childextraction.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00053.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/treepath.hh\n+ a00014.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/treepath.hh\n Dune\n Dune::TypeTree\n \n \n compositenode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00026.html\n- dune/typetree/nodetags.hh\n- dune/typetree/childextraction.hh\n- dune/typetree/typetraits.hh\n+ a00059.html\n+ dune/typetree/nodetags.hh\n+ dune/typetree/childextraction.hh\n+ dune/typetree/typetraits.hh\n Dune::TypeTree::CompositeNode\n Dune::TypeTree::CompositeNode::Child\n Dune\n Dune::TypeTree\n \n \n dynamicpowernode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00077.html\n- dune/typetree/nodetags.hh\n- dune/typetree/utility.hh\n- dune/typetree/typetraits.hh\n+ a00071.html\n+ dune/typetree/nodetags.hh\n+ dune/typetree/utility.hh\n+ dune/typetree/typetraits.hh\n Dune::TypeTree::DynamicPowerNode\n Dune\n Dune::TypeTree\n \n \n exceptions.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00086.html\n+ a00083.html\n Dune::TypeTree::Exception\n Dune\n Dune::TypeTree\n \n \n filteredcompositenode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00071.html\n- dune/typetree/nodetags.hh\n- dune/typetree/filters.hh\n+ a00038.html\n+ dune/typetree/nodetags.hh\n+ dune/typetree/filters.hh\n Dune::TypeTree::FilteredCompositeNode\n Dune::TypeTree::FilteredCompositeNode::Child\n Dune\n Dune::TypeTree\n \n \n filters.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00074.html\n+ a00086.html\n Dune::TypeTree::FilterEntry\n Dune::TypeTree::FilterResult\n Dune::TypeTree::FilterResult::apply\n Dune::TypeTree::SimpleFilterTag\n Dune::TypeTree::AdvancedFilterTag\n Dune::TypeTree::AdvancedFilter\n Dune::TypeTree::AdvancedFilter::apply\n@@ -123,27 +123,27 @@\n Dune::TypeTree::filter::apply\n Dune\n Dune::TypeTree\n \n \n fixedcapacitystack.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00023.html\n+ a00074.html\n Dune::TypeTree::FixedCapacityStackView\n Dune::TypeTree::FixedCapacityStack\n Dune\n Dune::TypeTree\n \n \n generictransformationdescriptors.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00062.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n- dune/typetree/powercompositenodetransformationtemplates.hh\n+ a00056.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n+ dune/typetree/powercompositenodetransformationtemplates.hh\n Dune::TypeTree::GenericLeafNodeTransformation\n Dune::TypeTree::TemplatizedGenericPowerNodeTransformation\n Dune::TypeTree::TemplatizedGenericPowerNodeTransformation::result\n Dune::TypeTree::GenericPowerNodeTransformation\n Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation\n Dune::TypeTree::TemplatizedGenericDynamicPowerNodeTransformation::result\n Dune::TypeTree::GenericDynamicPowerNodeTransformation\n@@ -152,197 +152,197 @@\n Dune::TypeTree::GenericCompositeNodeTransformation\n Dune\n Dune::TypeTree\n \n \n leafnode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00068.html\n- dune/typetree/nodetags.hh\n+ a00017.html\n+ dune/typetree/nodetags.hh\n Dune::TypeTree::LeafNode\n Dune\n Dune::TypeTree\n \n \n nodeinterface.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00029.html\n+ a00053.html\n Dune::TypeTree::NodeInterface\n Dune\n Dune::TypeTree\n \n \n nodetags.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00056.html\n+ a00011.html\n Dune::TypeTree::LeafNodeTag\n Dune::TypeTree::PowerNodeTag\n Dune::TypeTree::DynamicPowerNodeTag\n Dune::TypeTree::CompositeNodeTag\n Dune\n Dune::TypeTree\n \n \n pairtraversal.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00065.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n- dune/typetree/treepath.hh\n- dune/typetree/visitor.hh\n- dune/typetree/traversal.hh\n+ a00068.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n+ dune/typetree/treepath.hh\n+ dune/typetree/visitor.hh\n+ dune/typetree/traversal.hh\n Dune\n Dune::TypeTree\n Dune::TypeTree::Detail\n \n \n powercompositenodetransformationtemplates.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00017.html\n- dune/typetree/nodeinterface.hh\n+ a00047.html\n+ dune/typetree/nodeinterface.hh\n Dune::TypeTree::GenericPowerNodeTransformationTemplate\n Dune::TypeTree::GenericPowerNodeTransformationTemplate::result\n Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate\n Dune::TypeTree::GenericDynamicPowerNodeTransformationTemplate::result\n Dune::TypeTree::GenericCompositeNodeTransformationTemplate\n Dune::TypeTree::GenericCompositeNodeTransformationTemplate::result\n Dune\n Dune::TypeTree\n \n \n powernode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00038.html\n- dune/typetree/nodetags.hh\n- dune/typetree/utility.hh\n- dune/typetree/childextraction.hh\n- dune/typetree/typetraits.hh\n+ a00026.html\n+ dune/typetree/nodetags.hh\n+ dune/typetree/utility.hh\n+ dune/typetree/childextraction.hh\n+ dune/typetree/typetraits.hh\n Dune::TypeTree::PowerNode\n Dune::TypeTree::PowerNode::Child\n Dune\n Dune::TypeTree\n \n \n proxynode.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00008.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n+ a00023.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n Dune::TypeTree::StaticChildAccessors\n Dune::TypeTree::StaticChildAccessors::Child\n Dune::TypeTree::DynamicChildAccessors\n Dune::TypeTree::ProxyNodeBase< Node, LeafNodeTag >\n Dune::TypeTree::ProxyNodeBase< Node, CompositeNodeTag >\n Dune::TypeTree::ProxyNodeBase< Node, PowerNodeTag >\n Dune::TypeTree::ProxyNodeBase< Node, DynamicPowerNodeTag >\n Dune::TypeTree::ProxyNode\n Dune\n Dune::TypeTree\n \n \n simpletransformationdescriptors.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00035.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n+ a00029.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n Dune::TypeTree::SimpleLeafNodeTransformation\n Dune::TypeTree::SimplePowerNodeTransformation\n Dune::TypeTree::SimplePowerNodeTransformation::result\n Dune::TypeTree::SimpleDynamicPowerNodeTransformation\n Dune::TypeTree::SimpleDynamicPowerNodeTransformation::result\n Dune::TypeTree::SimpleCompositeNodeTransformation\n Dune::TypeTree::SimpleCompositeNodeTransformation::result\n Dune\n Dune::TypeTree\n \n \n transformation.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00020.html\n- dune/typetree/typetraits.hh\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n- dune/typetree/utility.hh\n+ a00062.html\n+ dune/typetree/typetraits.hh\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n+ dune/typetree/utility.hh\n Dune::TypeTree::TransformTree\n Dune\n Dune::TypeTree\n \n \n transformationutilities.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00050.html\n- dune/typetree/simpletransformationdescriptors.hh\n- dune/typetree/generictransformationdescriptors.hh\n+ a00041.html\n+ dune/typetree/simpletransformationdescriptors.hh\n+ dune/typetree/generictransformationdescriptors.hh\n \n \n traversal.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00080.html\n- dune/typetree/childextraction.hh\n- dune/typetree/nodetags.hh\n- dune/typetree/treepath.hh\n- dune/typetree/visitor.hh\n+ a00032.html\n+ dune/typetree/childextraction.hh\n+ dune/typetree/nodetags.hh\n+ dune/typetree/treepath.hh\n+ dune/typetree/visitor.hh\n Dune\n Dune::TypeTree\n Dune::TypeTree::Detail\n \n \n traversalutilities.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00083.html\n- dune/typetree/traversal.hh\n+ a00080.html\n+ dune/typetree/traversal.hh\n Dune\n Dune::TypeTree\n \n static const TreePathType::Type\n treePathType\n- a00083.html\n+ a00080.html\n ac933f134e17da9e8dbf18be15134df40\n \n \n \n F\n _functor\n- a00083.html\n+ a00080.html\n a925ce4fb47f35dbaf1550d896578184f\n \n \n \n R\n _reduction\n- a00083.html\n+ a00080.html\n a3399305aa17d4bcec74944e962ff3a12\n \n \n \n ResultType\n _value\n- a00083.html\n+ a00080.html\n ad4dc401736cbecb52f1afd1c8c8d359f\n \n \n \n \n treecontainer.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00014.html\n- dune/typetree/treepath.hh\n+ a00044.html\n+ dune/typetree/treepath.hh\n Dune::TypeTree::Detail::ContainerFactory\n Dune::TypeTree::Detail::TreeContainerVectorBackend\n Dune::TypeTree::Detail::LeafToDefaultConstructibleValue\n Dune\n Dune::TypeTree\n Dune::TypeTree::Detail\n \n \n treepath.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00041.html\n- dune/typetree/fixedcapacitystack.hh\n- dune/typetree/utility.hh\n+ a00050.html\n+ dune/typetree/fixedcapacitystack.hh\n+ dune/typetree/utility.hh\n Dune::TypeTree::HybridTreePath\n Dune::TypeTree::TreePathSize< HybridTreePath< index_constant< i >... > >\n Dune::TypeTree::TreePathPushBack< HybridTreePath< index_constant< i >... >, k >\n Dune::TypeTree::TreePathPushFront< HybridTreePath< index_constant< i >... >, k >\n Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< k > > >\n Dune::TypeTree::TreePathBack< HybridTreePath< index_constant< j >, index_constant< k >, index_constant< l >... > >\n Dune::TypeTree::TreePathFront< HybridTreePath< index_constant< k >, index_constant< i >... > >\n@@ -354,17 +354,17 @@\n Dune::TypeTree\n Dune::TypeTree::TreePathType\n Dune::TypeTree::Literals\n \n \n typetraits.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00044.html\n- dune/typetree/treepath.hh\n- dune/typetree/nodeinterface.hh\n+ a00008.html\n+ dune/typetree/treepath.hh\n+ dune/typetree/nodeinterface.hh\n Dune::first_type< T0, T... >\n Dune::TypeTree::has_node_tag\n Dune::TypeTree::has_node_tag::yes\n Dune::TypeTree::has_node_tag::no\n Dune::TypeTree::has_node_tag_value\n Dune::TypeTree::has_node_tag_value::maybe\n Dune::TypeTree::has_node_tag_value::yes\n@@ -385,44 +385,44 @@\n Dune\n Dune::TypeTree\n Dune::TypeTree::impl\n \n \n typetree.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00059.html\n- dune/typetree/nodetags.hh\n- dune/typetree/utility.hh\n- dune/typetree/leafnode.hh\n- dune/typetree/powernode.hh\n- dune/typetree/dynamicpowernode.hh\n- dune/typetree/compositenode.hh\n- dune/typetree/traversal.hh\n- dune/typetree/pairtraversal.hh\n- dune/typetree/traversalutilities.hh\n- dune/typetree/transformation.hh\n- dune/typetree/transformationutilities.hh\n- dune/typetree/accumulate_static.hh\n- dune/typetree/childextraction.hh\n+ a00077.html\n+ dune/typetree/nodetags.hh\n+ dune/typetree/utility.hh\n+ dune/typetree/leafnode.hh\n+ dune/typetree/powernode.hh\n+ dune/typetree/dynamicpowernode.hh\n+ dune/typetree/compositenode.hh\n+ dune/typetree/traversal.hh\n+ dune/typetree/pairtraversal.hh\n+ dune/typetree/traversalutilities.hh\n+ dune/typetree/transformation.hh\n+ dune/typetree/transformationutilities.hh\n+ dune/typetree/accumulate_static.hh\n+ dune/typetree/childextraction.hh\n \n \n utility.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00047.html\n- dune/typetree/nodeinterface.hh\n- dune/typetree/nodetags.hh\n+ a00020.html\n+ dune/typetree/nodeinterface.hh\n+ dune/typetree/nodetags.hh\n Dune::TypeTree::TreeInfo\n Dune\n Dune::TypeTree\n \n \n visitor.hh\n /build/reproducible-path/dune-typetree-2.10.0/dune/typetree/\n- a00011.html\n- dune/typetree/treepath.hh\n+ a00035.html\n+ dune/typetree/treepath.hh\n Dune::TypeTree::DefaultVisitor\n Dune::TypeTree::DefaultPairVisitor\n Dune::TypeTree::Experimental::DefaultHybridVisitor\n Dune::TypeTree::VisitDirectChildren\n Dune::TypeTree::VisitDirectChildren::VisitChild\n Dune::TypeTree::VisitTree\n Dune::TypeTree::VisitTree::VisitChild\n"}]}]}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/files.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/files.html", "unified_diff": "@@ -74,41 +74,41 @@\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/globals.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/globals.html", "unified_diff": "@@ -66,20 +66,20 @@\n \n \n \n \n \n
    \n
    Here is a list of all file members with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-typetree-doc/doxygen/globals_vars.html", "source2": "./usr/share/doc/libdune-typetree-doc/doxygen/globals_vars.html", "unified_diff": "@@ -66,20 +66,20 @@\n \n \n \n \n \n
    \n
    Here is a list of all variables with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}]}]}]}]}