From d953d4e6af1e39473bee30e83e7f1a5c83c71df9 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Mon, 15 Apr 2013 03:07:15 +0200 Subject: [PATCH] Library: convenience function to take addresses just a wrapper based on 5749a621 While implementing this, also simplified the way a const iterator can be defined for taking addresses --- src/lib/iter-adapter-stl.hpp | 14 ++++++++++++++ src/lib/iter-adapter.hpp | 17 ++++++++--------- tests/library/iter-adapter-test.cpp | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/lib/iter-adapter-stl.hpp b/src/lib/iter-adapter-stl.hpp index f974892ec..0e7a93a8e 100644 --- a/src/lib/iter-adapter-stl.hpp +++ b/src/lib/iter-adapter-stl.hpp @@ -263,6 +263,7 @@ namespace iter_stl { typedef typename SEQ::iterator Iter; typedef RangeIter Range; typedef DistinctIter DistinctVals; + typedef AddressExposingIter Addrs; }; template @@ -271,6 +272,7 @@ namespace iter_stl { typedef typename SEQ::const_iterator Iter; typedef RangeIter Range; typedef DistinctIter DistinctVals; + typedef AddressExposingIter Addrs; }; }//(End) traits/helpers @@ -290,6 +292,18 @@ namespace iter_stl { } + /** @return Lumiera Forward Iterator + * exposing the address of each Element within a STL + */ + template + inline typename _SeqT::Addrs + eachAddress (CON& coll) + { + typedef typename _SeqT::Addrs Addresses; + return Addresses (eachElm (coll)); + } + + /** @return Lumiera Forward Iterator to yield * each key of a map/multimap */ diff --git a/src/lib/iter-adapter.hpp b/src/lib/iter-adapter.hpp index 34e069f77..0177eab3c 100644 --- a/src/lib/iter-adapter.hpp +++ b/src/lib/iter-adapter.hpp @@ -527,8 +527,6 @@ namespace lib { typedef CON Container; typedef TY ElemType; - typedef typename RemovePtr::Type ValueType; - template struct SimilarIter ///< rebind to a similarly structured Iterator with value type T2 { @@ -706,15 +704,11 @@ namespace lib { class AddressExposingIter : public lib::BoolCheckable > { - public: - typedef typename IT::value_type ** pointer; - typedef typename IT::value_type *& reference; - typedef typename IT::value_type * value_type; + typedef typename IT::pointer _Ptr; - private: IT i_; ///< nested source iterator - mutable value_type currPtr_; + mutable _Ptr currPtr_; void @@ -728,6 +722,11 @@ namespace lib { public: + typedef typename IT::pointer const* pointer; + typedef typename IT::pointer const& reference; + typedef typename IT::pointer const value_type; + + /** AddressExposingIter is always created * by wrapping an existing iterator. */ @@ -755,7 +754,7 @@ namespace lib { return currPtr_; } - pointer + _Ptr operator->() const { return currPtr_; diff --git a/tests/library/iter-adapter-test.cpp b/tests/library/iter-adapter-test.cpp index ac5ede2a7..82b67f614 100644 --- a/tests/library/iter-adapter-test.cpp +++ b/tests/library/iter-adapter-test.cpp @@ -341,7 +341,7 @@ namespace test{ // since we're exposing the pointer as value, the solution is to add // the const on the immediately wrapped iterator type typedef vector::const_iterator ConstRawIter; - typedef ConstIter ConstRange; + typedef RangeIter ConstRange; typedef AddressExposingIter ConstAddrIter; ConstAddrIter iic(ConstRange(Range(numbz.begin(), numbz.end())));