Invocation: pave a way for more generic processing via ''type-sequence''
Tuples and the ''C++ tuple protocol'' build upon variadic arguments and are thus rather tedious to handle, especially in this situation here, where the argument can ''sometimes be a tuple...'' Several years ago I made the observation that processing by explicit ''type sequences'' (Loki-style) is much simpler to handle and easier to lift to a generic level of processing. Thus I'll attempt now to extract the ''iteration and extraction part'' of the logic into a new helper. `lib::meta::ElmTypes<TUP>` allows to process all ''tuple-like types'' and generic ''type sequences'' uniformely and enables to use both styles interchangably (btw, it is quite common to ''abuse'' `std::tuple` as a type sequence). With this helper, we can now - build a ''type sequence'' from any ''tuple-like'' object (and vice-versa) - re-bind (i.e. transfer the template parameters to another template) - apply some wrapper - create AND / OR evaluations over the types
This commit is contained in:
parent
cf4bc380b0
commit
844aa7f3d7
6 changed files with 489 additions and 102 deletions
|
|
@ -232,6 +232,8 @@ namespace meta {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ==== Rebinding Variadic Arguments ==== **/
|
||||
|
||||
/**
|
||||
|
|
@ -258,7 +260,101 @@ namespace meta {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ==== Build and Rebuild variadic type sequences ==== **/
|
||||
|
||||
/**
|
||||
* Variadic type sequence builder.
|
||||
* This metaprogramming helper template provides an unified view
|
||||
* to handle _»tuple-like« types and variadic _type sequences._
|
||||
* - the constant #SIZ gives the number of elements
|
||||
* - the nested type #Idx can be used as _index sequence_
|
||||
* - #Seq is a _variadic type sequence_ with the extracted types
|
||||
* - #Tup is a std::tuple over these types
|
||||
* - the nested template #Apply wraps each type into another template
|
||||
* - #Rebind likewise instantiates another template with the element types
|
||||
* - #AndAll applies a predicate and combines the result with _logical and_
|
||||
* - #OrAll similarly evaluates _logical or_ on the application results
|
||||
*/
|
||||
template<class X, typename =void>
|
||||
struct ElmTypes
|
||||
{
|
||||
static constexpr size_t SIZ = 1;
|
||||
using Idx = std::index_sequence<SIZ>;
|
||||
using Seq = TySeq<X>;
|
||||
using Tup = std::tuple<X>;
|
||||
|
||||
template<template<class> class META>
|
||||
using Apply = TySeq<META<X>>;
|
||||
template<template<typename...> class O>
|
||||
using Rebind = O<X>;
|
||||
template<template<class> class PRED>
|
||||
using AndAll = std::__and_<PRED<X>>;
|
||||
template<template<class> class PRED>
|
||||
using OrAll = std::__or_<PRED<X>>;
|
||||
};
|
||||
|
||||
/** Partial specialisation to handle type sequences */
|
||||
template<typename...TYPES>
|
||||
struct ElmTypes<TySeq<TYPES...>>
|
||||
{
|
||||
static constexpr size_t SIZ = sizeof...(TYPES);
|
||||
using Idx = std::make_index_sequence<SIZ>;
|
||||
using Seq = TySeq<TYPES...>;
|
||||
using Tup = std::tuple<TYPES...>;
|
||||
|
||||
template<template<class> class META>
|
||||
using Apply = TySeq<META<TYPES>...>;
|
||||
|
||||
template<template<typename...> class O>
|
||||
using Rebind = typename lib::meta::RebindVariadic<O, Seq>::Type;
|
||||
|
||||
template<template<class> class PRED>
|
||||
using AndAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__and_>;
|
||||
|
||||
template<template<class> class PRED>
|
||||
using OrAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__or_>;
|
||||
};
|
||||
|
||||
/** partial specialisation to handle types
|
||||
* supporting the C++ »tuple protocol«
|
||||
*/
|
||||
template<class TUP>
|
||||
struct ElmTypes<TUP, enable_if_TupleProtocol<TUP>>
|
||||
{
|
||||
template<typename>
|
||||
struct Extract;
|
||||
template<size_t...idx>
|
||||
struct Extract<std::index_sequence<idx...>>
|
||||
{
|
||||
using ElmTypes = TySeq<typename std::tuple_element<idx,TUP>::type ...>;
|
||||
};
|
||||
|
||||
static constexpr size_t SIZ = std::tuple_size<TUP>::value;
|
||||
|
||||
using Idx = std::make_index_sequence<SIZ>;
|
||||
using Seq = typename Extract<Idx>::ElmTypes;
|
||||
using Tup = typename RebindVariadic<std::tuple, Seq>::Type;
|
||||
|
||||
template<template<class> class META>
|
||||
using Apply = typename ElmTypes<Seq>::template Apply<META>;
|
||||
|
||||
template<template<typename...> class O>
|
||||
using Rebind = typename RebindVariadic<O, Seq>::Type;
|
||||
|
||||
template<template<class> class PRED>
|
||||
using AndAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__and_>;
|
||||
|
||||
template<template<class> class PRED>
|
||||
using OrAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__or_>;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ==== Invoke with index from variadic ==== **/
|
||||
|
||||
/** helper to invoke a functor, passing instances of std::integral_constant
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ namespace engine {
|
|||
|
||||
|
||||
|
||||
|
||||
template<class TUP, template<class> class COND>
|
||||
struct isAllElements
|
||||
{
|
||||
|
|
@ -173,8 +174,6 @@ namespace engine {
|
|||
template<class X, typename SEL = void>
|
||||
struct StructType
|
||||
{
|
||||
// static lib::test::TypeDebugger<X> kacki;
|
||||
|
||||
using Seq = TySeq<X>;
|
||||
using Tup = std::tuple<X>;
|
||||
};
|
||||
|
|
@ -182,8 +181,6 @@ namespace engine {
|
|||
template<class TUP>
|
||||
struct StructType<TUP, enable_if<is_Structured<TUP>> >
|
||||
{
|
||||
// static lib::test::TypeDebugger<TUP> drecky;
|
||||
|
||||
template<typename>
|
||||
struct AllZ;
|
||||
template<size_t...idx>
|
||||
|
|
|
|||
|
|
@ -671,6 +671,11 @@ return: 0
|
|||
END
|
||||
|
||||
|
||||
TEST "variadic type manipulations" VariadicHelper_test <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "variadic argument manipulation" VariadicArgumentPicker_test <<END
|
||||
out: 4╎N<1>──.─┼N<2>──.─┼N<3>──.─┼N<3>──.─┤
|
||||
out: 4╎N<0>──.─┼N<1>──.─┼N<2>──.─┼N<3>──.─┤
|
||||
|
|
|
|||
|
|
@ -27,12 +27,13 @@
|
|||
#include "steam/engine/buffhandle-attach.hpp"
|
||||
//#include "lib/format-cout.hpp"
|
||||
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
|
||||
//#include "lib/util.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
|
||||
//using std::string;
|
||||
using std::tuple;/////////////TODO
|
||||
using std::array;
|
||||
using util::isSameAdr;
|
||||
|
||||
|
||||
namespace steam {
|
||||
|
|
@ -78,22 +79,42 @@ namespace test {
|
|||
// some random numbers to test...
|
||||
long r1 = rani(100);
|
||||
|
||||
// Type setup to build a suitable FeedManifold
|
||||
// Prepare setup to build a suitable FeedManifold
|
||||
using Buffer = long;
|
||||
/////////////////////////////////////////////////////////////////////////////////TODO
|
||||
using T1 = tuple<int,double>;
|
||||
using T2 = array<int*,3>;
|
||||
using T3 = int;
|
||||
using T4 = int*;
|
||||
using T5 = lib::HeteroData<int*>;
|
||||
using T5 = lib::HeteroData<int*,long,double*>;
|
||||
/////////////////////////////////////////////////////////////////////////////////TODO
|
||||
using lib::meta::ElmTypes;
|
||||
using S1 = ElmTypes<T5>;
|
||||
SHOW_TYPE(S1)
|
||||
SHOW_TYPE(S1::Seq)
|
||||
SHOW_TYPE(S1::Tup)
|
||||
SHOW_TYPE(S1::Idx)
|
||||
using S1A = S1::Apply<is_Buffer>;
|
||||
SHOW_TYPE(S1A)
|
||||
using S1AR = ElmTypes<S1A>::Rebind<std::__and_>;
|
||||
SHOW_TYPE(S1AR)
|
||||
SHOW_EXPR(S1AR::value)
|
||||
using S1AA = S1::AndAll<is_Buffer>;
|
||||
SHOW_TYPE(S1AA)
|
||||
SHOW_EXPR(bool(S1AA()))
|
||||
using S1OA = S1::OrAll<is_Buffer>;
|
||||
SHOW_TYPE(S1OA)
|
||||
SHOW_EXPR(S1OA::value)
|
||||
|
||||
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
|
||||
|
||||
// Example-1: a FeedManifold to adapt a simple generator function
|
||||
using M1 = FeedManifold<decltype(fun_singleOut)>;
|
||||
CHECK (not M1::hasInput());
|
||||
CHECK (not M1::hasParam());
|
||||
// instantiate...
|
||||
M1 m1{fun_singleOut};
|
||||
CHECK (1 == m1.outBuff.array().size());
|
||||
SHOW_EXPR(m1.outArgs)
|
||||
CHECK (nullptr == m1.outArgs );
|
||||
// CHECK (m1.inArgs ); // does not compile because storage field is not provided
|
||||
// CHECK (m1.param );
|
||||
|
|
@ -103,19 +124,31 @@ SHOW_EXPR(m1.outArgs)
|
|||
CHECK (buff.isValid());
|
||||
CHECK (buff.accessAs<long>() == -55);
|
||||
|
||||
m1.outBuff.createAt (0, buff);
|
||||
m1.outBuff.createAt (0, buff); // plant a copy of the BuffHandle into the output slot
|
||||
CHECK (m1.outBuff[0].isValid());
|
||||
CHECK (m1.outBuff[0].accessAs<long>() == -55);
|
||||
|
||||
SHOW_TYPE(M1::ArgI)
|
||||
SHOW_TYPE(M1::TupI)
|
||||
SHOW_TYPE(M1::ArgO)
|
||||
SHOW_TYPE(M1::TupO)
|
||||
m1.connect();
|
||||
SHOW_EXPR(m1.outArgs)
|
||||
SHOW_EXPR(m1.outBuff[0])
|
||||
SHOW_EXPR(util::showAdr(*buff))
|
||||
SHOW_EXPR(util::showAdr(*m1.outBuff[0]))
|
||||
m1.connect(); // instruct the manifold to connect buffers to arguments
|
||||
CHECK (isSameAdr (m1.outArgs, *buff));
|
||||
CHECK (*m1.outArgs == -55);
|
||||
|
||||
m1.invoke(); // invoke the adapted processing function (fun_singleOut)
|
||||
CHECK (buff.accessAs<long>() == r1); // result: the random number r1 was written into the buffer.
|
||||
|
||||
// Example-2: adapt a function to process input -> output buffer
|
||||
auto fun_singleInOut = [](Buffer* in, Buffer* out) { *out = *in; };
|
||||
using M2 = FeedManifold<decltype(fun_singleInOut)>;
|
||||
CHECK ( M2::hasInput());///////////////////////////TODO broken due to overly convoluted logic!!!!
|
||||
CHECK (not M2::hasParam());
|
||||
CHECK (1 == M2::FAN_I);
|
||||
CHECK (1 == M2::FAN_O);
|
||||
// instantiate...
|
||||
M2 m2{fun_singleInOut};
|
||||
// CHECK (1 == m2.inBuff.array().size()); ///////////TODO : need to »lift« plain types for simplfied logic!!!!
|
||||
CHECK (1 == m2.outBuff.array().size());
|
||||
// CHECK (nullptr == m2.inArgs );
|
||||
CHECK (nullptr == m2.outArgs );
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
169
tests/library/meta/variadic-helper-test.cpp
Normal file
169
tests/library/meta/variadic-helper-test.cpp
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
VariadicHelper(Test) - verify helpers for transforming variadics and tuple-like types
|
||||
|
||||
Copyright (C)
|
||||
2024, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
**Lumiera** is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version. See the file COPYING for further details.
|
||||
|
||||
* *****************************************************************/
|
||||
|
||||
|
||||
/** @file variadic-helper-test.cpp
|
||||
** THe unit test \ref VariadicHelper_test demonstrates the usage of metaprogramming
|
||||
** helpers to handle _tuple-like_ types and type sequences in a uniform way.
|
||||
** @see variadic-helper.hpp
|
||||
** @see tuple-helper.hpp
|
||||
** @see feed-manifold.hpp real-world usage scenario
|
||||
**
|
||||
*/
|
||||
|
||||
|
||||
#include "lib/test/run.hpp"
|
||||
#include "lib/test/test-helper.hpp"
|
||||
#include "lib/meta/variadic-helper.hpp"
|
||||
#include "lib/hetero-data.hpp"
|
||||
#include "lib/test/diagnostic-output.hpp"////////////TODO
|
||||
|
||||
#include <tuple>
|
||||
#include <array>
|
||||
|
||||
using lib::test::showType;
|
||||
using std::array;
|
||||
using std::tuple;
|
||||
|
||||
|
||||
namespace lib {
|
||||
namespace meta {
|
||||
namespace test {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************//**
|
||||
* @test Cover some advanced metaprogramming helpers to support working
|
||||
* with _tuple like_ types together with simple types.
|
||||
*/
|
||||
class VariadicHelper_test : public Test
|
||||
{
|
||||
virtual void
|
||||
run (Arg)
|
||||
{
|
||||
rebuild_variadic();
|
||||
}
|
||||
|
||||
|
||||
/** @test demonstrate uniform handling of...
|
||||
* - simple types,
|
||||
* - _tuple-like_ types (usable for structured binding)
|
||||
* - _generic type sequences_
|
||||
*/
|
||||
void
|
||||
rebuild_variadic()
|
||||
{
|
||||
// CASE-1 : a tuple....
|
||||
using T1 = tuple<int,double>;
|
||||
|
||||
using S1 = ElmTypes<T1>;
|
||||
CHECK (2 == S1::SIZ);
|
||||
CHECK (showType< S1 >() == "ElmTypes<tuple<int, double>, void>"_expect);
|
||||
CHECK (showType< S1::Seq >() == "TySeq<int, double>"_expect);
|
||||
CHECK (showType< S1::Tup >() == "tuple<int, double>"_expect);
|
||||
CHECK (showType< S1::Idx >() == "integer_sequence<ulong, 0ul, 1ul>"_expect);
|
||||
|
||||
using S1A = S1::Apply<std::is_pointer>;
|
||||
CHECK (showType< S1A >() == "TySeq<is_pointer<int>, is_pointer<double> >"_expect);
|
||||
|
||||
using S1AR = ElmTypes<S1A>::Rebind<std::__and_>;
|
||||
CHECK (showType< S1AR >() == "__and_<is_pointer<int>, is_pointer<double> >"_expect);
|
||||
CHECK (false == S1AR::value);
|
||||
|
||||
using S1AA = S1::AndAll<std::is_pointer>;
|
||||
CHECK (showType< S1AA >() == "__and_<is_pointer<int>, is_pointer<double> >"_expect);
|
||||
CHECK (false == S1AA::value);
|
||||
|
||||
using S1OA = S1::OrAll<std::is_pointer>;
|
||||
CHECK (showType< S1OA >() == "__or_<is_pointer<int>, is_pointer<double> >"_expect);
|
||||
CHECK (false == S1OA::value);
|
||||
|
||||
|
||||
|
||||
// CASE-0 : handling an unstructured simple type....
|
||||
using T0 = int*;
|
||||
|
||||
using S0 = ElmTypes<T0>;
|
||||
CHECK (1 == S0::SIZ);
|
||||
CHECK (showType< S0 >() == "ElmTypes<int*, void>"_expect);
|
||||
CHECK (showType< S0::Seq >() == "TySeq<int*>"_expect);
|
||||
CHECK (showType< S0::Tup >() == "tuple<int*>"_expect);
|
||||
CHECK (showType< S0::Idx >() == "integer_sequence<ulong, 1ul>"_expect);
|
||||
|
||||
using S0A = S0::Apply<std::is_pointer>;
|
||||
CHECK (showType< S0A >() == "TySeq<is_pointer<int*> >"_expect);
|
||||
|
||||
using S0AA = S0::AndAll<std::is_pointer>;
|
||||
CHECK (showType< S0AA >() == "__and_<is_pointer<int*> >"_expect);
|
||||
CHECK (true == S0AA::value);
|
||||
|
||||
using S0OA = S0::OrAll<std::is_pointer>;
|
||||
CHECK (showType< S0OA >() == "__or_<is_pointer<int*> >"_expect);
|
||||
CHECK (true == S0OA::value);
|
||||
|
||||
|
||||
|
||||
// CASE-2 : can also handle a std::array....
|
||||
using T2 = array<int*,3>;
|
||||
|
||||
using S2 = ElmTypes<T2>;
|
||||
CHECK (3 == S2::SIZ);
|
||||
CHECK (showType< S2 >() == "ElmTypes<array<int*, 3ul>, void>"_expect);
|
||||
CHECK (showType< S2::Seq >() == "TySeq<int*, int*, int*>"_expect);
|
||||
CHECK (showType< S2::Tup >() == "tuple<int*, int*, int*>"_expect);
|
||||
CHECK (showType< S2::Idx >() == "integer_sequence<ulong, 0ul, 1ul, 2ul>"_expect);
|
||||
|
||||
using S2A = S2::Apply<std::is_pointer>;
|
||||
CHECK (showType< S2A >() == "TySeq<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
|
||||
|
||||
using S2AA = S2::AndAll<std::is_pointer>;
|
||||
CHECK (showType< S2AA >() == "__and_<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
|
||||
CHECK (true == S2AA::value);
|
||||
|
||||
using S2OA = S2::OrAll<std::is_pointer>;
|
||||
CHECK (showType< S2OA >() == "__or_<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
|
||||
CHECK (true == S2OA::value);
|
||||
|
||||
|
||||
|
||||
// CASE-3 : a custom type which implements the C++ »tuple protocol«....
|
||||
using T3 = lib::HeteroData<int*,long,double*>;
|
||||
|
||||
using S3 = ElmTypes<T3>;
|
||||
CHECK (3 == S3::SIZ);
|
||||
CHECK (showType< S3 >() == "ElmTypes<HeteroData<int*, long, double*>, void>"_expect);
|
||||
CHECK (showType< S3::Seq >() == "TySeq<int*, long, double*>"_expect);
|
||||
CHECK (showType< S3::Idx >() == "integer_sequence<ulong, 0ul, 1ul, 2ul>"_expect);
|
||||
|
||||
using S3A = S3::Apply<std::is_pointer>;
|
||||
CHECK (showType< S3A >() == "TySeq<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
|
||||
|
||||
using S3AA = S3::AndAll<std::is_pointer>;
|
||||
CHECK (showType< S3AA >() == "__and_<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
|
||||
CHECK (false == S3AA::value);
|
||||
|
||||
using S3OA = S3::OrAll<std::is_pointer>;
|
||||
CHECK (showType< S3OA >() == "__or_<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
|
||||
CHECK (true == S3OA::value);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** Register this test class... */
|
||||
LAUNCHER (VariadicHelper_test, "unit meta");
|
||||
|
||||
|
||||
|
||||
}}} // namespace lib::meta::test
|
||||
|
|
@ -24795,9 +24795,7 @@
|
|||
<node CREATED="1675383853090" ID="ID_1092222582" MODIFIED="1675383860604" TEXT="wird direkt zum Zeichnen verwendet"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675383862097" ID="ID_93556948" MODIFIED="1679085432286" TEXT="TODO: wächst derzeit monoton">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...es sollte an geeigneter Stelle einen Reset geben, da jeder DisplayEvalutaionPass grundsätzlich das ganze Layout sauber ausrechnen kann
|
||||
|
|
@ -25486,9 +25484,7 @@
|
|||
</node>
|
||||
<node CREATED="1540511389686" ID="ID_1017315025" MODIFIED="1576282358074" TEXT="Anker-Widgets explizit übergeben">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
|
|
@ -25944,9 +25940,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1575063986126" FOLDED="true" ID="ID_237283777" MODIFIED="1582930967369" TEXT="konkretisiert: als ViewHook-Mechanismus">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das ist zunächst ein Versuch, ein mühsam errungenes Design zu verifizieren...
|
||||
|
|
@ -26800,9 +26794,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1676045162558" ID="ID_1938495472" LINK="#ID_1978068021" MODIFIED="1676046631665" TEXT="brauche Ausdehnng des Widgets">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und zwar die konkret wirksame Ausdehnung ⟹ meiner Analyse zufolge ist das get_width|height()
|
||||
|
|
@ -27666,9 +27658,7 @@
|
|||
</node>
|
||||
<node CREATED="1678028693313" ID="ID_1210494901" MODIFIED="1678028703577">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<font face="Monospaced" size="2">TrackHeadWidget::accommodateOverallHeight(uint overallHeight)</font>
|
||||
|
|
@ -27803,9 +27793,7 @@
|
|||
<node COLOR="#435e98" CREATED="1678054437780" ID="ID_289152885" MODIFIED="1678054518905" TEXT="brauche eine scharfe Gehrung ("miter")">
|
||||
<node CREATED="1678054454505" ID="ID_829025847" MODIFIED="1678054489675" TEXT="miter_limit auf 20 hochsetzen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...der default ist 10, und das erzeugt eine Gehrung nur bis ca 20°
|
||||
|
|
@ -29573,9 +29561,7 @@
|
|||
<node CREATED="1561150569779" FOLDED="true" ID="ID_1587537475" MODIFIED="1561827482929" TEXT="ich will aber den Standardfall irgendwie erhalten">
|
||||
<node CREATED="1561150585582" ID="ID_791249238" MODIFIED="1561150668295" TEXT="und sei es bloß zur Dokumentation">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
d.h. ich will den Standardfall als Standardfall sichtbar haben,
|
||||
|
|
@ -32037,9 +32023,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Core-Entwickler von GTK
|
||||
|
|
@ -34579,9 +34563,7 @@
|
|||
<linktarget COLOR="#4b557b" DESTINATION="ID_1090402146" ENDARROW="Default" ENDINCLINATION="-1035;0;" ID="Arrow_ID_1722473168" SOURCE="ID_634897151" STARTARROW="None" STARTINCLINATION="-385;32;"/>
|
||||
<node CREATED="1661696072514" ID="ID_1764427475" MODIFIED="1661696199675" TEXT="Verwaltung der pop-Up-Menü(s)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das ist ein übergreifendes Thema zum UI-Verhalten
|
||||
|
|
@ -34686,9 +34668,7 @@
|
|||
</node>
|
||||
<node CREATED="1611954396933" ID="ID_1771085068" MODIFIED="1611954498300" TEXT="Alternative wäre: Datencontainer per Pointer anhängen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
diese Alternative würde dann attraktiv, wenn es häufig vorkommt, daß zwischen einem Clip-Widget und einer anderen Repräsentation des ClipDelegate dynamisch hin- und hergeschaltet werden muß. Weil man dann den relativ schwergewichtigen Datencontainer einfach umhängen könnte
|
||||
|
|
@ -35948,9 +35928,7 @@
|
|||
</node>
|
||||
<node CREATED="1544241590705" ID="ID_1914479382" MODIFIED="1557498707232">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
demnach würde startup sauber beendet,
|
||||
|
|
@ -36762,9 +36740,7 @@
|
|||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1539134201394" ID="ID_1071210666" MODIFIED="1576282358025" TEXT="UI-Komponente realisiert sich selbst">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
|
|
@ -37271,9 +37247,7 @@
|
|||
</node>
|
||||
<node CREATED="1614545319978" ID="ID_819484059" MODIFIED="1614546053325" TEXT="Lösung-2: Drag-Geste manipuliert nur die Pixel/Canvas-Koordinaten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das heißt, durch die Drag-Geste entstehen vorübergehend lokal inkonsistente Koordinaten; der nächste DisplayEvaluation-Pass würde dies wieder beseitigen. Dieser Ansatz wäre rein logisch der konsistentere Weg, denn erst durch eine Rückmeldung von der Session wird eine neue Position auch offiziell. Allerdings müßte man bei diesem Ansatz vorsichtig vorgehen, und mögliche Interferenzen mit der DisplayEvaluation und dem Layout-Managment bedenken; besonders wenn man eine weite Strecke zurücklegt, könnte es passieren, daß der Clip dann plötzlich aus der Anzeige verschwindet und den Fokus verliert, weil eine DisplayEvaluation ihn wieder an seine gegenwärtig nominelle Position geschoben hat.
|
||||
|
|
@ -37503,9 +37477,7 @@
|
|||
<icon BUILTIN="hourglass"/>
|
||||
<node COLOR="#338800" CREATED="1616684903452" ID="ID_1953335093" MODIFIED="1679362063109">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
1.Schritt: <i>irgendwie implementieren</i>
|
||||
|
|
@ -55972,8 +55944,7 @@
|
|||
soll sowohl einfache Tyen, alsauch »<b>strukturierte Typen</b>« (tuple-like) akzeptieren
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -56001,8 +55972,7 @@
|
|||
deshalb ist es sinnvoll, einen λ-closed Code-Block <i>für jeden Index zu instantiieren</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734473468024" HGAP="41" ID="ID_1159486680" MODIFIED="1734473478720" TEXT="definiert in variadic-helper.cpp">
|
||||
|
|
@ -56017,17 +55987,32 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734474134102" FOLDED="true" ID="ID_1942900317" MODIFIED="1734474336372" TEXT="Hilfsmittel für Tuple-Protocol">
|
||||
<node CREATED="1734474134102" ID="ID_1942900317" MODIFIED="1734496125500" TEXT="Hilfsmittel für Tuple-Protocol">
|
||||
<node COLOR="#435e98" CREATED="1734474149788" ID="ID_1392132639" MODIFIED="1734474304945" TEXT="is_Structured">
|
||||
<arrowlink COLOR="#65a0c8" DESTINATION="ID_1962318483" ENDARROW="Default" ENDINCLINATION="-561;59;" ID="Arrow_ID_1253919416" STARTARROW="None" STARTINCLINATION="4095;820;"/>
|
||||
<node CREATED="1734474272972" HGAP="45" ID="ID_752241989" MODIFIED="1734474297902" TEXT="erkennt ob ein Typ std::tuple_size<T> unterstützt" VSHIFT="2">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
<node CREATED="1734474272972" HGAP="45" ID="ID_764776222" MODIFIED="1734496311742" VSHIFT="2">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<font face="Monospaced" size="2" color="#948484">lib::meta::</font><font face="Monospaced" size="2" color="#5c3528"><b>enable_if_TupleProtocol</b></font><font face="Monospaced" size="2" color="#948484"><</font><font face="Monospaced" size="2" color="#9a0f0f">TY</font><font face="Monospaced" size="2" color="#948484">></font>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<font NAME="SansSerif" SIZE="11"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1734474159266" ID="ID_458414563" LINK="#ID_1710377001" MODIFIED="1734474304945" TEXT="StructType">
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1734495942965" ID="ID_1890096800" MODIFIED="1734496349526" TEXT="ElmTypes">
|
||||
<arrowlink COLOR="#458adc" DESTINATION="ID_894985782" ENDARROW="Default" ENDINCLINATION="-2245;0;" ID="Arrow_ID_1598804519" STARTARROW="None" STARTINCLINATION="5222;1394;"/>
|
||||
<node CREATED="1734474272972" HGAP="45" ID="ID_1114931809" MODIFIED="1734474326928" TEXT="»hebt« einen einfachen Typ in ein Tupel" VSHIFT="2">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
<node CREATED="1734474272972" HGAP="45" ID="ID_1913456215" MODIFIED="1734496204882" TEXT="erlaubt uniforme Iteration und Prädikat-Anwendung" VSHIFT="-9">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1697906135803" ID="ID_47415467" MODIFIED="1697927623614" TEXT="Function utils">
|
||||
|
|
@ -88658,8 +88643,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
will sagen ... das ist nicht das Problem; der Compiler macht hier eine verwirrende Transformation, die den Typ eines Funktionspointers mit Template-Argumenten instaniiert. Leider hat das aber zur Folge, daß man das eigentliche Problem nicht sieht (selbst wenn man endlos drauf starrt...)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#802361" CREATED="1734390724212" HGAP="25" ID="ID_1829336783" MODIFIED="1734390924760" TEXT="(ja das tatsächliche Problem wäre hier versteckt gewesen)" VSHIFT="-15">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -88751,8 +88735,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
void (*(std::_Placeholder<1>, int))(void*, <b><font color="#e00219">int&&</font></b>)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734378652331" ID="ID_804249162" MODIFIED="1734378687327" TEXT="≠">
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
|
|
@ -88765,8 +88748,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
(void (*)(void*, int&&)) (std::_Placeholder<1>, <b><font color="#a90404">int</font></b>)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1734380583440" ID="ID_944972328" MODIFIED="1734386726726" TEXT="Nein! das ist es nicht">
|
||||
|
|
@ -88865,8 +88847,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734381356576" ID="ID_217508249" MODIFIED="1734386742771" TEXT="...und die gebundene Funktion wurde aber für RValues instantiiert">
|
||||
<linktarget COLOR="#fde3e9" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="464;20;" ID="Arrow_ID_891244985" SOURCE="ID_944972328" STARTARROW="None" STARTINCLINATION="-86;10;"/>
|
||||
<linktarget COLOR="#f7dffd" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="420;13;" ID="Arrow_ID_1048587640" SOURCE="ID_1829336783" STARTARROW="None" STARTINCLINATION="171;10;"/>
|
||||
<linktarget COLOR="#fde3e9" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="464;20;" ID="Arrow_ID_891244985" SOURCE="ID_944972328" STARTARROW="None" STARTINCLINATION="-86;10;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1734385977834" ID="ID_1426672931" MODIFIED="1734385991397" TEXT="Das ist wohl ein inhärentes Problem">
|
||||
|
|
@ -91862,7 +91844,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734300344699" ID="ID_660526050" MODIFIED="1734300363029" TEXT="strukturierte Typen in einem zweiten Schritt hinzufügen"/>
|
||||
<node CREATED="1734300344699" ID="ID_660526050" MODIFIED="1734300363029" TEXT="strukturierte Typen in einem zweiten Schritt hinzufügen">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734483863501" ID="ID_1884890390" MODIFIED="1734484068908" TEXT="sollte nochmal restukturieren....">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...wenn möglich alles auf strukturierte Typen <i>heben</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<linktarget COLOR="#c8022e" DESTINATION="ID_1884890390" ENDARROW="Default" ENDINCLINATION="-1263;97;" ID="Arrow_ID_232119446" SOURCE="ID_1086476352" STARTARROW="None" STARTINCLINATION="-517;-18;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#236883" CREATED="1734496443007" ID="ID_1580496045" LINK="#ID_1734731182" MODIFIED="1734496487271" TEXT="generisches Verarbeitungs-Schema: ElmTypes<TUP>">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734458417453" ID="ID_1458239434" MODIFIED="1734458430809" TEXT="struktuierte Argumente korrekt klassifizieren">
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734458433484" ID="ID_569916262" MODIFIED="1734458448795" TEXT="Frage: wie umgehen mit leeren Strukturen?">
|
||||
|
|
@ -91878,8 +91877,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
man könnte nun sagen: <i>det sollen se halt nit machen!</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1734458587984" ID="ID_402660303" MODIFIED="1734458899210" TEXT="sekundäre Schwierigkeit: wir klassifizieren die Use-Cases anhand der »Art« eines Arguments">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -91895,8 +91893,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Beispielsweise in der aktuellen Logik prüfen wir ob der 1.Slot ein »Valu« ist, was dann bei einer leeren Struct dazu führen würde, diese als ein leeres Param-Tupel zu behandeln. Kommt dann darauf an, ob das tatsächlich einen Schaden im Code anrichtet, oder auch <i>leer durchläuft.</i> Denn an sich sollte es ja egal sein, sofern dann nur dieser Slot auch tatsächlich keine Behandlung bekommt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734458906909" ID="ID_53372671" MODIFIED="1734458916675" TEXT="später nochmal beurteilen">
|
||||
|
|
@ -92045,7 +92042,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node COLOR="#435e98" CREATED="1734214260094" ID="ID_1731140529" MODIFIED="1734397828794" TEXT="muß die Storage neu bestimmen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#435e98" CREATED="1734214271580" ID="ID_1045815708" MODIFIED="1734397811621" TEXT="Nochmal über die Rolle der FeedManifold nachdenken">
|
||||
<node COLOR="#435e98" CREATED="1734214271580" FOLDED="true" ID="ID_1045815708" MODIFIED="1734397811621" TEXT="Nochmal über die Rolle der FeedManifold nachdenken">
|
||||
<linktarget COLOR="#2e2c57" DESTINATION="ID_1045815708" ENDARROW="Default" ENDINCLINATION="-98;-400;" ID="Arrow_ID_639104343" SOURCE="ID_525858909" STARTARROW="None" STARTINCLINATION="-367;14;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734214319422" ID="ID_405803529" MODIFIED="1734214333944" TEXT="sie ist und bleibt die dynamische Invocation-Storage"/>
|
||||
|
|
@ -92067,7 +92064,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1734214838441" ID="ID_1382984783" MODIFIED="1734214854714" TEXT="könnte durch das WeavingPattern gesteuert werden"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734221531913" ID="ID_403160908" MODIFIED="1734221552785" TEXT="verschmelzen mit dem InvocationAdapter">
|
||||
<node CREATED="1734221531913" ID="ID_403160908" MODIFIED="1734483823864" TEXT="verschmelzen mit dem InvocationAdapter">
|
||||
<arrowlink COLOR="#858c9d" DESTINATION="ID_152918477" ENDARROW="Default" ENDINCLINATION="23;-56;" ID="Arrow_ID_1086373449" STARTARROW="None" STARTINCLINATION="-45;3;"/>
|
||||
<node CREATED="1734221555701" ID="ID_1326995703" MODIFIED="1734224314109" TEXT="im Grund war sie das doch schon immer">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -92111,7 +92109,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#435e98" CREATED="1734226154995" ID="ID_1824135693" MODIFIED="1734397838296" TEXT="Konsequenzen">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1734226167432" ID="ID_152918477" MODIFIED="1734226177431" TEXT="FeedManifold ist der InvocationAdapter"/>
|
||||
<node CREATED="1734226167432" ID="ID_152918477" MODIFIED="1734483815750" TEXT="FeedManifold ist der InvocationAdapter">
|
||||
<linktarget COLOR="#858c9d" DESTINATION="ID_152918477" ENDARROW="Default" ENDINCLINATION="23;-56;" ID="Arrow_ID_1086373449" SOURCE="ID_403160908" STARTARROW="None" STARTINCLINATION="-45;3;"/>
|
||||
</node>
|
||||
<node CREATED="1734226179091" ID="ID_656635473" MODIFIED="1734226192693" TEXT="Parametrisiert wird mit dem konkreten Funktor"/>
|
||||
<node CREATED="1734226218750" ID="ID_1815522792" MODIFIED="1734226239453" TEXT="daraus muß sich FeedManifold komplett selbst konfigurieren"/>
|
||||
<node CREATED="1734226245002" ID="ID_1729798414" MODIFIED="1734226264004" TEXT="so wie praktisch bereits implementiert — per Traits-Template"/>
|
||||
|
|
@ -92122,8 +92122,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734226596427" ID="ID_1730595360" MODIFIED="1734397856015" TEXT="Struktur neu aufbauen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734226295084" ID="ID_43554059" MODIFIED="1734397850135" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1734226295084" ID="ID_43554059" MODIFIED="1734483723539" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1734226447447" ID="ID_1121321956" MODIFIED="1734226473215" TEXT="Param-Storage (optional)"/>
|
||||
<node CREATED="1734226474754" ID="ID_334989563" MODIFIED="1734226483630" TEXT="Input-Storage (optional)"/>
|
||||
<node CREATED="1734226485049" ID="ID_1102989908" MODIFIED="1734226491735" TEXT="Output-Storage (mandatory)"/>
|
||||
|
|
@ -92199,8 +92199,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<arrowlink COLOR="#16a2aa" DESTINATION="ID_1710382999" ENDARROW="Default" ENDINCLINATION="539;-32;" ID="Arrow_ID_129574515" STARTARROW="None" STARTINCLINATION="183;11;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1734286523651" ID="ID_132315841" MODIFIED="1734286531775" TEXT="Fall-Unterscheidungen für die Storage einführen"/>
|
||||
<node CREATED="1734286560983" ID="ID_431464065" MODIFIED="1734300414607" TEXT="auf die flexible Funktor-Signatur schwenken"/>
|
||||
<node COLOR="#338800" CREATED="1734286523651" ID="ID_132315841" MODIFIED="1734480723031" TEXT="Fall-Unterscheidungen für die Storage einführen">
|
||||
<linktarget COLOR="#75a8d1" DESTINATION="ID_132315841" ENDARROW="Default" ENDINCLINATION="532;28;" ID="Arrow_ID_791254362" SOURCE="ID_718171059" STARTARROW="None" STARTINCLINATION="115;5;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734286560983" ID="ID_431464065" MODIFIED="1734480210827" TEXT="auf die flexible Funktor-Signatur schwenken">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734300380799" ID="ID_782708625" MODIFIED="1734300402299" TEXT="dann die Erweiterung auf strukturierte Typen dazunehmen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -92222,6 +92227,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734398371276" ID="ID_1513818427" MODIFIED="1734474043348" TEXT="brauche forEach(IndexTuple)">
|
||||
<linktarget COLOR="#4ab2e5" DESTINATION="ID_1513818427" ENDARROW="Default" ENDINCLINATION="-120;11;" ID="Arrow_ID_668892948" SOURCE="ID_81517996" STARTARROW="None" STARTINCLINATION="-103;-9;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734399341087" ID="ID_763559603" MODIFIED="1734399361894" TEXT="sollte aber auch für frei stehenden Einzeltyp funktionieren"/>
|
||||
<node COLOR="#5b280f" CREATED="1734399363642" ID="ID_535610409" MODIFIED="1734471924041" TEXT="Verwende das gute alte InstantiateWithIndex aus generator.hpp">
|
||||
|
|
@ -92234,7 +92240,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734399930258" ID="ID_552320825" MODIFIED="1734471981106" TEXT="oder doch nur einen Index-Generator ⟶ λ">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734471983248" ID="ID_180764617" MODIFIED="1734472002527" TEXT="geht das überhaupt mit einem Lambda?">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#3d1981" CREATED="1734471983248" ID="ID_180764617" MODIFIED="1734475355476" TEXT="geht das überhaupt mit einem Lambda?">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node COLOR="#5b280f" CREATED="1734472004853" ID="ID_1548338453" MODIFIED="1734472034734" TEXT="im Body wird der Index als constexpr gebraucht">
|
||||
|
|
@ -92255,13 +92261,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Hut ab für den Poster auf Stackoverflow: der hat diese Möglichkeit gesehen und ist dann nur an ein paar Kleinigkeiten gescheitert.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1734472285111" ID="ID_576227286" MODIFIED="1734473972771" TEXT="in generischen Library-Helper einbauen">
|
||||
<node COLOR="#338800" CREATED="1734472285111" FOLDED="true" ID="ID_576227286" MODIFIED="1734473972771" TEXT="in generischen Library-Helper einbauen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734472314563" ID="ID_878985358" MODIFIED="1734472355171" TEXT="weil — muß hier Komplexität verbergen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -92286,8 +92291,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
...denn diese Mechanik ist im Grunde komplett unabhängig von Tuples (oder auch sonstigen Strukturen)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1734472482636" ID="ID_1888534617" MODIFIED="1734472501560" TEXT="könnte sogar in meta/utils">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
|
|
@ -92326,16 +92330,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1734473996312" ID="ID_970193220" MODIFIED="1734474093813" TEXT="zusammen mit einem Access-Helper ⟹ Basis-Funktionalität bereitgestellt">
|
||||
<linktarget COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="7;120;" ID="Arrow_ID_633874673" SOURCE="ID_971023481" STARTARROW="None" STARTINCLINATION="30;-94;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734403556414" ID="ID_971023481" MODIFIED="1734474109401" TEXT="muß dazu den Einzelfall-Typ auf einen structured-Type »heben«">
|
||||
<arrowlink COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="7;120;" ID="Arrow_ID_633874673" STARTARROW="None" STARTINCLINATION="30;-94;"/>
|
||||
<node COLOR="#338800" CREATED="1734403583091" ID="ID_1710377001" MODIFIED="1734474118087" TEXT="StructType<TY>">
|
||||
<node CREATED="1734403556414" ID="ID_971023481" MODIFIED="1734480652825" TEXT="muß dazu den Einzelfall-Typ auf einen structured-Type »heben«">
|
||||
<arrowlink COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="149;9;" ID="Arrow_ID_633874673" STARTARROW="None" STARTINCLINATION="60;3;"/>
|
||||
<node COLOR="#338800" CREATED="1734403583091" ID="ID_1710377001" MODIFIED="1734484112886" TEXT="StructType<TY>">
|
||||
<linktarget COLOR="#5583b2" DESTINATION="ID_1710377001" ENDARROW="Default" ENDINCLINATION="113;86;" ID="Arrow_ID_1043919586" SOURCE="ID_1533580969" STARTARROW="None" STARTINCLINATION="103;6;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1734403595048" ID="ID_496079267" MODIFIED="1734450365546" TEXT="spricht falsch an im Compile">
|
||||
<node COLOR="#435e98" CREATED="1734403595048" FOLDED="true" ID="ID_496079267" MODIFIED="1734450365546" TEXT="spricht falsch an im Compile">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734403634332" ID="ID_817342705" MODIFIED="1734451117928" TEXT="funktioniert enable_if<is_Structured<long*> > korrekt?"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734450087903" ID="ID_1588306692" MODIFIED="1734450379412" TEXT="is_Structured war naiv implementiert">
|
||||
|
|
@ -92365,8 +92366,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
MetaUtils_test::detect_tupleProtocol()
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -92377,6 +92377,93 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734480338809" ID="ID_1051007990" MODIFIED="1734480347674" TEXT="connect-Funktion umstellen">
|
||||
<node CREATED="1734480363094" ID="ID_81517996" MODIFIED="1734480413909" TEXT="gemischte Iteration über Tupel und Array">
|
||||
<arrowlink COLOR="#4ab2e5" DESTINATION="ID_1513818427" ENDARROW="Default" ENDINCLINATION="-120;11;" ID="Arrow_ID_668892948" STARTARROW="None" STARTINCLINATION="-103;-9;"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1734473996312" ID="ID_970193220" MODIFIED="1734480654577" TEXT="Iteration »heben« ⟹ immer auf Tupel arbeiten">
|
||||
<linktarget COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="149;9;" ID="Arrow_ID_633874673" SOURCE="ID_971023481" STARTARROW="None" STARTINCLINATION="60;3;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1734480514238" ID="ID_718171059" MODIFIED="1734480740846" TEXT="verwende Access-Helper für den Zugriff auf die Argument-Storage">
|
||||
<arrowlink COLOR="#75a8d1" DESTINATION="ID_132315841" ENDARROW="Default" ENDINCLINATION="532;28;" ID="Arrow_ID_791254362" STARTARROW="None" STARTINCLINATION="115;5;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1734480540142" ID="ID_323630818" MODIFIED="1734480558479" TEXT="⟹ Basis-Funktionalität bereitgestellt"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734480964996" ID="ID_806319334" MODIFIED="1734480977083" TEXT="schrittweise auf komplexere Signaturen erweitern">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734483925269" ID="ID_1086476352" MODIFIED="1734484068908" TEXT="möglichst Fallunterscheidungen durch »Heben« vermeiden">
|
||||
<arrowlink COLOR="#c8022e" DESTINATION="ID_1884890390" ENDARROW="Default" ENDINCLINATION="-1263;97;" ID="Arrow_ID_232119446" STARTARROW="None" STARTINCLINATION="-517;-18;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1734483987277" ID="ID_1841429759" MODIFIED="1734483994879" TEXT="wir haben zu viele Einzelfälle"/>
|
||||
<node CREATED="1734483996540" ID="ID_249201624" MODIFIED="1734484013365" TEXT="es besteht die Gefahr, Typ-Struktur und Nutzen zu vermischen"/>
|
||||
<node CREATED="1734484014897" ID="ID_1533580969" MODIFIED="1734484112886" TEXT="Idee: alles per Iteration über StructType<T>">
|
||||
<arrowlink COLOR="#5583b2" DESTINATION="ID_1710377001" ENDARROW="Default" ENDINCLINATION="113;86;" ID="Arrow_ID_1043919586" STARTARROW="None" STARTINCLINATION="103;6;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734484966366" ID="ID_1734731182" MODIFIED="1734496372644" TEXT="Hilfsmittel zur Iteration über Element-Typen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1734484982190" ID="ID_1667690583" MODIFIED="1734485007124">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>das</i> ist doch der Teil der immer so mühsam ist....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1734495414985" ID="ID_210402667" MODIFIED="1734495431237" TEXT="könnte man analog zu meinen Index-Sequenz-Buildern aufbauen"/>
|
||||
<node CREATED="1734495432991" ID="ID_1441320520" MODIFIED="1734495457547" TEXT="es braucht nur ein einziges nested-Pattern-Matching-Template">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1734495460136" ID="ID_1374426569" MODIFIED="1734495479732" TEXT="das ist leider unvermeidbar für Variadics"/>
|
||||
<node CREATED="1734495480968" ID="ID_12372584" MODIFIED="1734495491299" TEXT="aber damit haben wir eine Type-Sequenz"/>
|
||||
<node CREATED="1734495499566" ID="ID_149362953" MODIFIED="1734495533643" TEXT="⟹ von dort kreuzweise in eine andere Template-Spezialisierung einsteigen"/>
|
||||
</node>
|
||||
<node CREATED="1734495536169" ID="ID_1864980172" MODIFIED="1734495551427" TEXT="kann nun sogar Apply und Rebind mit einbinden"/>
|
||||
<node CREATED="1734495552679" ID="ID_1393017492" MODIFIED="1734495574582" TEXT="HA! die UND- und ODER- Verknüpfung läßt sich durch Rebind und Apply ausdrücken">
|
||||
<node CREATED="1734495683581" ID="ID_824689493" MODIFIED="1734495691665" TEXT="happy happy we">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734495723336" HGAP="3" ID="ID_894985782" MODIFIED="1734496349526" STYLE="bubble" VSHIFT="32">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<u>extrahiert</u>:  <font face="Monospaced" color="#3220a2"><b>ElmTypes</b></font><font face="Monospaced" color="#a18383"><</font><font face="Monospaced" color="#992525">X</font><font face="Monospaced" color="#a18383">></font>  in variadic-helper.hpp
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<linktarget COLOR="#458adc" DESTINATION="ID_894985782" ENDARROW="Default" ENDINCLINATION="-2245;0;" ID="Arrow_ID_1598804519" SOURCE="ID_1890096800" STARTARROW="None" STARTINCLINATION="5222;1394;"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1734495808108" ID="ID_1573254062" MODIFIED="1734495987215" TEXT="Verwendung...">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1734495828614" ID="ID_602278483" MODIFIED="1734495977610" TEXT="ElmTypes<TUP>::SIZ"/>
|
||||
<node CREATED="1734495816942" ID="ID_1179885121" MODIFIED="1734495977610" TEXT="ElmTypes<TUP>::Seq"/>
|
||||
<node CREATED="1734495852862" ID="ID_119541829" MODIFIED="1734495977611" TEXT="ElmTypes<TUP>::AndAll<std::is_pointer>"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c2caad" COLOR="#338800" CREATED="1734495887994" ID="ID_176307315" MODIFIED="1734496076740" TEXT="VariadicHelper_test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1734495900248" ID="ID_1290090407" MODIFIED="1734496001035" STYLE="fork" TEXT="alle wichtigen Fälle durchspielen">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1734495909199" ID="ID_1348331645" MODIFIED="1734496001034" STYLE="fork" TEXT="demonstrieren mit _expect - Strings">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1734495909199" ID="ID_577064924" MODIFIED="1734496053357" STYLE="fork" TEXT="∧ bzw. ∨ mit interessanten Misch-Fällen">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734496383891" ID="ID_352066932" MODIFIED="1734496422850" TEXT="damit sollte hoffentlich das _ProcFun-Traits-Template wesentlich einfacher werden....">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133400400" ID="ID_1364724277" MODIFIED="1734141875620" TEXT="zusätzlichen Funktor für die Parameter akzeptieren">
|
||||
|
|
|
|||
Loading…
Reference in a new issue