verify signatures of binding lambdas
the collection binding can be configured with various lambdas to supply the basic building blocks of the generated binding. Since we allow picking up basically anything (functors, function pointers, function objects, lamdas), and since we speculate on inlining optimisation of lambdas, we can not enforce a specific signature in the builder functions. But at least we can static_assert on the effective signature at the point where we're generating the actual binding configuration
This commit is contained in:
parent
7b6713bcab
commit
e698a3800b
3 changed files with 68 additions and 7 deletions
|
|
@ -60,6 +60,9 @@
|
|||
using lib::meta::Strip;
|
||||
using lib::diff::GenNode;
|
||||
|
||||
#define ASSERT_VALID_SIGNATURE(_FUN_, _SIG_) \
|
||||
static_assert (has_Sig<_FUN_, _SIG_>::value, "Function " STRINGIFY(_FUN_) " unsuitable, expected signature: " STRINGIFY(_SIG_));
|
||||
|
||||
/**
|
||||
* Attach to collection: Concrete binding setup.
|
||||
* This record holds all the actual binding and closures
|
||||
|
|
@ -83,6 +86,12 @@
|
|||
{
|
||||
using Coll = typename Strip<COLL>::TypeReferred;
|
||||
using Elm = typename Coll::value_type;
|
||||
|
||||
ASSERT_VALID_SIGNATURE (MAT, bool(GenNode const& spec, Elm const& elm))
|
||||
ASSERT_VALID_SIGNATURE (CTR, Elm (GenNode const&))
|
||||
ASSERT_VALID_SIGNATURE (SEL, bool(GenNode const&))
|
||||
ASSERT_VALID_SIGNATURE (ASS, bool(Elm&, GenNode const&))
|
||||
ASSERT_VALID_SIGNATURE (MUT, bool(Elm&, TreeMutator::MutatorBuffer))
|
||||
|
||||
Coll& collection;
|
||||
|
||||
|
|
@ -445,13 +454,13 @@
|
|||
}
|
||||
|
||||
static bool
|
||||
disable_assignment (GenNode const&)
|
||||
disable_assignment (Elm&, GenNode const&)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
disable_childMutation (GenNode const&, TreeMutator::MutatorBuffer)
|
||||
disable_childMutation (Elm&, TreeMutator::MutatorBuffer)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -308,10 +308,10 @@ namespace test{
|
|||
{
|
||||
cout << "match? "<<spec.idi.getSym()<<"=?="<<elm.key<<endl;
|
||||
return spec.idi.getSym() == elm.key;
|
||||
}
|
||||
)
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cout << lib::test::showSizeof(mutator) <<endl;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2395,7 +2395,9 @@
|
|||
</node>
|
||||
<node CREATED="1458178113697" HGAP="46" ID="ID_186668887" MODIFIED="1458178286448" TEXT="Design-Schlußfolgerungen" VSHIFT="-5">
|
||||
<node CREATED="1458178126159" ID="ID_1322433318" MODIFIED="1458178131587" TEXT="Rahmenklasse + Closures"/>
|
||||
<node CREATED="1458178133078" ID="ID_278002579" MODIFIED="1458178148384" TEXT="Closures mit der Ersatz-Impl vorbelegen"/>
|
||||
<node CREATED="1458178133078" ID="ID_278002579" MODIFIED="1458851636692" TEXT="Closures mit der Ersatz-Impl vorbelegen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1458178150916" ID="ID_1020570949" MODIFIED="1458178174848" TEXT="Problem: komplexe Konstruktion">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
|
|
@ -2442,6 +2444,54 @@
|
|||
</node>
|
||||
<node CREATED="1458850782747" ID="ID_1019140953" MODIFIED="1458850793430" TEXT="Umgang mit fehlendem Selector"/>
|
||||
</node>
|
||||
<node CREATED="1458868836883" ID="ID_717368167" MODIFIED="1458868851053" TEXT="Beobachtungen">
|
||||
<node CREATED="1458868852849" ID="ID_1641586585" MODIFIED="1458869076689" TEXT="Sonderbarer "this"-Typ">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
der Builder in der nested DSL generiert einen sonderbar falschen "this"-Typ,
|
||||
</p>
|
||||
<p>
|
||||
genauer gesagt, eine TYPID die falsch ist.
|
||||
</p>
|
||||
<p>
|
||||
Und zwar kommt es da zum "Übersprechen" von einem Typ-Parameter in den anderen.
|
||||
</p>
|
||||
<p>
|
||||
Im Besonderen hab ich beobachtet, daß, wenn man auf den 3.Typparameter ein Lambda gibt,
|
||||
</p>
|
||||
<p>
|
||||
dann auf dem 4. oder 5. Typparameter der bisherige /alte Typ des 3.Typparameters auftaucht,
|
||||
</p>
|
||||
<p>
|
||||
u.U auch eingeschachtelt als ein Argument.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Habe mich aber davon überzeugt, daß die eigentlichen Typ-Parameter in Ordnung sind.
|
||||
</p>
|
||||
<p>
|
||||
Und zwar habe ich das verifiziert
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
durch Ausgeben der Typen im Konstruktor (mithilfe meiner typeStr<TY>()
|
||||
</li>
|
||||
<li>
|
||||
durch Einbauen einer Static-Assertion mit Signatur-Match
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1458850516270" ID="ID_263851499" MODIFIED="1458850519025" TEXT="Test">
|
||||
<node CREATED="1458850521270" ID="ID_534213210" MODIFIED="1458850525041" TEXT="Fälle">
|
||||
<node CREATED="1458850526133" ID="ID_55717538" MODIFIED="1458850550109" TEXT="Binden an Sammlung aus Primitiven"/>
|
||||
|
|
@ -2509,7 +2559,9 @@
|
|||
<node CREATED="1458850387823" ID="ID_415691337" MODIFIED="1458850394506" TEXT="allgemein">
|
||||
<node CREATED="1458850397158" ID="ID_1336568549" MODIFIED="1458850405665" TEXT="GenNode">
|
||||
<node CREATED="1458850406396" ID="ID_1837583550" MODIFIED="1458850420054" TEXT="string-Repräsentation der Payload"/>
|
||||
<node CREATED="1458850422587" ID="ID_1552868803" MODIFIED="1458850433820" TEXT="Metafunktion für mögliche Payload"/>
|
||||
<node COLOR="#338800" CREATED="1458850422587" ID="ID_1552868803" MODIFIED="1458851592866" TEXT="Metafunktion für mögliche Payload">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1458850437017" ID="ID_592865755" MODIFIED="1458850455074" TEXT="Planting-Handle">
|
||||
<node CREATED="1458850456134" ID="ID_1020391699" MODIFIED="1458850463009" TEXT="Zwischenschicht einziehen im TreeMutator"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue