From c87ca5d6324916abc139a08048b985d200ff08f1 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 15 Jun 2019 17:41:17 +0200 Subject: [PATCH] Timeline: generalise unsafe access to embedded profile data While somewhat ugly, I deem this acceptable in such a context, where the implementation handles its own embedded storage structure. --- src/lib/verb-visitor.hpp | 11 + src/stage/timeline/track-profile.hpp | 19 +- wiki/thinkPad.ichthyo.mm | 597 +++++++++++++++++---------- 3 files changed, 402 insertions(+), 225 deletions(-) diff --git a/src/lib/verb-visitor.hpp b/src/lib/verb-visitor.hpp index b6a54d2c4..72bd531a0 100644 --- a/src/lib/verb-visitor.hpp +++ b/src/lib/verb-visitor.hpp @@ -245,6 +245,17 @@ namespace lib { + string{util::unConst(this)->getPayload().getID()} + ")"; } + + /** unsafe downcast and access to an embedded payload argument value */ + template + ARG& + accessArg () + { + using EmbeddedPayload = lib::VerbHolder; + REQUIRE (INSTANCEOF (EmbeddedPayload, &this->getPayload())); + EmbeddedPayload& embedded = static_cast(this->getPayload()); + return std::get<0> (embedded.args_); + } }; diff --git a/src/stage/timeline/track-profile.hpp b/src/stage/timeline/track-profile.hpp index ea00efb23..18aeedaa7 100644 --- a/src/stage/timeline/track-profile.hpp +++ b/src/stage/timeline/track-profile.hpp @@ -67,7 +67,7 @@ namespace timeline { virtual void content(uint h) =0; ///< represent a content area with the given vertical extension virtual void open() =0; ///< indicate entering a nested structure, typically as 3D inset virtual void close(uint n) =0; ///< indicate the end of `n` nested structures, typically by ascending back `n` levels - virtual void prelude(uint f) =0; ///< start rack presentation at top of the timeline, with `f` pinned (always visible) elements + virtual void prelude(uint f) =0; ///< start track presentation at top of the timeline, with `f` pinned (always visible) elements virtual void coda(uint pad) =0; ///< the closing part of the timeline at the bottom of the track display, with `pad` additional padding static const size_t MAX_ARG_SIZE = sizeof(size_t); @@ -145,7 +145,20 @@ namespace timeline { append_close (1); } + uint + getPinnedPrefixCnt() + { + return firstEntryIs("prelude")? elements.front().accessArg() : 0; + } + private: + bool + firstEntryIs (Literal expectedToken) + { + return not isnil(elements) + and elements.front()->getID() == expectedToken; + } + bool lastEntryIs (Literal expectedToken) { @@ -157,9 +170,7 @@ namespace timeline { incrementLastCloseSlope() { REQUIRE (lastEntryIs ("close")); - using EmbeddedPayload = lib::VerbHolder; - EmbeddedPayload& embedded = static_cast(elements.back().getPayload()); - uint& slopeDepth = std::get<0> (embedded.args_); + uint& slopeDepth = elements.back().accessArg(); ++ slopeDepth; } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index d9e5b6f84..6abc6c1f7 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -116,7 +116,7 @@ - + @@ -134,13 +134,14 @@ - + + - + @@ -159,10 +160,11 @@ Ganz anders Model::Tangible: dieses registriert sich bei der Konstruktion

-
+ +
- + @@ -175,7 +177,8 @@ aber so herum macht es mehr Sinn

-
+ +
@@ -199,7 +202,7 @@ - + @@ -228,7 +231,8 @@ BusTerm, das damit Nachrichten an den Nexus schicken kann.

-
+ +
@@ -255,7 +259,7 @@ - + @@ -268,9 +272,10 @@ Wartet nur noch auf proof-of-concept (DemoGuiRoundtrip)

-
+ + - + @@ -283,7 +288,8 @@ aber nur via einfacher "uplink"-Verbindung

-
+ +
@@ -367,7 +373,7 @@ - + @@ -386,7 +392,8 @@ Term-Signal nicht ausgesendet würde.

-
+ +
@@ -459,7 +466,7 @@ - + @@ -478,9 +485,10 @@ Anmerkung: ein "frestehendes" BusTerm ist valide und zugelassen, es hat halt nur eine uplink-Connection.

-
+ +
- + @@ -493,7 +501,8 @@ es muß dazu auch jede Menge Methoden implementieren.

-
+ +
@@ -603,7 +612,7 @@ - + @@ -622,7 +631,8 @@ Ein zu früher bzw. zu später Aufruf "fällt einfach hinten runter"

-
+ +
@@ -654,7 +664,7 @@
- + @@ -691,7 +701,8 @@ dann kann der Shutdown-Prozeß den Start des GUI überholen.

-
+ +
@@ -3923,7 +3934,7 @@
- + @@ -3936,7 +3947,8 @@ indem wir ein GTK-Signal erzeugen, das das Hauptfenster schließt

-
+ + @@ -5435,7 +5447,7 @@ - + @@ -5465,13 +5477,14 @@ - + + - + @@ -5498,7 +5511,8 @@ - + + @@ -5513,7 +5527,7 @@ - + @@ -5523,7 +5537,8 @@ vorbereitete Grundstrukturen für immer wiederkehrende Setups

-
+ + @@ -5718,7 +5733,7 @@ - + @@ -5731,7 +5746,8 @@ Im Zweifelsfall den GTK+ Inspector verwenden!

-
+ +
@@ -5750,7 +5766,7 @@
- + @@ -5760,7 +5776,8 @@ CSS genügt

-
+ +
@@ -5773,7 +5790,7 @@ - + @@ -5808,7 +5825,8 @@ }

-
+ +
@@ -5882,7 +5900,7 @@
- + @@ -5895,10 +5913,11 @@ daß die alte, obsolete Timeline zurückgebaut ist

-
+ +
- + @@ -5914,7 +5933,8 @@ bevor die Notification-Facade geöffnet werden konnte

-
+ +
@@ -5966,7 +5986,7 @@ - + @@ -5997,7 +6017,8 @@ Allerdings habe ich an der Stelle immer noch GTK-Assertions

-
+ +
@@ -6045,7 +6066,7 @@ - + @@ -6073,7 +6094,8 @@ ist, daß Gio::Application sofort auch gleich eine dBus-Verbindung hochfährt.

-
+ +
@@ -16686,7 +16708,7 @@ - + @@ -16702,7 +16724,8 @@ und daher auf "inaktiv" geschaltet ist.

-
+ +
@@ -17092,7 +17115,7 @@ - + @@ -17102,7 +17125,8 @@ ...denn das ist das vereinfachte Setup für "einfache" Applikationen

-
+ +
@@ -17478,7 +17502,7 @@ - + @@ -17488,9 +17512,10 @@ das Diff wird auf den Platzhalter angewendet

-
+ +
- + @@ -17503,7 +17528,8 @@ dann muß dieses automatisch deregistriert werden

-
+ +
@@ -17676,7 +17702,7 @@ - + @@ -17686,9 +17712,10 @@ d.h. das Widget unternimmt selber nichts, und überläßt GTK die Größenbestimmung

-
+ +
- + @@ -17701,9 +17728,10 @@ Und sonst wird er Körper/Hintergrund ausgedehnt

-
+ +
- + @@ -17739,7 +17767,8 @@ Sehr wichtig für die Anzeige von langen Clips und Effekten.

-
+ + @@ -17988,7 +18017,7 @@ - + @@ -18004,7 +18033,8 @@ Details im  TiddlyWiki....

-
+ +
@@ -18212,7 +18242,7 @@ - + @@ -18222,7 +18252,8 @@ ...für die dritte Lösung, die Repräsentation bereits in der Session

-
+ +
@@ -18310,7 +18341,7 @@ - + @@ -18326,9 +18357,10 @@ Implementiert würde sie vom jeweiligen Widget

-
+ +
- + @@ -18356,9 +18388,10 @@ Der Dekorator würde also auf dem TreeMutator sitzen...

-
+ +
- + @@ -18377,9 +18410,10 @@ Daher gibt es die matchSrc-Operation. Effektiv wird die aber nur bei einem Delete aufgerufen...

-
+ +
- + @@ -18400,7 +18434,8 @@ - + + @@ -18478,7 +18513,7 @@ - + @@ -18488,7 +18523,8 @@ d.h. eine LUID

-
+ +
@@ -18521,7 +18557,7 @@ - + @@ -18534,7 +18570,8 @@ Irgend eine BareEntryID genügt

-
+ +
@@ -18545,7 +18582,7 @@ - + @@ -18561,7 +18598,8 @@ Daher sollte eine inkompatible Strukturänderung überhaupt nicht auftreten können

-
+ +
@@ -18603,7 +18641,7 @@ - + @@ -18613,13 +18651,14 @@ ...abstraktes Interface

-
+ + - + @@ -18635,7 +18674,8 @@ um die Bindung herzustellen

-
+ +
@@ -18646,7 +18686,7 @@ - + @@ -18665,7 +18705,8 @@ und erwarten abweichend vom Standard ein vollständiges Skelett im INS-Verb

-
+ + @@ -19113,7 +19154,7 @@ - + @@ -19126,7 +19167,8 @@ weil ein Layout-Manager immer nur im Bereich eines TimelineWidget relevant ist

-
+ +
@@ -19399,7 +19441,7 @@ - + @@ -19412,7 +19454,8 @@ so z.B. sein Placement, welches teilweise als Properties des Track abgebildet wird.

-
+ +
@@ -19515,7 +19558,7 @@ - + @@ -19544,7 +19587,8 @@ zur Anwendung kommt

-
+ +
@@ -19574,7 +19618,7 @@ - + @@ -19593,7 +19637,8 @@ am Anfang des Track-Profils, welche immer sichtbar bleiben soll

-
+ +
@@ -19617,7 +19662,7 @@ - + @@ -19630,9 +19675,10 @@ stets besser ist, als repetitives aufdoppeln und variieren

-
+ +
- + @@ -19650,7 +19696,8 @@ - + + @@ -20527,17 +20574,63 @@
- - + + + + + + + + + + + + +

+ weil man damit eine generische Klammer bauen kann +

+ + +
+ +
+ + + + + + + + + +

+ und bleibt anderweitig ungenutzt +

+ + +
+
+ + + + + + +
- + +
+
+ + +
@@ -20657,7 +20750,7 @@ - + @@ -20667,7 +20760,8 @@ ...in dem der Timeline body-canvas nämlich liegt

-
+ +
@@ -20738,7 +20832,7 @@ - + @@ -20748,7 +20842,8 @@ wir können nicht von 0 bis MAXINT zeichnen

-
+ +
@@ -20806,7 +20901,7 @@ - + @@ -20816,7 +20911,8 @@ ...zum Beispiel um einen "Wall" auch expressiv zu schattieren

-
+ +
@@ -20844,7 +20940,7 @@ - + @@ -20860,7 +20956,8 @@ wenn er mit der HeaderPane den benötigten Platz aushandelt

-
+ + @@ -20920,7 +21017,7 @@ - + @@ -20930,7 +21027,8 @@ ...sie verwenden dann ein LabelWidget zur Darstellung

-
+ +
@@ -20976,7 +21074,7 @@ - + @@ -20986,7 +21084,8 @@ ERR: nexus.hpp:189: worker_3: ~Nexus: Some UI components are still connected to the backbone.

-
+ +
@@ -21051,7 +21150,7 @@ - + @@ -21067,7 +21166,8 @@ Verwende das als Leitgedanke, um das Layout zu entwickeln

-
+ + @@ -22477,7 +22577,7 @@ - + @@ -22495,10 +22595,11 @@ - + + - + @@ -22513,7 +22614,8 @@ - + + @@ -22527,7 +22629,7 @@ - + @@ -22552,7 +22654,8 @@ - + + @@ -22694,7 +22797,7 @@ - + @@ -22707,7 +22810,8 @@ where 1 tick unit depends on the current zoom level

-
+ +
@@ -22715,7 +22819,7 @@
- + @@ -22730,12 +22834,13 @@ - + + - + @@ -22757,7 +22862,8 @@ Theoretisch könnte eine Skala auf einer Seite oder auf beiden Seiten limitiert sein....?

-
+ + @@ -22825,7 +22931,7 @@ - + @@ -22844,7 +22950,8 @@ analog zu gui::model::Tangible

-
+ +
@@ -23248,7 +23355,7 @@ - + @@ -23267,7 +23374,8 @@ erfordert bereits Kenntnis der Innereien

-
+ +
@@ -30340,7 +30448,7 @@ - + @@ -30353,11 +30461,12 @@ Implementierung der real-world-Variante fehlt!

-
+ + - + @@ -30373,7 +30482,8 @@ wie Session- und State-Managment, Commands etc.

-
+ +
@@ -35690,7 +35800,7 @@
- + @@ -35711,7 +35821,8 @@ - + + @@ -38063,7 +38174,7 @@ - + @@ -38076,7 +38187,8 @@ Visitor ist entweder void, oder bool

-
+ +
@@ -38086,7 +38198,7 @@ - + @@ -38107,7 +38219,8 @@ - + + @@ -38202,7 +38315,7 @@ - + @@ -38233,7 +38346,8 @@ Denn letzteres ist bei uns eine Grundannahme. Es gibt keine ungefähren Diffs!

-
+ +
@@ -41240,7 +41354,7 @@ - + @@ -41256,14 +41370,15 @@ Ganz prominent fehlt hier also z.B: MIDI

-
+ +
- + @@ -41276,7 +41391,8 @@ die Aufgrund von Klassifikationen automatisch bereits existieren

-
+ +
@@ -42162,7 +42278,7 @@ - + @@ -42172,7 +42288,8 @@ ...also abzüglich Dekoration und Margin

-
+ +
@@ -42181,7 +42298,7 @@ - + @@ -42194,7 +42311,8 @@ sofern das Widget mit entsprechendem Modus eingefügt wurde

-
+ +
@@ -42227,7 +42345,7 @@ - + @@ -42240,7 +42358,8 @@ context->add_class("ohMy");

-
+ + @@ -42319,7 +42438,7 @@ - + @@ -42335,7 +42454,8 @@ oder ist es eine Vererbungs-Hierarchie, wie sie für das CSS-Styling benötigt wird?

-
+ +
@@ -42356,7 +42476,7 @@ - + @@ -42380,7 +42500,8 @@ - + + @@ -42839,7 +42960,7 @@ - + @@ -42852,9 +42973,10 @@ aber macht in etwa die gleichen Operationen

-
+ +
- + @@ -42873,7 +42995,8 @@ Gtk-Main verwendet inzwischen den gleichen Mechanismus

-
+ +
@@ -43158,7 +43281,7 @@
- + @@ -43171,7 +43294,8 @@ ggfs. neu gemapped und invalidiert wird, woraufhin es neu gezeichnet wird

-
+ +
@@ -43203,7 +43327,7 @@ - + @@ -43216,7 +43340,8 @@ Siehe Beschreibung im Beispiel/Tutorial

-
+ +
@@ -43225,7 +43350,7 @@
- + @@ -43238,7 +43363,8 @@ Im Besonderen kann man sich an Signale anderer Widgets anhängen

-
+ + @@ -43611,7 +43737,7 @@ - + @@ -43627,7 +43753,8 @@ und auch ein Signal für Parse-Fehler anschließt

-
+ +
@@ -43654,7 +43781,7 @@ - + @@ -43672,7 +43799,8 @@ Beachte: der Text-Cursor (Marker "insert") hat right gravity

-
+ +
@@ -43747,7 +43875,7 @@ - + @@ -43769,7 +43897,8 @@ The grip is implemented as a GdlDockItemGrip

-
+ +
@@ -43850,7 +43979,7 @@

- + @@ -43860,9 +43989,10 @@ kann eines der Templates im Zyklus vorrübergehend als "incomplete" gelten.

-
+ +
- + @@ -43884,7 +44014,8 @@ Konsequenz: man wählt dann z.B. eine subtil falsche Spezialisierung.

-
+ +
@@ -43910,7 +44041,7 @@ - + @@ -43938,13 +44069,14 @@ selber aus einem statischen Initialisierungs-Kontext heraus erfolgt.

-
+ +
- + @@ -44140,7 +44272,8 @@   }

-
+ +
@@ -44382,7 +44515,7 @@ - + @@ -44407,9 +44540,10 @@ Query<RES>::resolveBy

-
+ +
- + @@ -44444,14 +44578,15 @@ sonst kommt Doxygen durcheinander

-
+ +
- + @@ -44473,7 +44608,8 @@ wird hier kein Link erzeugt

-
+ +
@@ -44489,7 +44625,7 @@ - + @@ -44505,7 +44641,8 @@ Die Icon-Größen ergeben sich aus den Boxes auf 'plate'

-
+ +
@@ -44520,7 +44657,7 @@ - + @@ -44530,7 +44667,8 @@ ...im Besonderen die guten Diagramme für Pulse, ALSA und Jack

-
+ +
@@ -44655,7 +44793,7 @@
- + @@ -44678,10 +44816,11 @@ "-Wl,-rpath-link=target/modules"

-
+ +
- + @@ -44691,14 +44830,15 @@ laufen wieder alle

-
+ + - + @@ -44708,7 +44848,8 @@ test.sh Zeile 138

-
+ +
@@ -44752,7 +44893,7 @@ - + @@ -44762,12 +44903,13 @@ und wir verbringen unsere Zeit mit contention

-
+ +
- + @@ -44777,7 +44919,8 @@ ist klar, hab ich gebrochen

-
+ + @@ -44793,7 +44936,7 @@ - + @@ -44806,7 +44949,8 @@ Vorher hatte ich erste Kollisionen nach 25000 Nummern

-
+ +
@@ -44845,7 +44989,7 @@
- + @@ -44858,7 +45002,8 @@ Aug 10 04:51:39 flaucher kernel: traps: test-suite[8249] trap int3 ip:7ffff7deb241 sp:7fffffffe5c8 error:0

-
+ + @@ -44915,7 +45060,7 @@ - + @@ -44925,7 +45070,8 @@ bison dejagnu flex gobjc libncurses5-dev libreadline-dev liblzma-dev libbabeltrace-dev libbabeltrace-ctf-dev python3-dev

-
+ +
@@ -44941,7 +45087,7 @@ - + @@ -44975,7 +45121,8 @@ au weia LEUTE!

-
+ +
@@ -44999,7 +45146,7 @@
- + @@ -45015,10 +45162,11 @@ und tatsächlich: das ist daneben, GCC hat Recht!

-
+ +
- + @@ -45028,7 +45176,8 @@ aktualisieren und neu bauen

-
+ +
@@ -45048,7 +45197,7 @@ - + @@ -45058,7 +45207,8 @@ wähle Kompatibiltät genau so, daß Ubuntu-Trusty noch unterstützt wird.

-
+ + @@ -45238,7 +45388,7 @@ - + @@ -45251,9 +45401,10 @@ Ich meine also: zu Beginn vom Build sollte das Buildsystem einmal eine Infozeile ausgeben

-
+ +
- + @@ -45263,7 +45414,8 @@ ...denn die stören jeweils beim erzeugen eines Hotfix/Patch im Paketbau per dpkg --commit

-
+ +
@@ -45697,7 +45849,7 @@ - + @@ -45713,7 +45865,8 @@ bestehen, aber irgendwann müssen wir das schon glattziehen

-
+ +
@@ -45751,7 +45904,7 @@ - + @@ -45761,7 +45914,8 @@ seit gcc-4.8 ist kein static_assert mehr in der STDlib

-
+ +
@@ -45804,7 +45958,7 @@ - + @@ -45850,7 +46004,8 @@ END

-
+ +