From fbda9baeb3f308ccd94abf22535ee87f4f8fa030 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Wed, 25 Mar 2026 23:51:32 +0100 Subject: [PATCH] Library: streamline value-type bindings - use uniform naming scheme - extract type-binding from RangeIter into a trait-template - use the C++20 iterator concept and trait to detect a STL iterator --- src/lib/index-iter.hpp | 4 +- src/lib/iter-adapter.hpp | 66 ++++++++++++++++++++++------- src/lib/iter-explorer.hpp | 15 ++++--- src/lib/meta/trait.hpp | 28 ++++++------ src/lib/meta/value-type-binding.hpp | 14 +++--- src/lib/several.hpp | 4 +- 6 files changed, 84 insertions(+), 47 deletions(-) diff --git a/src/lib/index-iter.hpp b/src/lib/index-iter.hpp index b8bb7915f..be709bff2 100644 --- a/src/lib/index-iter.hpp +++ b/src/lib/index-iter.hpp @@ -50,8 +50,8 @@ namespace lib { using ResVal = decltype(data_->operator[](0)); - using value_type = meta::RefTraits::Value; - using reference = meta::RefTraits::Reference; + using value_type = meta::RefTraits::value_type; + using reference = meta::RefTraits::reference; bool checkPoint() const diff --git a/src/lib/iter-adapter.hpp b/src/lib/iter-adapter.hpp index 573410457..286204cc7 100644 --- a/src/lib/iter-adapter.hpp +++ b/src/lib/iter-adapter.hpp @@ -120,6 +120,9 @@ namespace util { // see lib/util.hpp namespace lib { + using std::is_pointer_v; + using std::remove_pointer_t; + using std::remove_reference_t; namespace { // internal helpers inline void @@ -149,6 +152,13 @@ namespace lib { namespace iter { + using meta::is_StateCore; + using meta::can_IterForEach; + using meta::can_STL_ForEach; + using meta::ValueTypeBinding; + using meta::RefTraits; + + /** type binding helper: an iterato's actual result type */ template using Yield = decltype(std::declval().operator*()); @@ -157,6 +167,34 @@ namespace lib { template using CoreYield = decltype(std::declval().yield()); + + template + concept legacy_traits_marked = requires + { + typename std::iterator_traits::value_type; + }; + + template + concept stl_iter = std::input_iterator or legacy_traits_marked; + + + /** Iterator-Traits: definitions to level the difference between + * Lumiera-Iterators and the STL usage of ranges / iterators. + */ + template + struct Trait + { + static constexpr bool is_LumieraIter = can_IterForEach::value; + static constexpr bool is_STLIter = stl_iter; + +// static_assert(is_LumieraIter or is_STLIter); + + using _ValTrait = std::conditional_t + , RefTraits>>; + using value_type = _ValTrait::value_type; + using reference = _ValTrait::reference; + using pointer = _ValTrait::pointer; + }; } @@ -302,7 +340,7 @@ namespace lib { protected: - using ConRef = meta::RefTraits::Reference; + using ConRef = meta::RefTraits::reference; /** allow derived classes to access backing container */ ConRef source() { return source_; } @@ -376,9 +414,9 @@ namespace lib { ST core_; public: - using value_type = meta::RefTraits::Value; - using reference = meta::RefTraits::Reference; - using pointer = meta::RefTraits::Pointer; + using value_type = meta::RefTraits::value_type; + using reference = meta::RefTraits::reference; + using pointer = meta::RefTraits::pointer; IterStateWrapper (ST&& initialState) : core_(std::forward(initialState)) @@ -500,7 +538,7 @@ namespace lib { class IterStateCore : public IT { - static_assert (lib::meta::can_IterForEach::value + static_assert (iter::can_IterForEach::value ,"Lumiera Iterator required as source"); protected: IT& @@ -545,7 +583,7 @@ namespace lib { class CheckedCore : public COR { - static_assert (lib::meta::is_StateCore::value + static_assert (iter::is_StateCore::value ,"Adapted type must expose a »state core« API"); protected: COR& @@ -694,9 +732,9 @@ namespace lib { public: using YieldRes = iter::CoreYield; - using value_type = meta::RefTraits::Value; - using reference = meta::RefTraits::Reference; - using pointer = meta::RefTraits::Pointer; + using value_type = meta::RefTraits::value_type; + using reference = meta::RefTraits::reference; + using pointer = meta::RefTraits::pointer; /** by default, pass anything down for initialisation of the core. @@ -805,16 +843,12 @@ namespace lib { IT p_; IT e_; - static constexpr bool _is_LumieraIter = meta::can_IterForEach::value; - using _ValTrait = std::conditional_t<_is_LumieraIter, meta::ValueTypeBinding - , meta::ValueTypeBinding>>; - public: - using pointer = _ValTrait::pointer; - using reference = _ValTrait::reference; + using pointer = iter::Trait::pointer; + using reference = iter::Trait::reference; /// @note special twist, since a STL const_iterator would yield a non-const `value_type` - using value_type = std::remove_reference::type; + using value_type = std::remove_reference_t; RangeIter (IT const& start, IT const& end) diff --git a/src/lib/iter-explorer.hpp b/src/lib/iter-explorer.hpp index ba50bb54c..a65893595 100644 --- a/src/lib/iter-explorer.hpp +++ b/src/lib/iter-explorer.hpp @@ -274,7 +274,7 @@ namespace lib { struct _DecoratorTraits>> { using SrcRaw = lib::meta::Strip::Type; - using SrcVal = meta::RefTraits>::Value; + using SrcVal = meta::RefTraits>::value_type; using SrcIter = lib::IterableDecorator>; }; @@ -478,7 +478,7 @@ namespace lib { struct _ReduceTraits { using Result = iter_explorer::_FunTraits::Res; - using ResVal = lib::meta::RefTraits::Value; + using ResVal = lib::meta::RefTraits::value_type; }; @@ -1038,9 +1038,9 @@ namespace lib { Aggregator aggregate_; public: - using value_type = meta::RefTraits::Value; - using reference = meta::RefTraits::Reference; - using pointer = meta::RefTraits::Pointer; + using value_type = meta::RefTraits::value_type; + using reference = meta::RefTraits::reference; + using pointer = meta::RefTraits::pointer; GroupAggregator() =default; // inherited default copy operations @@ -1698,6 +1698,9 @@ namespace lib { } + auto + flatten(); + /** adapt this IterExplorer to pipe each result value through a transformation function. * Several "layers" of mapping can be piled on top of each other, possibly mixed with the * other types of adaptation, like the child-expanding operation, or a filter. Obviously, @@ -1760,7 +1763,7 @@ namespace lib { static_assert (meta::is_BinaryFun()); using ArgType1 = _Fun::Args::List::Head; - using Aggregate = meta::RefTraits::Value; + using Aggregate = meta::RefTraits::value_type; using ResCore = iter_explorer::GroupAggregator; using ResIter = _DecoratorTraits::SrcIter; diff --git a/src/lib/meta/trait.hpp b/src/lib/meta/trait.hpp index b4ef8b71a..239cdfd60 100644 --- a/src/lib/meta/trait.hpp +++ b/src/lib/meta/trait.hpp @@ -258,33 +258,33 @@ namespace meta { template struct RefTraits { - typedef TY Value; - typedef TY* Pointer; - typedef TY& Reference; + typedef TY value_type; + typedef TY& reference; + typedef TY* pointer; }; template struct RefTraits { - typedef TY* Value; - typedef TY** Pointer; - typedef TY*& Reference; + typedef TY* value_type; + typedef TY*& reference; + typedef TY** pointer; }; template struct RefTraits { - typedef TY Value; - typedef TY* Pointer; - typedef TY& Reference; + typedef TY value_type; + typedef TY& reference; + typedef TY* pointer; }; template struct RefTraits { - typedef TY Value; - typedef TY* Pointer; - typedef TY& Reference; + typedef TY value_type; + typedef TY& reference; + typedef TY* pointer; }; @@ -327,8 +327,8 @@ namespace meta { /** verify the first (special) type can stand-in for the second */ template struct can_StandIn - : std::is_convertible::Reference - ,typename RefTraits::Reference + : std::is_convertible::reference + ,typename RefTraits::reference > { }; diff --git a/src/lib/meta/value-type-binding.hpp b/src/lib/meta/value-type-binding.hpp index c816db729..04b1d6101 100644 --- a/src/lib/meta/value-type-binding.hpp +++ b/src/lib/meta/value-type-binding.hpp @@ -107,16 +107,16 @@ namespace meta { template struct ValueTypeBinding { - using value_type = RefTraits::Value; - using reference = RefTraits::Reference; - using pointer = RefTraits::Pointer; + using value_type = RefTraits::value_type; + using reference = RefTraits::reference; + using pointer = RefTraits::pointer; }; /** specialisation for classes providing STL style type binding definitions */ template struct ValueTypeBinding> > { - using _SrcType = RefTraits::Value; + using _SrcType = RefTraits::value_type; using value_type = _SrcType::value_type; using reference = _SrcType::reference; @@ -159,9 +159,9 @@ namespace meta { >; using ResType = _ValRef; - using value_type = RefTraits::Value; - using reference = RefTraits::Reference; - using pointer = RefTraits::Pointer; + using value_type = RefTraits::value_type; + using reference = RefTraits::reference; + using pointer = RefTraits::pointer; }; diff --git a/src/lib/several.hpp b/src/lib/several.hpp index b6767c71c..6ffb285d3 100644 --- a/src/lib/several.hpp +++ b/src/lib/several.hpp @@ -231,8 +231,8 @@ namespace lib { friend auto begin (Several const& svl) { return svl.begin();} friend auto end (Several const& svl) { return svl.end(); } - using value_type = meta::RefTraits::Value; - using reference = meta::RefTraits::Reference; + using value_type = meta::RefTraits::value_type; + using reference = meta::RefTraits::reference; using const_reference = value_type const&;