[
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\ntest.cpp\ntemp.out\n\n# Distribution / packaging\n.Python\nenv/\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\n*.egg-info/\n.installed.cfg\n*.egg\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*,cover\n.hypothesis/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# IPython Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# dotenv\n.env\n\n# virtualenv\nvenv/\nENV/\n\n# Spyder project settings\n.spyderproject\n\n# Rope project settings\n.ropeproject\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2016 Vittorio Romeo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# camomilla\n\n[![license][badge.license]][license]\n[![gratipay][badge.gratipay]][gratipay]\n![badge.python3](https://img.shields.io/badge/python-3-ff69b4.svg?style=flat-square)\n\n[badge.license]: http://img.shields.io/badge/license-mit-blue.svg?style=flat-square\n[badge.gratipay]: https://img.shields.io/gratipay/user/SuperV1234.svg?style=flat-square\n\n[license]: https://github.com/SuperV1234/camomilla/blob/master/LICENSE\n[gratipay]: https://gratipay.com/~SuperV1234/\n\n## What is it?\n\n`camomilla` is a simple [Python 3](http://python.org) script that simplifies errors produced by C++ compilers. It is very useful while dealing with heavily-templated code *(e.g. when using [boost::hana](http://www.boost.org/doc/libs/1_61_0/libs/hana/doc/html/index.html) or [boost::fusion](http://www.boost.org/doc/libs/1_61_0/libs/fusion/doc/html/))*.\n\n`camomilla` transforms the error text to make it easier to read. It supports *JSON configuration files* that can include each other recursively and *caches the last error* so that the user can quickly *reprocess* the original error with different transformation options.\n\n\n## Example errors\n\nThe table below shows the size reduction of the errors in the `example_errors` folder. The original error was generated from a real project, [ecst](http://github.com/SuperV1234/ecst), by simply mispelling a member field name in a template-heavy context.\n\n|               | Bytes (original) | Bytes (after camomilla) | Relative size change |\n|---------------|------------------|-------------------------|----------------------|\n| g++ 6.1.1     | 38487            | 3680                    | -90.43%              |\n| clang++ 3.8.1 | 16856            | 2990                    | -82.26%              |\n\nA size reduction often means that the error is easier to pinpoint. Using `-r` *(`--reprocess`)* to incrementally \"add detail\" to the error is then a good approach to gather more information on its cause/origin.\n\n\nHere's a *(partial)* screenshot of the original `g++` error - it couldn't fit in my terminal window.\n\n![Terminal screenshot: original error](/example_errors/gcc_before.png?raw=true)\n\nHere's the *full* screenshot of the the same error, processed by `camomilla`.\n\n![Terminal screenshot: processed error](/example_errors/gcc_after.png?raw=true)\n\n\n## Solution or workaround?\n\n`camomilla` is merely a workaround for the fact that compilers do not filter *(either automatically or through flags)* the depth of template typenames. Errors in projects making use of libraries such as `boost::hana` or `boost::fusion` therefore include a lot of \"typename boilerplate\" that can make the error harder to read.\n\nLibrary developers are sometimes forced to make use of techniques to erase the long typenames in order to simplify the errors and *decrease compilation time*: [`boost::experimental::di`](https://github.com/boost-experimental/di) is an example.\n\nI think this is something that should be addressed directly in the compilers - I've created a *feature request/bug report* both in the [GCC Bug Tracker](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71167) and in the [Clang Bug Tracker](https://llvm.org/bugs/show_bug.cgi?id=27793).\n\n\n\n## Transformations\n\n`camomilla` performs the following text transformations:\n\n1. **Template typename collapsing.**\n\n    Nested template typenames are collapsed to a specific user-defined depth. This is the most useful transformation executed by `camomilla`. Example:\n\n    ```bash\n    echo \"metavector<metatype<metawhatever<int>>>::method()\" | camomilla -d0\n    # outputs\n    metavector<?>::method()\n\n    echo \"metavector<metatype<metawhatever<int>>>::method()\" | camomilla -d1\n    # outputs\n    metavector<metatype<?>>::method()\n\n    echo \"metavector<metatype<metawhatever<int>>>::method()\" | camomilla -d2\n    # outputs\n    metavector<metatype<metawhatever<?>>>::method()\n\n    echo \"metavector<metatype<metawhatever<int>>>::method()\" | camomilla -d3\n    # outputs\n    metavector<metatype<metawhatever<int>>>::method()\n    ```\n\n    This is incredibly useful when using template metaprogramming libraries, that usually internally nest a huge amount of wrappers.\n\n2. **Namespace replacement regexes.**\n\n    A simple transformation from a long namespace symbol to a shorter *(or absent)* one.\n\n    ```bash\n    echo \"std::vector<std::pair<std::int16_t, std::int32_t>>\" | camomilla --depth=100\n    # outputs\n    vector<pair<int16_t, int32_t>>\n\n    echo \"boost::hana::tuple<boost::hana::tuple<boost::hana::int_c<10>, boost::hana::int_c<15>>>\" | camomilla -d100\n    # outputs\n    bh::tuple<bh::tuple<bh::int_c<10>, bh::int_c<15>>>\n    ```\n\n3. **Generic replacement regexes.**\n\n    ```bash\n    echo \"std::forward<decltype(std::tuple<unsigned long long, std::size_t, int>)>(x)\" | camomilla -d100\n    # outputs\n    fwd<decltype(tuple<ulong long, sz_t, int>)>(x)\n    ```\n\n\n\n## Usage\n\n### Error redirection\n\nErrors produced by compilers can be easily piped into `camomilla`:\n\n```bash\n# Pipe both `stdout` and `stderr` into `camomilla`\ng++ ./x.cpp |& camomilla -d5\n```\n\nIf `|&` is not supported by your shell or if you want to compare the original error to the processed one, using a temporary file is a good solution:\n\n```bash\n# Redirect both `stdout` and `stderr` into `error.out`\ng++ ./x.cpp &> error.out\n\n# Process the error\ncat error | camomilla -d2\n```\n\n### Reprocessing\n\nThe last processed original error is cached *(unless `--no-temp-cache` is specified)*. It is possible to reuse the source of the last error to perform different transformations, ignoring `stdin`. This is particularly useful when playing with the `--depth` parameter to get the required typename information while avoiding clutter.\n\n```bash\n# Process error\ng++ ./x.cpp |& camomilla -d0\n\n# Whoops! Need more typename information.\ncamomilla -r -d1\n\n# Still a little bit more...\ncamomilla -r -d2\n```\n\n\n## Configuration\n\n### Argparse-generated help\n\n```bash\nusage: camomilla [-h] [--template-collapsing | --no-template-collapsing]\n                 [--namespace-replacements | --no-namespace-replacements]\n                 [--generic-replacements | --no-generic-replacements]\n                 [--process-by-line | --no-process-by-line]\n                 [--temp-cache | --no-temp-cache] [-r | --no-reprocess]\n                 [--reprocess-prev-config | --no-reprocess-prev-config] [-d X]\n                 [-c P]\n\noptional arguments:\n  -h, --help                   show this help message and exit\n  --template-collapsing        | Control template collapsing\n  --no-template-collapsing     '\n  --namespace-replacements     | Control namespace replacements\n  --no-namespace-replacements  '\n  --generic-replacements       | Control generic replacements\n  --no-generic-replacements    '\n  --process-by-line            | Control process by line\n  --no-process-by-line         '\n  --temp-cache                 | Control temp cache\n  --no-temp-cache              '\n  -r, --reprocess              | Control reprocess previous source\n  --no-reprocess               '\n  --reprocess-prev-config      | Control reprocess with previous configuration\n  --no-reprocess-prev-config   '\n  -d X, --depth X              Template collapsing depth\n  -c P, --config P             Configuration file path(s)\n```\n\n### Basic command-line options\n\n#### Enable/disable transformations\n\nError text transformations can be turned on and off individually by using the following flags. All transformations are **on** by default.\n\n```bash\n# Template typename collapsing (default: ON)\n--template-collapsing\n--no-template-collapsing\n\n# Namespace replacement regexes (default: ON)\n--namespace-replacements\n--no-namespace-replacements\n\n# Generic replacement regexes (default: ON)\n--generic-replacements\n--no-generic-replacements\n```\n\n#### Enable/disable temporary cache\n\n`camomilla` stores the last processed original error *(and last used configuration)* in your OS-dependant *temp folder*. This option can be controlled with:\n\n```bash\n# Temporary \"last error cache\" (default: ON)\n--temp-cache\n--no-temp-cache\n```\n\n#### Reprocessing\n\nIf an error has been cached, `camomilla` can be invoked with reprocessing options to read directly from the cache *(ignoring standard input)*:\n\n```bash\n# Reprocess cached error (default: OFF)\n-r\n--reprocess\n--no-reprocess\n\n# Reprocess with cached configuration (default: ON)\n--reprocess-prev-config\n--no-reprocess-prev-config\n```\n\n#### Template typename collapsing options\n\nThe depth of the *template typename collapsing* transformation can be specified with the `-d` *(or `--depth`)* flag.\n\n```bash\n# Collapse all templates with depth `>= 5`\ncamomilla -d5\n\n# Collapse all templates with depth `>= 100`\ncamomilla --depth=100\n```\n\n#### Process by line\n\nBy default, `camomilla` processes the error line by line. This behavior can be disabled *(in order to process the error all at once)* with the `--no-process-by-line` flag.\n\n\n\n### Configuration files\n\nConfigurations files are JSON documents that allow users to define their *namespace replacement regexes* and *generic replacement regexes*. They also allow users to override command-line arguments *(or set unspecified options)*. Configuration files can refer to each other recursively.\n\n#### Using configuration files\n\nAny number of configuration file paths can be passed to `camomilla` through the `-c` *(or `--config`)* flag. Configuration files are read sequentially *(the order matters for option overriding)*.\n\n```bash\n# Executes `camomilla` reading `conf0.json`\ncamomilla -c\"conf0.json\"\n\n# Executes `camomilla` reading `conf0.json` first, then `conf1.json`\ncamomilla -c\"conf0.json\" -c\"conf1.json\"\n```\n\nHere's a more complex example:\n\n```bash\n# Executes `camomilla` with:\n# * Template typename collapsing depth: 4\n# * Namespace replacement regexes: off\n# * Reading the `~/camomilla_configs/test.json` file\ncamomilla -d4 --no-namespace-replacements -c\"~/camomilla_configs/test.json\"\n\n# `test.json` may:\n# * Override the specified depth\n# * Override the specified `--no-namespace-replacements` option\n# * Set unspecified options (e.g. `--no-generic-replacements`)\n```\n\n#### Writing configuration files\n\nConfiguration files are written in JSON. Here's an example file with complete syntax:\n\n```javascript\n{\n    // Set/override options\n    \"enableTemplateCollapsing\": false,\n    \"enableNamespaceReplacements\": false,\n    \"enableTuplePairReplacements\": false,\n    \"enableGenericReplacements\": false,\n    \"templateCollapsingDepth\": 10,\n\n    // Add namespace replacements\n    \"namespaceReplacements\": [\n        \"std\": \"\",\n        \"boost::hana\": \"bh\",\n        \"boost::fusion\": \"bf\",\n        \"boost::spirit\": \"bs\",\n    ],\n\n    // Add generic replacements\n    \"genericReplacements\" : [\n        \"tuple\": \"tpl\",\n        \"forward\": \"fwd\"\n    ],\n\n    // Include other config files\n    \"configPaths\": [\n        \"~/camomilla_configs/boost_spirit.json\",\n        \"~/camomilla_configs/limit_template_depth.json\"\n    ]\n}\n```\n\n#### Multiple configuration files\n\nWhen multiple configuration files are passed as command-line arguments, or if any configuration file \"includes\" another file, the behavior is as follows:\n\n* Options, such as `enableTemplateCollapsing` or `templateCollapsingDepth`, are **overridden** or set.\n\n    * Previously set options will be potentially overwritten by the next configuration file(s).\n\n* Namespace replacements and generic replacements will be **accumulated** or **overridden**.\n\n    * If a configuration file has a replacement with the same key as a previous one, its value will be overridden.\n\n    * If a configuration file defines a replacement that wasn't previously seen, it will be added without replacing any existing replacement.\n\n\n\n"
  },
  {
    "path": "camomilla",
    "content": "#!/usr/bin/env python3\n\n# Copyright (c) 2016-2017 Vittorio Romeo\n# License: MIT License\n# MIT License page: https://opensource.org/licenses/MIT\n# http://vittorioromeo.info | vittorio.romeo@outlook.com\n\nimport os\nimport sys\nimport re\nimport argparse\nimport json\nimport tempfile\nimport time\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Configuration keys\n# -----------------------------------------------------------------------------------------------------------\n\n# Command-line argument name constants\nakEnableTemplateCollapsing = 'template-collapsing'\nakEnableNamespaceReplacements = 'namespace-replacements'\nakEnableGenericReplacements = 'generic-replacements'\nakEnableTempCache = 'temp-cache'\nakReprocess = 'reprocess'\nakReprocessPrevConfig = 'reprocess-prev-config'\nakEnableProcessByLine = 'process-by-line'\n\n# Configuration dictionary key constants\nckEnableTemplateCollapsing = 'enableTemplateCollapsing'\nckEnableNamespaceReplacements = 'enableNamespaceReplacements'\nckEnableGenericReplacements = 'enableGenericReplacements'\nckEnableTempCache = 'enableTempCache'\nckTemplateCollapsingDepth = 'templateCollapsingDepth'\nckConfigPaths = 'configPaths'\nckNamespaceReplacements = 'namespaceReplacements'\nckGenericReplacements = 'genericReplacements'\nckCompilationCommand = 'compilationCommand'\nckReprocess = 'reprocess'\nckReprocessPrevConfig = 'reprocessPrevConfig'\nckEnableProcessByLine = 'enableProcessByLine'\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Cache\n# -----------------------------------------------------------------------------------------------------------\n\nfkCacheConfigFilePath = tempfile.gettempdir() + \"/lastCamomillaConfig.json\"\nfkCacheFilePath = tempfile.gettempdir() + \"/lastCamomilla.out\"\n\ndef writeTempConfigCache(contents):\n    with open(fkCacheConfigFilePath, \"w+\") as f:\n        f.write(contents)\n\ndef writeTempCache():\n    return open(fkCacheFilePath, \"w+\")\n\ndef readTempCache():\n    return open(fkCacheFilePath)\n\ndef closeTempCache(f):\n    f.close()\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Arg parsing\n# -----------------------------------------------------------------------------------------------------------\n\ndef addFeatureOpt(ap, longFlagName, key, defaultValue, helpStr):\n    ap_feature = ap.add_mutually_exclusive_group(required=False)\n    ap_feature.add_argument('--' + longFlagName, dest=key, action='store_true', help=\"| Control \" + helpStr)\n    ap_feature.add_argument('--no-' + longFlagName, dest=key, action='store_false', help=\"'\")\n    ap.set_defaults(**{key:defaultValue})\n\ndef addFeatureOptS(ap, shortFlagName, longFlagName, key, defaultValue, helpStr):\n    ap_feature = ap.add_mutually_exclusive_group(required=False)\n    ap_feature.add_argument(shortFlagName, '--' + longFlagName, dest=key, action='store_true', help=\"| Control \" + helpStr)\n    ap_feature.add_argument('--no-' + longFlagName, dest=key, action='store_false', help=\"'\")\n    ap.set_defaults(**{key:defaultValue})\n\ndef argDefault(noDefaults, x):\n    return None if noDefaults else x\n\ndef makeArgParser(noDefaults, parseReprocess):\n    # `None` if `noDefaults`, otherwise `x`\n    def ad(x):\n        return argDefault(noDefaults, x)\n\n    ap = argparse.ArgumentParser(\\\n        formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=256))\n\n    addFeatureOpt(ap, akEnableTemplateCollapsing, ckEnableTemplateCollapsing, ad(True), \\\n        \"template collapsing\")\n\n    addFeatureOpt(ap, akEnableNamespaceReplacements, ckEnableNamespaceReplacements, ad(True), \\\n        \"namespace replacements\")\n\n    addFeatureOpt(ap, akEnableGenericReplacements, ckEnableGenericReplacements, ad(True), \\\n        \"generic replacements\")\n\n    addFeatureOpt(ap, akEnableProcessByLine, ckEnableProcessByLine, ad(True), \\\n        \"process by line\")\n\n    if parseReprocess:\n        addFeatureOpt(ap, akEnableTempCache, ckEnableTempCache, ad(True), \\\n            \"temp cache\")\n\n        addFeatureOptS(ap, '-r', akReprocess, ckReprocess, ad(False), \\\n            \"reprocess previous source\")\n\n        addFeatureOpt(ap, akReprocessPrevConfig, ckReprocessPrevConfig, ad(True), \\\n            \"reprocess with previous configuration\")\n\n    ap.add_argument('-d', '--depth', \\\n        help=\"Template collapsing depth\", \\\n        type=int, default=ad(1), \\\n        dest=ckTemplateCollapsingDepth, metavar='X')\n\n    ap.add_argument('-c', '--config', \\\n        help=\"Configuration file path(s)\", \\\n        dest=ckConfigPaths, default=[], metavar='P', \\\n        action=\"append\")\n\n    # TODO:\n    #\n    # ap.add_argument('-x', '--exec', \\\n    #     help=\"Execute compilation command\", \\\n    #     type=str, default=\"\", nargs=argparse.REMAINDER, dest=ckCompilationCommand, metavar='X')\n\n    return ap\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Argument propagation\n# -----------------------------------------------------------------------------------------------------------\n\ndef canPropagate(key, origin):\n    return key in origin.keys() and origin[key] != None\n\ndef propagateArgOverride(key, origin, target):\n    if canPropagate(key, origin):\n        target[key] = origin[key]\n\ndef propagateReplacements(key, origin, target):\n    if canPropagate(key, origin):\n        for k, v in origin[key].items():\n            target[key][k] = v\n\ndef propagateConfigPaths(key, origin, target):\n    if canPropagate(key, origin):\n        for x in origin[key]:\n            target[key].add(x)\n\ndef propagateEverything(origin, target):\n    propagateArgOverride(ckEnableNamespaceReplacements, origin, target)\n    propagateArgOverride(ckEnableGenericReplacements, origin, target)\n    propagateArgOverride(ckEnableTemplateCollapsing, origin, target)\n    propagateArgOverride(ckEnableProcessByLine, origin, target)\n\n    # TODO: ?\n    # propagateArgOverride(ckEnableTempCache, origin, target)\n\n    propagateArgOverride(ckTemplateCollapsingDepth, origin, target)\n\n    propagateReplacements(ckNamespaceReplacements, origin, target)\n    propagateReplacements(ckGenericReplacements, origin, target)\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Driver\n# -----------------------------------------------------------------------------------------------------------\n\nclass Camomilla:\n    def __init__(self, conf):\n        self._conf = conf\n        self._compiledNamespaceRegex = None\n        self._compiledGenericRegex = None\n\n        self._initRegexes()\n\n    # Configuration getters\n    def namespaceReplacements(self):        return self._conf[ckNamespaceReplacements]\n    def genericReplacements(self):          return self._conf[ckGenericReplacements]\n    def templateCollapsingDepth(self):      return self._conf[ckTemplateCollapsingDepth]\n    def enableNamespaceReplacements(self):  return self._conf[ckEnableNamespaceReplacements]\n    def enableGenericReplacements(self):    return self._conf[ckEnableGenericReplacements]\n    def enableTemplateCollapsing(self):     return self._conf[ckEnableTemplateCollapsing]\n    def enableTempCache(self):              return self._conf[ckEnableTempCache]\n    def enableProcessByLine(self):          return self._conf[ckEnableProcessByLine]\n    def reprocess(self):                    return self._conf[ckReprocess]\n\n    # From http://stackoverflow.com/questions/15175142/\n    def _initRegex(self, k_mapper, v_mapper, xdict):\n        # Map keys and values in dictionary\n        mapped_dict = {k_mapper(k): v_mapper(v) for k, v in xdict.items()}\n\n        # Create a regular expression from the dictionary keys\n        escaped_keys =  mapped_dict.keys()\n        joined_regex_matcher = \"({})\".format(\"|\".join(escaped_keys))\n\n        # Compile and return regex\n        return re.compile(joined_regex_matcher)\n\n    # Compiles and caches namespace and generic replacement regexes\n    def _initRegexes(self):\n        if self.enableNamespaceReplacements():\n            self._compiledNamespaceRegex = \\\n                self._initRegex( \\\n                    lambda k: k + r'::', \\\n                    lambda v: v + r'::' if len(v) > 0 else '', \\\n                    self.namespaceReplacements())\n\n        if self.enableGenericReplacements():\n            self._compiledGenericRegex = \\\n                self._initRegex( \\\n                    lambda k: k, \\\n                    lambda v: v, \\\n                    self.genericReplacements())\n\n    # Find all `<...>` pair ranges\n    def _find_angles(self, s, xi_start, xi_end):\n        result_angle_pairs = []\n        open_angles = []\n\n        def matchOpen(i):\n            if s[i] != '<': return False\n\n            if s[i-1] == ' ': return False # No space before '<'\n            if s[i-1] == '<': return False # Stream operator\n\n            if s[i+1] == ' ': return False # No space after '<'\n            if s[i+1] == '<': return False # Stream operator\n\n            return True\n\n        def matchClose(i):\n            if s[i] != '>': return False\n\n            if s[i-1] == '-': return False # Dereference arrow\n\n            # Relational operator or stream operator\n            if s[i-1] == ' ' and (s[i+1] == ' ' or s[i+1] == '>') and s[i+2] != '>': \n                return False \n            \n            if s[i-1] == '>' and s[i-2] == ' ': return False # Stream operator\n\n            return True\n\n        for i in range(xi_start, xi_end):\n            if matchOpen(i):\n                open_angles.append(i)\n\n            elif matchClose(i):\n                if len(open_angles) == 0:\n                    continue\n\n                depth = len(open_angles)\n                x = open_angles.pop()\n                result_angle_pairs.append((x, i+1, depth))\n\n        return result_angle_pairs\n\n    # Mark a `<...>` pair for removal\n    def _mark(self, i_start, i_end):\n        return (i_start + 1, i_end - 1)\n\n    # Yield merged overlapping intervals\n    # (From 'http://codereview.stackexchange.com/questions/69242')\n    def _merged(self, intervals):\n        sorted_intervals = sorted(intervals, key=lambda x: x[0])\n\n        if not sorted_intervals:  # no intervals to merge\n            return\n\n        # low and high represent the bounds of the current run of merges\n        low, high = sorted_intervals[0]\n\n        for iv in sorted_intervals[1:]:\n            if iv[0] <= high:  # new interval overlaps current run\n                high = max(high, iv[1])  # merge with the current run\n            else:  # current run is over\n                yield low, high  # yield accumulated interval\n                low, high = iv  # start new run\n\n        yield low, high  # end the final run\n\n    def _subDisambiguator(self, dict, x):\n        matched_str = x.string[x.start():x.end()]\n\n        for k, v in dict.items():\n            if re.match(k, matched_str) != None:\n                return v\n\n        raise Exception(\"No valid replacement for \" + matched_str)\n\n    def _multiple_replace(self, k_mapper, v_mapper, xdict, compiled_regex, src):\n        # Bail out if there are no replacements\n        if len(xdict) == 0:\n            return src\n\n        # Map keys and values in dictionary\n        mapped_dict = {k_mapper(k): v_mapper(v) for k, v in xdict.items()}\n\n        # For each match, look-up corresponding value in dictionary\n        return compiled_regex.sub(lambda x: self._subDisambiguator(mapped_dict, x), src)\n\n    def _processImpl(self, src, ostream, temp_cache):\n        out = \"\"\n        marked = []\n\n        # Write temp cache ______________________________________\n        #\n        if self.reprocess() == False and self.enableTempCache():\n            # Cache source error\n            temp_cache.write(src)\n\n            # Cache config\n            writeTempConfigCache(json.dumps(self._conf))\n        # _______________________________________________________\n        #\n\n        # Template collapsing ___________________________________\n        #\n        if self.enableTemplateCollapsing():\n            # Find all angle bracket pairs\n            angle_pairs = self._find_angles(src, 0, len(src))\n\n            # Mark pairs matching desired depth for removal\n            for p in angle_pairs:\n                if p[2] > self.templateCollapsingDepth():\n                    marked.append(self._mark(p[0], p[1]))\n\n            # Build output string by avoiding marked intervals\n            last = 0\n            for m in self._merged(marked):\n                out += src[last:m[0]]\n                last = m[1]\n            out += src[last:len(src)]\n        else:\n            out = src\n        # _______________________________________________________\n        #\n\n        # Namespace replacements_________________________________\n        #\n        if self.enableNamespaceReplacements():\n            # Replace namespace matches\n            out = self._multiple_replace( \\\n                lambda k: k + r'::', \\\n                lambda v: v + r'::' if len(v) > 0 else '', \\\n                self.namespaceReplacements(), self._compiledNamespaceRegex, out)\n        # _______________________________________________________\n        #\n\n        # Generic replacements __________________________________\n        #\n        if self.enableGenericReplacements():\n            # Replace generic matches\n            out = self._multiple_replace( \\\n                lambda k: k, \\\n                lambda v: v, \\\n                self.genericReplacements(), self._compiledGenericRegex, out)\n        # _______________________________________________________\n        #\n\n        ostream.write(out)\n\n    def process(self, istream, ostream, temp_cache):\n        if self.enableProcessByLine():\n            # Process error line by line\n            lastTime = time.perf_counter()\n            while True:\n                src = istream.readline()\n\n                if src == '':\n                    break\n\n                self._processImpl(src, ostream, temp_cache)\n\n                # Flush once per second\n                t = time.perf_counter()\n                if t - lastTime >= 1.0:\n                    ostream.flush()\n                lastTime = t\n        else:\n            # Process error at all once\n            src = istream.read()\n            self._processImpl(src, ostream, temp_cache)\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Configuration\n# -----------------------------------------------------------------------------------------------------------\n\ndef loadConfig(path):\n    with open(path) as data:\n        j = json.load(data)\n        res = {\n            ckNamespaceReplacements: dict(),\n            ckGenericReplacements: dict(),\n            ckConfigPaths: set()\n        }\n\n        propagateEverything(j, res)\n        propagateConfigPaths(ckConfigPaths, j, res)\n\n        return res\n\ndef mergeConfig(parent, x):\n    # Recursively merge configs\n    if ckConfigPaths in x.keys():\n        for child in x[ckConfigPaths]:\n            x = mergeConfig(x, loadConfig(child))\n\n    propagateEverything(x, parent)\n    return parent\n\ndef makeInitialBaseConfig():\n    conf = dict()\n    conf[ckNamespaceReplacements] = dict()\n    conf[ckGenericReplacements] = dict()\n    conf[ckConfigPaths] = []\n\n    return conf\n\ndef makeInitialConfig(args):\n    conf = vars(args[0])\n    conf[ckNamespaceReplacements] = dict()\n    conf[ckGenericReplacements] = dict()\n    conf[ckConfigPaths] = conf[ckConfigPaths]\n\n    conf[ckNamespaceReplacements][\"std\"] = \"\"\n    conf[ckGenericReplacements][\"<>\"] = \"<?>\"\n\n    return conf\n\ndef makeFinalConfig():\n    ap = makeArgParser(False, True)\n    args = ap.parse_known_args()\n    conf = makeInitialConfig(args)\n\n    # TODO:\n    #\n    # compilationCmd = ' '.join(conf[ckCompilationCommand])\n    #\n    # if compilationCmd == \"\":\n    #     src = sys.stdin.read()\n    # else:\n    #     print(\"Warning: stdin data will be ignored because '-x' is being used.\")\n    #     os.system('(' + compilationCmd + ')')\n\n    for child in conf[ckConfigPaths]:\n        conf = mergeConfig(conf, loadConfig(child))\n\n    return conf\n\ndef confDispatch():\n    conf = makeFinalConfig()\n\n    # If reprocessing with previous config, load it and override with command line\n    if conf[ckReprocess] and conf[ckReprocessPrevConfig]:\n\n        # Make initial base config and merge it with cached config\n        conf = mergeConfig(makeInitialBaseConfig(), loadConfig(fkCacheConfigFilePath))\n\n        # Override cached config with eventual command-line arguments\n        ap = makeArgParser(True, False)\n        args = vars(ap.parse_known_args()[0])\n        propagateEverything(args, conf)\n\n        # Override config with eventual command-line config paths\n        if canPropagate(ckConfigPaths, args):\n            for child in args[ckConfigPaths]:\n                conf = mergeConfig(conf, loadConfig(child))\n\n        # Prevent altering the cache\n        conf[ckReprocess] = True\n        conf[ckEnableTempCache] = False\n\n    # Convert all paths to absolute\n    conf[ckConfigPaths] = [os.path.abspath(x) for x in conf[ckConfigPaths]]\n\n    return conf\n\n\n\n#\n#\n#\n# -----------------------------------------------------------------------------------------------------------\n# Main\n# -----------------------------------------------------------------------------------------------------------\n\ndef main():\n    conf = confDispatch()\n    camomilla = Camomilla(conf)\n\n    # Read from temp cache if reprocessing, otherwise from stdin\n    src = readTempCache() if conf[ckReprocess] else sys.stdin\n\n    if conf[ckEnableTempCache]:\n        tempCache = writeTempCache()\n    else:\n        tempCache = None\n\n    # Process and stream error line by line\n    camomilla.process(src, sys.stdout, tempCache)\n\n    # Close temp cache if required\n    if conf[ckEnableTempCache]:\n        closeTempCache(tempCache)\n\n    if conf[ckReprocess]:\n        closeTempCache(src)\n\n    return 0\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n\n\n\n### TODO\n#\n# * gcc, g++, clang, clang++ aliases that pass error to camomilla.\n#\n# * Makefile/install script.\n#\n# * --depth=-1 or --alldepth or whatever.\n#\n# * Refactor code.\n#\n# * Blog article.\n#\n# * tuple/pair sugar\n"
  },
  {
    "path": "config_files/ecst_namespaces.json",
    "content": "{\n    \"configPaths\": [\"./config_files/ecst_namespaces_inner.json\"],\n    \"namespaceReplacements\":\n    {\n        \"vrm::core\": \"vrmc\",\n        \"ecst\": \"\",\n        \"system_execution_adapter\": \"sea\",\n        \"context\": \"ctx\",\n        \"tag::system\": \"tag_s\",\n        \"tag::component\": \"tag_c\"\n    }\n}"
  },
  {
    "path": "config_files/ecst_namespaces_inner.json",
    "content": "{\n    \"namespaceReplacements\": \n    {\n    }\n}"
  },
  {
    "path": "config_files/generic.json",
    "content": "{\n    \"genericReplacements\":\n    {\n        \"integral_constant\": \"ic\",\n        \"lambda\\\\(\": \"[?](\",\n        \"size_t\": \"sz_t\",\n        \"unsigned \": \"u\",\n        \"long unsigned\": \"ul\",\n        \"unsigned long\": \"ul\",\n        \"type_impl\": \"type\",\n        \"tag_impl\": \"tag\",\n        \"forward\": \"fwd\"\n    }\n}"
  },
  {
    "path": "config_files/namespaces.json",
    "content": "{\n    \"namespaceReplacements\":\n    {\n        \"std\": \"\",\n        \"__cxx..\": \"cxx\",\n        \"boost::hana\": \"bh\",\n        \"boost::fusion\": \"bf\",\n        \"boost::spirit\": \"bs\",\n        \"impl\": \"_\",\n        \"implementation\": \"_\",\n        \"detail\": \"_\"\n    }\n}"
  },
  {
    "path": "example_errors/0_clang_after.txt",
    "content": "pres_code.cpp:274:31: error: no member named 'ya' in 'sf::Vector2<?>'\n                            v.ya *= -1;\n                            ~ ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/instance_subtask.inl:75:13: note: in instantiation of function template specialization 'example::s::keep_in_bounds::process(ctx::system::data_proxy::multi<?> &)::(anonymous class)::operator()<?>' requested here\n            f(this->nth_subscribed(i));\n            ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/./proxy/./data/./impl/multi.inl:39:36: note: in instantiation of function template specialization 'ctx::system::instance<?>::for_entities<?>' requested here\n            return this->_instance.for_entities(_i_begin, _i_end, FWD(f));\n                                   ^\npres_code.cpp:871:31: note: in instantiation of function template specialization 'example::s::keep_in_bounds::process<?>' requested here\n                            s.process(data);\n                              ^\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./inner_parallelism/./utils/execute_split.hpp:66:18: note: in instantiation of function template specialization 'ctx::system::instance<?>::prepare_and_wait_subtasks<?>' requested here\n            inst.prepare_and_wait_subtasks(ctx, split_count, ef);\n                 ^\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./inner_parallelism/./strategy/./split_evenly_fn/./executor.hpp:44:28: note: in instantiation of function template specialization 'inner_parallelism::utils::prepare_execute_wait_subtasks<?>' requested here\n                    utils::prepare_execute_wait_subtasks( // .\n                           ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/instance.inl:158:35: note: (skipping 16 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)\n        this->parallel_executor().execute(*this, ctx, move(st));\n                                  ^\n././utils/pres_game_app.hpp:208:13: note: in instantiation of member function 'example::game_app<?>::init_loops' requested here\n            init_loops();\n            ^\n././utils/pres_game_app.hpp:216:13: note: in instantiation of member function 'example::game_app<?>::init' requested here\n            init();\n            ^\n././boilerplate/app_runner.hpp:48:32: note: in instantiation of member function 'example::game_app<?>::game_app' requested here\n                    _app = new T(_window, FWD(xs)...);\n                               ^\n././utils/pres_game_app.hpp:223:69: note: in instantiation of function template specialization 'example::boilerplate::app_runner<?>::app_runner<?>' requested here\n        boilerplate::app_runner<?> x{\n                                                                    ^\npres_code.cpp:936:5: note: in instantiation of function template specialization 'example::run_simulation<?>' requested here\n    run_simulation(*ctx);\n    ^\n1 error generated.\n"
  },
  {
    "path": "example_errors/0_clang_before.txt",
    "content": "pres_code.cpp:274:31: error: no member named 'ya' in 'sf::Vector2<float>'\n                            v.ya *= -1;\n                            ~ ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/instance_subtask.inl:75:13: note: in instantiation of function template specialization 'example::s::keep_in_bounds::process(ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<hs>, ecst::context::system::instance<hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> > &)::(anonymous class)::operator()<ecst::entity_id>' requested here\n            f(this->nth_subscribed(i));\n            ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/./proxy/./data/./impl/multi.inl:39:36: note: in instantiation of function template specialization 'ecst::context::system::instance<hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_>::for_entities<(lambda at pres_code.cpp:241:35)>' requested here\n            return this->_instance.for_entities(_i_begin, _i_end, FWD(f));\n                                   ^\npres_code.cpp:871:31: note: in instantiation of function template specialization 'example::s::keep_in_bounds::process<ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<hs>, ecst::context::system::instance<hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> > >' requested here\n                            s.process(data);\n                              ^\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./inner_parallelism/./utils/execute_split.hpp:66:18: note: in instantiation of function template specialization 'ecst::context::system::instance<hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_>::prepare_and_wait_subtasks<ecst::context::impl::data<hs>, (lambda at /home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./inner_parallelism/./utils/execute_split.hpp:58:23)>' requested here\n            inst.prepare_and_wait_subtasks(ctx, split_count, ef);\n                 ^\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./inner_parallelism/./strategy/./split_evenly_fn/./executor.hpp:44:28: note: in instantiation of function template specialization 'ecst::inner_parallelism::utils::prepare_execute_wait_subtasks<ecst::context::system::instance<hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 0>, 0>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 1>, 1>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 2>, 2>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 3>, 3>, boost::hana::detail::bucket<boost::hana::integral_constant<unsigned long long, 4>, 4> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<unsigned long, 0>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 1>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 2>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 3>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<unsigned long, 4>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_>, ecst::context::impl::data<hs>, (lambda at /home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/instance.inl:147:19) &>' requested here\n                    utils::prepare_execute_wait_subtasks( // .\n                           ^\n/home/vittorioromeo/OHWorkspace/ecst/include/ecst/context/./system/./instance/instance.inl:158:35: note: (skipping 16 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)\n        this->parallel_executor().execute(*this, ctx, std::move(st));\n                                  ^\n././utils/pres_game_app.hpp:208:13: note: in instantiation of member function 'example::game_app<ecst::context::impl::data<hs> >::init_loops' requested here\n            init_loops();\n            ^\n././utils/pres_game_app.hpp:216:13: note: in instantiation of member function 'example::game_app<ecst::context::impl::data<hs> >::init' requested here\n            init();\n            ^\n././boilerplate/app_runner.hpp:48:32: note: in instantiation of member function 'example::game_app<ecst::context::impl::data<hs> >::game_app' requested here\n                    _app = new T(_window, FWD(xs)...);\n                               ^\n././utils/pres_game_app.hpp:223:69: note: in instantiation of function template specialization 'example::boilerplate::app_runner<example::game_app<ecst::context::impl::data<hs> > >::app_runner<ecst::context::impl::data<hs> &>' requested here\n        boilerplate::app_runner<game_app<ECST_DECAY_DECLTYPE(ctx)>> x{\n                                                                    ^\npres_code.cpp:936:5: note: in instantiation of function template specialization 'example::run_simulation<ecst::context::impl::data<hs> >' requested here\n    run_simulation(*ctx);\n    ^\n1 error generated.\n"
  },
  {
    "path": "example_errors/0_gcc_after.txt",
    "content": "pres_code.cpp: In instantiation of ‘example::s::keep_in_bounds::process(TData&)::<?> [with auto:133 = entity_id; TData = ctx::system::data_proxy::multi<?>]’:\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/instance_subtask.inl:75:14:   required from ‘void ctx::system::instance<?>::for_entities(vrmc::sz_t, vrmc::sz_t, TF&&) [with TF = example::s::keep_in_bounds::process(TData&) [with TData = ctx::system::data_proxy::multi<?>]::<?>; TSettings = main()::hs; TSystemSignature = bh::type<?>::_; vrmc::sz_t = ulint]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/./proxy/data/./impl/multi.inl:39:73:   required from ‘auto ctx::system::data_proxy::multi<?>::for_entities(TF&&) [with TF = example::s::keep_in_bounds::process(TData&) [with TData = ctx::system::data_proxy::multi<?>]::<?>; TSystemSignature = bh::type<?>::_; TContext = ctx::_::data<?>; TInstance = ctx::system::instance<?>]’\npres_code.cpp:241:17:   required from ‘void example::s::keep_in_bounds::process(TData&) [with TData = ctx::system::data_proxy::multi<?>]’\npres_code.cpp:871:29:   required from ‘example::update_ctx(TContext&, TRenderTarget&, example::ft)::<?>::<?> [with auto:153 = example::s::keep_in_bounds; auto:154 = ctx::system::data_proxy::multi<?>; auto:150 = ctx::_::step::proxy<?>; TContext = ctx::_::data<?>; TRenderTarget = sf::RenderWindow]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./system_execution_adapter/./impl/./predicate_holder/predicate_holder.inl:46:30:   required from ‘sea::_::predicate_holder<?>::for_subtasks(TF&&)::<?> mutable::<?> mutable [with auto:76 = ctx::system::data_proxy::multi<?>; auto:74 = example::s::keep_in_bounds; auto:75 = ctx::system::executor_proxy::data<?>; TF = example::update_ctx(TContext&, TRenderTarget&, example::ft)::<?> [with auto:150 = ctx::_::step::proxy<?>; TContext = ctx::_::data<?>; TRenderTarget = sf::RenderWindow]::<?>; TPredicate = sea::t(TSystemTags ...) [with TSystemTags = {tag_s::_::tag<?>, tag_s::_::tag<?>, tag_s::_::tag<?>, tag_s::_::tag<?>}]::<?>]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/instance.inl:155:14:   [ skipping 58 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n./utils/pres_game_app.hpp:208:23:   required from ‘void example::game_app<?>::init() [with TContext = ctx::_::data<?>]’\n./utils/pres_game_app.hpp:216:17:   required from ‘example::game_app<?>::game_app(sf::RenderWindow&, TContext&) [with TContext = ctx::_::data<?>]’\n./utils/.././boilerplate/app_runner.hpp:48:28:   required from ‘example::boilerplate::app_runner<?>::app_runner(const string&, sz_t, sz_t, Ts&& ...)::<?> [with Ts = {ctx::_::data<?>&}; T = example::game_app<?>]’\n./utils/.././boilerplate/app_runner.hpp:36:59:   required from ‘struct example::boilerplate::app_runner<?>::app_runner(const string&, sz_t, sz_t, Ts&& ...) [with Ts = {ctx::_::data<?>&}; T = example::game_app<?>; __cxx11::string = __cxx11::basic_string<?>; sz_t = ulint]::<?>’\n./utils/.././boilerplate/app_runner.hpp:36:25:   required from ‘example::boilerplate::app_runner<?>::app_runner(const string&, sz_t, sz_t, Ts&& ...) [with Ts = {ctx::_::data<?>&}; T = example::game_app<?>; __cxx11::string = __cxx11::basic_string<?>; sz_t = ulint]’\n./utils/pres_game_app.hpp:224:49:   required from ‘void example::run_simulation(TContext&) [with TContext = ctx::_::data<?>]’\npres_code.cpp:936:24:   required from here\npres_code.cpp:274:31: error: ‘class sf::Vector2<?>’ has no member named ‘ya’; did you mean ‘y’?\n                             v.ya *= -1;\n                             ~~^~\n"
  },
  {
    "path": "example_errors/0_gcc_before.txt",
    "content": "pres_code.cpp: In instantiation of ‘example::s::keep_in_bounds::process(TData&)::<lambda(auto:133)> [with auto:133 = ecst::entity_id; TData = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >]’:\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/instance_subtask.inl:75:14:   required from ‘void ecst::context::system::instance<TSettings, TSystemSignature>::for_entities(vrm::core::sz_t, vrm::core::sz_t, TF&&) [with TF = example::s::keep_in_bounds::process(TData&) [with TData = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >]::<lambda(auto:133)>; TSettings = main()::hs; TSystemSignature = boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_; vrm::core::sz_t = long unsigned int]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/./proxy/data/./impl/multi.inl:39:73:   required from ‘auto ecst::context::system::data_proxy::multi<TSystemSignature, TContext, TInstance>::for_entities(TF&&) [with TF = example::s::keep_in_bounds::process(TData&) [with TData = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >]::<lambda(auto:133)>; TSystemSignature = boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_; TContext = ecst::context::impl::data<main()::hs>; TInstance = ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_>]’\npres_code.cpp:241:17:   required from ‘void example::s::keep_in_bounds::process(TData&) [with TData = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >]’\npres_code.cpp:871:29:   required from ‘example::update_ctx(TContext&, TRenderTarget&, example::ft)::<lambda(auto:150&)>::<lambda(auto:153&, auto:154&)> [with auto:153 = example::s::keep_in_bounds; auto:154 = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >; auto:150 = ecst::context::impl::step::proxy<main()::hs>; TContext = ecst::context::impl::data<main()::hs>; TRenderTarget = sf::RenderWindow]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./system_execution_adapter/./impl/./predicate_holder/predicate_holder.inl:46:30:   required from ‘ecst::system_execution_adapter::impl::predicate_holder<TPredicate>::for_subtasks(TF&&)::<lambda(auto:74&, auto:75&)> mutable::<lambda(auto:76&)> mutable [with auto:76 = ecst::context::system::data_proxy::multi<boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_, ecst::context::impl::data<main()::hs>, ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_> >; auto:74 = example::s::keep_in_bounds; auto:75 = ecst::context::system::executor_proxy::data<ecst::context::system::instance<main()::hs, boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_>, ecst::context::system::instance<TSettings, TSystemSignature>::execution_dispatch(TContext&) [with TContext = ecst::context::impl::data<main()::hs>; TSettings = main()::hs; TSystemSignature = boost::hana::type_impl<ecst::signature::system::impl::data<ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::mp::option_map::impl::data<boost::hana::map<boost::hana::detail::hash_table<boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 0ull>, 0ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 1ull>, 1ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 2ull>, 2ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 3ull>, 3ul>, boost::hana::detail::bucket<boost::hana::integral_constant<long long unsigned int, 4ull>, 4ul> >, boost::hana::basic_tuple<boost::hana::pair<std::integral_constant<long unsigned int, 0ul>, boost::hana::pair<ecst::inner_parallelism::strategy::split_evenly_fn::impl::parameters<ecst::inner_parallelism::strategy::split_evenly_fn::impl::v_cores_getter>, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 1ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::system::impl::tag_impl<example::s::velocity> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 2ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::circle> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 3ul>, boost::hana::pair<boost::hana::basic_tuple<ecst::tag::component::impl::tag_impl<example::c::velocity>, ecst::tag::component::impl::tag_impl<example::c::position> >, boost::hana::integral_constant<bool, true> > >, boost::hana::pair<std::integral_constant<long unsigned int, 4ul>, boost::hana::pair<ecst::signature::system::impl::output_impl<ecst::signature::system::impl::empty_output_type>, boost::hana::integral_constant<bool, false> > > > > > > >::_]::<lambda(auto:86&&)> >; TF = example::update_ctx(TContext&, TRenderTarget&, example::ft)::<lambda(auto:150&)> [with auto:150 = ecst::context::impl::step::proxy<main()::hs>; TContext = ecst::context::impl::data<main()::hs>; TRenderTarget = sf::RenderWindow]::<lambda(auto:153&, auto:154&)>; TPredicate = ecst::system_execution_adapter::t(TSystemTags ...) [with TSystemTags = {ecst::tag::system::impl::tag_impl<example::s::keep_in_bounds>, ecst::tag::system::impl::tag_impl<example::s::collision>, ecst::tag::system::impl::tag_impl<example::s::solve_contacts>, ecst::tag::system::impl::tag_impl<example::s::render_colored_circle>}]::<lambda(auto:77&)>]’\n/home/vittorioromeo/OHWorkspace/ecst/include/./ecst/./context/./system/./instance/instance.inl:155:14:   [ skipping 58 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n./utils/pres_game_app.hpp:208:23:   required from ‘void example::game_app<TContext>::init() [with TContext = ecst::context::impl::data<main()::hs>]’\n./utils/pres_game_app.hpp:216:17:   required from ‘example::game_app<TContext>::game_app(sf::RenderWindow&, TContext&) [with TContext = ecst::context::impl::data<main()::hs>]’\n./utils/.././boilerplate/app_runner.hpp:48:28:   required from ‘example::boilerplate::app_runner<T>::app_runner(const string&, std::size_t, std::size_t, Ts&& ...)::<lambda()> [with Ts = {ecst::context::impl::data<main()::hs>&}; T = example::game_app<ecst::context::impl::data<main()::hs> >]’\n./utils/.././boilerplate/app_runner.hpp:36:59:   required from ‘struct example::boilerplate::app_runner<T>::app_runner(const string&, std::size_t, std::size_t, Ts&& ...) [with Ts = {ecst::context::impl::data<main()::hs>&}; T = example::game_app<ecst::context::impl::data<main()::hs> >; std::__cxx11::string = std::__cxx11::basic_string<char>; std::size_t = long unsigned int]::<lambda()>’\n./utils/.././boilerplate/app_runner.hpp:36:25:   required from ‘example::boilerplate::app_runner<T>::app_runner(const string&, std::size_t, std::size_t, Ts&& ...) [with Ts = {ecst::context::impl::data<main()::hs>&}; T = example::game_app<ecst::context::impl::data<main()::hs> >; std::__cxx11::string = std::__cxx11::basic_string<char>; std::size_t = long unsigned int]’\n./utils/pres_game_app.hpp:224:49:   required from ‘void example::run_simulation(TContext&) [with TContext = ecst::context::impl::data<main()::hs>]’\npres_code.cpp:936:24:   required from here\npres_code.cpp:274:31: error: ‘class sf::Vector2<float>’ has no member named ‘ya’; did you mean ‘y’?\n                             v.ya *= -1;\n                             ~~^~"
  },
  {
    "path": "print_edge_cases.sh",
    "content": "#!/bin/bash\n\nfunction echoTest {\n    echo \"Testing:   '$1'\"\n    OUT0=$(echo -e \"$1\" | ./camomilla -d0)\n    OUT1=$(./camomilla -r -d1)\n    OUT2=$(./camomilla -r -d2)\n\n    echo -e \"    d2:    '$OUT2'\"\n    echo -e \"    d1:    '$OUT1'\"\n    echo -e \"    d0:    '$OUT0'\"\n\n    echo \"____________________________________\"\n}\n\nechoTest \"ending_space<A<B> >\"\nechoTest \"ending_space<A<B<C > > >\"\nechoTest \"ending_space_rel<A<B<(a < b) > >\"\nechoTest \"ending_space_rel<A<B<(a > b) > >\"\nechoTest \"ending_space_stream<A<B<(a << b) > >\"\nechoTest \"ending_space_stream<A<B<(a >> b) > >\"\nechoTest \"class<Type>\"\nechoTest \"rel<decltype(a < b)>\"\nechoTest \"rel<decltype(a > b)>\"\nechoTest \"stream<decltype(a << b)>\"\nechoTest \"stream<decltype(a >> b)>\"\nechoTest \"nested_rel<decltype(a<A> < b<B>)>\"\nechoTest \"nested_rel<decltype(a<A> > b<B>)>\"\nechoTest \"nested_stream<decltype(a<A> << b<B>)>\"\nechoTest \"nested_stream<decltype(a<A> >> b<B>)>\"\nechoTest \"nested_types<A<B>>\"\nechoTest \"nested_types_rel<A<B(a < b)>>\"\nechoTest \"nested_types_rel<A<B(a > b)>>\"\nechoTest \"nested_types_stream<A<B(a << b)>>\"\nechoTest \"nested_types_stream<A<B(a >> b)>>\"\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python3\n\nfrom setuptools import setup, find_packages\n\nsetup(\n    name = \"camomilla\",\n    scripts=['camomilla'],\n    version = \"0.2\",\n    author = \"Vittorio Romeo\",\n    author_email = \"vittorio.romeo@outlook.com\",\n    description = \"C++ error postprocessor\"\n)\n"
  }
]