From f35da8a21a63f99f70eea9e33d65ae6d43723531 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 25 Oct 2016 17:40:52 +0200
Subject: [PATCH] Enhance backend selection mechanism:

* Enable backend functions which are *not* generators
* Use the sumfac switch as a default switch
---
 python/dune/perftool/generation/backend.py | 11 +++++++----
 python/dune/perftool/options.py            |  9 +++++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/python/dune/perftool/generation/backend.py b/python/dune/perftool/generation/backend.py
index 27356c93..0e7b7ec2 100644
--- a/python/dune/perftool/generation/backend.py
+++ b/python/dune/perftool/generation/backend.py
@@ -1,4 +1,5 @@
 from dune.perftool.generation.cache import _RegisteredFunction
+from dune.perftool.options import option_switch
 from pytools import Record
 
 
@@ -9,10 +10,12 @@ class FuncProxy(Record):
     def __init__(self, interface, name, func):
         Record.__init__(self, interface=interface, name=name, func=func)
 
+    def __call__(self, *args, **kwargs):
+        return self.func(*args, **kwargs)
+
 
 def register_backend(interface, name, func):
     _backend_mapping.setdefault(interface, {})
-    assert name not in _backend_mapping[interface]
     _backend_mapping[interface][name] = func
 
 
@@ -24,15 +27,15 @@ def backend(interface=None, name='default'):
             # Allow order independence of the generator decorators
             # and the backend decorator by delaying the registration
             func = FuncProxy(interface, name, func)
-        else:
-            register_backend(interface, name, func)
+
+        register_backend(interface, name, func)
 
         return func
 
     return _dec
 
 
-def get_backend(interface=None, selector=None, **kwargs):
+def get_backend(interface=None, selector=option_switch("sumfact"), **kwargs):
     assert interface and selector
 
     select = selector(**kwargs)
diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
index 60f66248..a4c2e210 100644
--- a/python/dune/perftool/options.py
+++ b/python/dune/perftool/options.py
@@ -111,3 +111,12 @@ def get_option(key, default=None):
         init_option_dict()
 
         return _option_dict.get(key, default)
+
+
+def option_switch(opt):
+    def _switch():
+        if get_option(opt):
+            return opt
+        else:
+            return "default"
+    return _switch
\ No newline at end of file
-- 
GitLab