ElementBox: investigate ctor syntax possibilites

Basically we want to create ElementBoxWidgets according to a
preconfigured layout scheme, yet we'll need to pass some additional
qualifiers and optional features, and these need to be checked
and used in accordance with the chosen flavour...

Investigating a possible solution based on additional ctor parameters,
which are given as "algebraic terms", and actually wrap a functor
to manipulate a builder configuration record
This commit is contained in:
Fischlurch 2022-08-28 01:02:10 +02:00
parent a0fe89689c
commit ff6234829a
4 changed files with 127 additions and 73 deletions

View file

@ -45,13 +45,11 @@
// 06/19 - use a statefull counting filter in a treeExplorer pipeline
// 03/20 - investigate type deduction bug with PtrDerefIter
// 01/21 - look for ways to detect the presence of an (possibly inherited) getID() function
// 08/22 - techniques to supply additional feature selectors to a constructor call
/** @file try.cpp
* Verify a way to detect the presence of a specific implementation function,
* even when it is just inherited and thus not part of the concrete class definition.
* The trick is to _emulate the use_ of the object method in question within a `decltype( )`
* statement, which in turn is used to build the concrete template signature.
* Investigate techniques to supply additional descriptive ctor arguments in a type safe way.
*/
typedef unsigned int uint;
@ -60,90 +58,86 @@ typedef unsigned int uint;
#include "lib/format-cout.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/util.hpp"
#include "lib/idi/entry-id.hpp"
#include "lib/meta/duck-detector.hpp"
#include <utility>
//#include <utility>
#include <functional>
#include <string>
using std::string;
using lib::idi::EntryID;
using lib::idi::BareEntryID;
using lib::meta::Yes_t;
using lib::meta::No_t;
#define SHOW_TYPE(_TY_) \
cout << "typeof( " << STRINGIFY(_TY_) << " )= " << lib::meta::typeStr<_TY_>() <<endl;
#define SHOW_EXPR(_XX_) \
cout << "Probe " << STRINGIFY(_XX_) << " ? = " << _XX_ <<endl;
META_DETECT_FUNCTION(BareEntryID const&, getID,(void) const);
META_DETECT_FUNCTION_ARGLESS(getID);
template<typename TY>
class Can_retrieve_and_compare_ID
{
template<typename X,
typename SEL = decltype(std::declval<BareEntryID>() == std::declval<X>().getID())>
struct Probe
{ }; \
\
template<class X> \
static Yes_t check(Probe<X> * ); \
template<class> \
static No_t check(...); \
\
public: \
static const bool value = (sizeof(Yes_t)==sizeof(check<TY>(0))); \
};
class Base
class Feat
{
EntryID<Base> idi;
public:
BareEntryID const&
getID() const
string prop_{""};
using Manipulator = std::function<Feat(Feat)>;
struct Qualifier
: Manipulator
{
return idi;
using Manipulator::Manipulator;
};
friend Qualifier bla();
friend Qualifier blubb(string);
public:
operator string () const
{
return "Feat{"+prop_+"}";
}
Feat() = default;
template<class... QS>
Feat(Qualifier qual, QS... qs)
: Feat{qual(Feat{qs...})}
{ }
};
class Derived
: public Base
{ };
Feat::Qualifier
bla()
{
return Feat::Qualifier{[](Feat feat)
{
feat.prop_ = "bla";
return feat;
}};
}
class Derailed
{ };
Feat::Qualifier
blubb(string murks)
{
return Feat::Qualifier{[=](Feat feat)
{
feat.prop_ += ".blubb("+murks+")";
return feat;
}};
}
int
main (int, char**)
{
Base b1;
Derived d1;
Derailed r1;
SHOW_EXPR( b1 );
SHOW_EXPR( b1.getID() );
SHOW_EXPR( HasFunSig_getID<Base>::value );
SHOW_EXPR( HasArglessFun_getID<Base>::value );
SHOW_EXPR( Can_retrieve_and_compare_ID<Base>::value );
Feat f0;
SHOW_EXPR(f0);
SHOW_EXPR( d1 );
SHOW_EXPR( d1.getID() );
SHOW_EXPR( HasFunSig_getID<Derived>::value );
SHOW_EXPR( HasArglessFun_getID<Derived>::value );
SHOW_EXPR( Can_retrieve_and_compare_ID<Derived>::value );
Feat f1(bla());
SHOW_EXPR(f1);
SHOW_EXPR( r1 );
SHOW_EXPR( HasFunSig_getID<Derailed>::value );
SHOW_EXPR( HasArglessFun_getID<Derailed>::value );
SHOW_EXPR( Can_retrieve_and_compare_ID<Derailed>::value );
Feat f2(blubb("Ψ"));
SHOW_EXPR(f2);
// SHOW_TYPE( decltype( d1.getID() ))
Feat f3(bla(),blubb("")); // Note: evaluated from right to left, bla() overwrites prop
SHOW_EXPR(f3);
Feat f4(blubb("💡"), bla());
SHOW_EXPR(f4);
cout << "\n.gulp.\n";
return 0;

View file

@ -59,7 +59,7 @@
#include <utility>
namespace stage {
namespace stage {
namespace model {
using lib::time::Time;

View file

@ -95,13 +95,13 @@
**
** ## Structure of the clip representation
** Obviously, managing all these wildly different appearance styles incurs a lot of complexity,
** which needs to be decomposed to become manageable. Thus, we introduce several responsibilities
** which needs to be decomposed to keep it manageable. Thus, we introduce several responsibilities
** - the ClipPresenter is what formally corresponds to the session::Clip, i.e. in a birds
** eyes view, it "is" the clip. However, in fact the ClipPresenter only manages the
** desired properties and delegates the actual realisation to "some widget"
** - and this "widget" is in fact a "PImpl", the ClipDelegate, which foremost exposes an interface
** to adapt and control the appearance style, while the actual clip widget is only accessible
** through the ClipDelegate interface
** to adapt and control the appearance style, while the actual clip widget remains a private detail
** and is only accessible through the ClipDelegate interface
** - behind the scenes, [within the implementation](\ref clip-widget.cpp), several implementation
** subclasses are available, to be installed and exchanged to accommodate the desired appearance
** style. These are managed semi-automatically and hooked into the appropriate display framework

View file

@ -17880,7 +17880,11 @@
<linktarget COLOR="#844764" DESTINATION="ID_368245484" ENDARROW="Default" ENDINCLINATION="-469;652;" ID="Arrow_ID_264431308" SOURCE="ID_485594461" STARTARROW="None" STARTINCLINATION="-1673;136;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1541095743511" ID="ID_96949358" MODIFIED="1557498707223" TEXT="#1185 ElementBoxWidget">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1541095743511" ID="ID_96949358" MODIFIED="1661616404971" TEXT="#1185 ElementBoxWidget">
<linktarget COLOR="#541915" DESTINATION="ID_96949358" ENDARROW="Default" ENDINCLINATION="-1458;130;" ID="Arrow_ID_1319876475" SOURCE="ID_1038790770" STARTARROW="None" STARTINCLINATION="818;-68;"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1661616390134" ID="ID_416292634" MODIFIED="1661616398305" TEXT="#1219 draft framework for ElementBoxWidget">
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1541087843514" ID="ID_1798999985" MODIFIED="1557498707223" TEXT="weit verbreiteter Grundbaustein">
@ -17926,10 +17930,11 @@
d.h. das Text-Label bekommt ggfs. eine L&#228;ngenbeschr&#228;nkung.
</p>
<p>
Und sonst wird er K&#246;rper/Hintergrund ausgedehnt
Und sonst wird der K&#246;rper/Hintergrund ausgedehnt
</p>
</body>
</html></richcontent>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_857510555" ENDARROW="Default" ENDINCLINATION="390;43;" ID="Arrow_ID_817703923" SOURCE="ID_153982067" STARTARROW="None" STARTINCLINATION="474;-38;"/>
</node>
<node CREATED="1541088480846" ID="ID_6642470" MODIFIED="1576282358101" TEXT="Kopf proportional platzierbar">
<richcontent TYPE="NOTE"><html>
@ -18111,7 +18116,7 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1625073420073" ID="ID_1610907627" MODIFIED="1625073651531" TEXT="Expander">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1625073503359" ID="ID_795687889" MODIFIED="1625073650316" TEXT="Label mit intellilgentem Inhalt">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1625073503359" ID="ID_795687889" MODIFIED="1625073650316" TEXT="Label mit intelligentem Inhalt">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1625073544225" ID="ID_714674809" MODIFIED="1625073574690" TEXT="ID-Nummer"/>
<node CREATED="1625073613360" ID="ID_881063614" MODIFIED="1625073620611" TEXT="erg&#xe4;nzende Beschreibung"/>
@ -18208,6 +18213,23 @@
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1661557586218" ID="ID_859822896" MODIFIED="1661620110453" TEXT="Zeitangabe in Ausdehnung umsetzen">
<arrowlink COLOR="#7479c0" DESTINATION="ID_1343110314" ENDARROW="Default" ENDINCLINATION="-815;-1702;" ID="Arrow_ID_712594873" STARTARROW="None" STARTINCLINATION="471;32;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1661557875471" ID="ID_339780782" MODIFIED="1661557937884" TEXT="API im CanvasHook">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1661557894284" ID="ID_58216896" MODIFIED="1661557909598" TEXT="&#x27f9; dann m&#xfc;&#xdf;te es hookable sein..."/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1661557910685" ID="ID_709773431" MODIFIED="1661557921585" TEXT="Alternativen?">
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1661557959964" HGAP="149" ID="ID_1683748982" MODIFIED="1661557987514" TEXT="Wann/wozu?" VSHIFT="2">
<icon BUILTIN="help"/>
<node CREATED="1661558025450" ID="ID_153982067" MODIFIED="1661558059696" TEXT="im Modus &quot;feste L&#xe4;ngenvorgabe&quot;">
<arrowlink DESTINATION="ID_857510555" ENDARROW="Default" ENDINCLINATION="390;43;" ID="Arrow_ID_817703923" STARTARROW="None" STARTINCLINATION="474;-38;"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1625075206250" ID="ID_721261085" MODIFIED="1625075212634" TEXT="Strukturen aufbauen">
<icon BUILTIN="flag-yellow"/>
@ -18215,7 +18237,8 @@
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1625075282830" ID="ID_1730704998" MODIFIED="1625075292624" TEXT="mini-DSL f&#xfc;r die Konfigurations-Varianten schaffen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1654445954424" ID="ID_1720484280" MODIFIED="1654445962251" TEXT="1.Ansatz: explizit">
<node CREATED="1654445954424" ID="ID_1720484280" MODIFIED="1661558650010" TEXT="1.Ansatz: explizit">
<icon BUILTIN="button_cancel"/>
<node CREATED="1654445618173" ID="ID_1315147546" MODIFIED="1654445654111" TEXT="Icon per vordefinierter Spec">
<node CREATED="1654445665127" ID="ID_579106767" MODIFIED="1654445667994" TEXT="TOGGLE"/>
<node CREATED="1654445668679" ID="ID_459682437" MODIFIED="1654445672029" TEXT="PLACEMENT"/>
@ -18239,7 +18262,8 @@
<node CREATED="1654446176506" ID="ID_1198030114" MODIFIED="1654446183237" TEXT="speziellen Renderer einbinden"/>
</node>
</node>
<node CREATED="1654447175801" ID="ID_130925250" MODIFIED="1654447187850" TEXT="2.Ansatz: intentional">
<node CREATED="1654447175801" ID="ID_130925250" MODIFIED="1661558654675" TEXT="2.Ansatz: intentional">
<icon BUILTIN="forward"/>
<node CREATED="1654447205213" ID="ID_360701766" MODIFIED="1654447213879" TEXT="man gibt einen Pr&#xe4;sentationsstil vor"/>
<node CREATED="1654447241576" ID="ID_17226608" MODIFIED="1654447262732" TEXT="sowie einen Typ und einen Inhalts-Stil"/>
<node CREATED="1654447896151" ID="ID_1043723877" MODIFIED="1654447900359" TEXT="Schema">
@ -18351,6 +18375,15 @@
<icon BUILTIN="yes"/>
<node CREATED="1654449709778" ID="ID_1842345806" MODIFIED="1654449715002" TEXT="pr&#xe4;dikat-artiger Term"/>
<node CREATED="1654449716467" ID="ID_1816176358" MODIFIED="1654449724831" TEXT="aber mit Compile-Time safety"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1661640883263" ID="ID_606322224" MODIFIED="1661640890135" TEXT="ist das m&#xf6;glich?">
<icon BUILTIN="help"/>
<node CREATED="1661640991591" ID="ID_1210145081" MODIFIED="1661641017079" TEXT="Idee: Funktor auf einen Konfiguration-Record anwenden">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1661641024133" ID="ID_610957557" MODIFIED="1661641043428" TEXT="kann man das in eine Library-Implementierung verpacken?">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1654449882246" ID="ID_1662756745" MODIFIED="1654449895484" TEXT="vorl&#xe4;ufige Vereinfachungen...">
<node CREATED="1654449896988" ID="ID_1099433261" MODIFIED="1654449909989" TEXT="Map&lt;string,string&gt;"/>
@ -18372,6 +18405,16 @@
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1661558691874" ID="ID_1119666560" MODIFIED="1661558709710" TEXT="Kontext-Anbindung planen...">
<icon BUILTIN="hourglass"/>
<node CREATED="1661558725419" ID="ID_903216053" MODIFIED="1661558736509" TEXT="Zeit/Gr&#xf6;&#xdf;en-&#xdc;bersetzung"/>
<node CREATED="1661558740744" ID="ID_629101835" MODIFIED="1661558746908" TEXT="Placement-Editor"/>
<node CREATED="1661558748136" ID="ID_450211999" MODIFIED="1661558766073" TEXT="Anbindung an ein Tangible">
<node CREATED="1661558767493" ID="ID_984314368" MODIFIED="1661558783560" TEXT="offen lassen: ist es selber ein Tangible?">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1654445541606" ID="ID_520455096" MODIFIED="1654445545420" TEXT="Integrieren">
<icon BUILTIN="flag-yellow"/>
@ -29897,6 +29940,7 @@
<icon BUILTIN="messagebox_warning"/>
</node>
<node COLOR="#338800" CREATED="1611954240824" ID="ID_1048238324" MODIFIED="1611957379318" TEXT="1.Entwurf: Datencontainer als Basisklasse">
<linktarget COLOR="#82b7c6" DESTINATION="ID_1048238324" ENDARROW="Default" ENDINCLINATION="-451;461;" ID="Arrow_ID_22542364" SOURCE="ID_1850041925" STARTARROW="None" STARTINCLINATION="-197;-5;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1611954259205" ID="ID_596924875" MODIFIED="1611954280703" TEXT="damit gibt es dann immer nur eine Allokation"/>
<node COLOR="#338800" CREATED="1611954666544" ID="ID_1268124709" MODIFIED="1611957366432" TEXT="Datencontainer-Klasse moveable machen">
@ -30172,6 +30216,10 @@
<linktarget COLOR="#ab415e" DESTINATION="ID_811510338" ENDARROW="Default" ENDINCLINATION="-975;-81;" ID="Arrow_ID_610185006" SOURCE="ID_214009767" STARTARROW="None" STARTINCLINATION="744;47;"/>
<linktarget COLOR="#f2d4e1" DESTINATION="ID_811510338" ENDARROW="Default" ENDINCLINATION="-516;-1779;" ID="Arrow_ID_1877167801" SOURCE="ID_1825783827" STARTARROW="None" STARTINCLINATION="481;25;"/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1661610654817" ID="ID_1038790770" MODIFIED="1661610893078" TEXT="#1038 draft clip UI representation">
<arrowlink COLOR="#541915" DESTINATION="ID_96949358" ENDARROW="Default" ENDINCLINATION="-1458;130;" ID="Arrow_ID_1319876475" STARTARROW="None" STARTINCLINATION="818;-68;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1583678069596" ID="ID_749021089" MODIFIED="1583678189115" TEXT="Stufe-1">
<icon BUILTIN="forward"/>
<node COLOR="#338800" CREATED="1583678075045" ID="ID_1071916226" MODIFIED="1612439673716" TEXT="erst mal &#xfc;berhaupt einen Block belegen">
@ -30472,6 +30520,7 @@
</node>
</node>
<node COLOR="#435e98" CREATED="1612474853633" ID="ID_1343110314" MODIFIED="1612480345782" TEXT="Beschlu&#xdf;: es wird explizit Bestandteil des CanvasHook-API">
<linktarget COLOR="#7479c0" DESTINATION="ID_1343110314" ENDARROW="Default" ENDINCLINATION="-815;-1702;" ID="Arrow_ID_712594873" SOURCE="ID_859822896" STARTARROW="None" STARTINCLINATION="471;32;"/>
<linktarget COLOR="#6377b1" DESTINATION="ID_1343110314" ENDARROW="Default" ENDINCLINATION="33;-52;" ID="Arrow_ID_1779941265" SOURCE="ID_426717931" STARTARROW="None" STARTINCLINATION="-154;7;"/>
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1612480328315" ID="ID_1469666563" MODIFIED="1612480344504" TEXT="public machen">
@ -30488,7 +30537,7 @@
<arrowlink COLOR="#67384d" DESTINATION="ID_616104406" ENDARROW="Default" ENDINCLINATION="-856;39;" ID="Arrow_ID_349418044" STARTARROW="None" STARTINCLINATION="241;19;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1612620549021" ID="ID_351516626" MODIFIED="1612620738928" TEXT="mu&#xdf; wp&#xe4;ter noch genauer untersucht werden">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1612620549021" ID="ID_351516626" MODIFIED="1612620738928" TEXT="mu&#xdf; sp&#xe4;ter noch genauer untersucht werden">
<arrowlink COLOR="#f17881" DESTINATION="ID_1826613475" ENDARROW="Default" ENDINCLINATION="1266;110;" ID="Arrow_ID_1550601686" STARTARROW="None" STARTINCLINATION="2103;126;"/>
<icon BUILTIN="bell"/>
</node>
@ -30497,6 +30546,7 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1611539501493" ID="ID_1849626018" MODIFIED="1611539513626" TEXT="TODO: &#xdc;berlegungen zur Daten-Storage">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1611539517985" ID="ID_1850041925" MODIFIED="1611539580594" TEXT="macht es Sinn, f&#xfc;r alle Clip-Anzeigeformen einen gemeinsamen Daten-Record zu verwenden?">
<arrowlink COLOR="#82b7c6" DESTINATION="ID_1048238324" ENDARROW="Default" ENDINCLINATION="-451;461;" ID="Arrow_ID_22542364" STARTARROW="None" STARTINCLINATION="-197;-5;"/>
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1611539550821" ID="ID_219259739" MODIFIED="1611539584717" TEXT="und: diesen einbetten, oder per Pointer halten und weitergeben?">
@ -59395,6 +59445,16 @@
</node>
<node CREATED="1522933624861" ID="ID_1008186406" MODIFIED="1557498707241" TEXT="Timeline-Widget">
<icon BUILTIN="full-2"/>
<node COLOR="#338800" CREATED="1661448478272" ID="ID_235141959" MODIFIED="1661448487541" TEXT="Track-Body-Anzeige">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1661448488695" ID="ID_974534798" MODIFIED="1661448516836" TEXT="Track-Head-Anzeige">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1661448495494" ID="ID_1252888028" MODIFIED="1661448524515" STYLE="fork" TEXT="brauche ElementBox-Widget">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1522933545616" ID="ID_193999125" MODIFIED="1557498707241" TEXT="Fixture">
<icon BUILTIN="full-3"/>