diff --git a/src/lib/several-builder.hpp b/src/lib/several-builder.hpp index dc96d2c86..8634322f9 100644 --- a/src/lib/several-builder.hpp +++ b/src/lib/several-builder.hpp @@ -44,17 +44,19 @@ #include "lib/several.hpp" -#include "include/logging.h" +#include "lib/iter-explorer.hpp" +#include "lib/util.hpp" #include #include -using std::vector; -using std::move; namespace lib { + using std::vector; + using std::forward; + using std::move; namespace {// Allocation managment policies @@ -73,20 +75,77 @@ namespace lib { : Several , POL { - + using Col = Several; + + size_t storageSiz_{0}; + public: + SeveralBuilder() = default; + + /** start Several build using a custom allocator */ + template>> + SeveralBuilder (ARGS&& ...alloInit) + : Several{} + , POL{forward (alloInit)...} + { } + + + SeveralBuilder&& + reserve (size_t cntElm) + { + adjustStorage (cntElm, sizeof(I)); + return move(*this); + } + + template + SeveralBuilder&& + appendAll (IT&& data) + { + explore(data).foreach ([this](auto it){ emplaceElm(it); }); + return move(*this); + } + Several build() { return move (*this); } + + private: + void + adjustStorage (size_t cnt, size_t spread) + { + UNIMPLEMENTED ("allocation"); + } + + template + void + emplaceElm (IT& dataSrc) + { + using Val = typename IT::value_type; + size_t elmSiz = sizeof(Val); + adjustStorage (Col::size_+1, requiredSpread(elmSiz)); + UNIMPLEMENTED ("emplace data"); + } + + size_t + requiredSpread (size_t elmSiz) + { + size_t currSpread = Col::empty()? 0 : Col::data_->spread; + return util::max (currSpread, elmSiz); + } }; + + + template SeveralBuilder makeSeveral (std::initializer_list ili) { - UNIMPLEMENTED ("start building a Several-Container"); + return SeveralBuilder{} + .reserve (ili.size()) + .appendAll (ili); } diff --git a/src/lib/several.hpp b/src/lib/several.hpp index 364a032e9..4fe505e50 100644 --- a/src/lib/several.hpp +++ b/src/lib/several.hpp @@ -45,7 +45,8 @@ namespace lib { namespace {// Storage implementation details - struct Bucket + template + struct ArrayBucket { union Manager { @@ -58,17 +59,13 @@ namespace lib { Manager manager; size_t spread; - template - auto access(); - }; - - template - struct ArrayBucket - : Bucket - { + /** mark start of the storage area */ alignas(I) - std::byte storage[bytes]; + std::byte storage[sizeof(I)]; + /** perform unchecked access into the storage area + * @note typically reaching behind the nominal end of this object + */ I& subscript (size_t idx) { @@ -79,16 +76,6 @@ namespace lib { } }; - - /** @internal perform an unsafe down-cast to access the storage area */ - template - auto - Bucket::access() - { - using Storage = ArrayBucket; - return static_cast (*this); - } - }//(End)implementation details @@ -105,8 +92,10 @@ namespace lib { : util::MoveAssign { protected: - size_t size_{0}; - Bucket* data_{nullptr}; + using Bucket = ArrayBucket*; + + size_t size_{0}; + Bucket data_{nullptr}; public: @@ -126,7 +115,7 @@ namespace lib { operator[] (size_t idx) { REQUIRE (data_); - return data_->access().subscript (idx); + return data_->subscript (idx); } I& front() { return operator[] (size_-1); } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 5426aa3f5..22589bb90 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -81843,19 +81843,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - - - - - - + - + + - + @@ -81867,15 +81861,30 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
-
+
+ + + + + + + + + + + + + + +