diff --git a/applications/test/IndirectList/Test-IndirectList.C b/applications/test/IndirectList/Test-IndirectList.C index 64ac880e0ba77df20ec5686f3a287cdcd6a5e45a..25b95990fb90be8f8be91191d6519ec7673ae455 100644 --- a/applications/test/IndirectList/Test-IndirectList.C +++ b/applications/test/IndirectList/Test-IndirectList.C @@ -41,6 +41,13 @@ void printInfo(const ListType& lst) << "addr: " << flatOutput(lst.addressing()) << nl << "list: " << flatOutput(lst) << nl << endl; + + Info<<"for-range :"; + for (const auto& val : lst) + { + Info<< " " << val; + } + Info<< nl; } diff --git a/src/OpenFOAM/containers/Lists/IndirectList/IndirectList.H b/src/OpenFOAM/containers/Lists/IndirectList/IndirectList.H index 1422a03674e0e6c04308c90743f5d38f7c81fe12..042c2044d961ebb301dc2266443dae5f4606d9e4 100644 --- a/src/OpenFOAM/containers/Lists/IndirectList/IndirectList.H +++ b/src/OpenFOAM/containers/Lists/IndirectList/IndirectList.H @@ -61,10 +61,10 @@ class IndirectListAddressing // Private Member Functions - //- Disallow default bitwise copy construct + //- Disallow copy construct IndirectListAddressing(const IndirectListAddressing&) = delete; - //- Disallow default bitwise assignment + //- Disallow copy assignment void operator=(const IndirectListAddressing&) = delete; @@ -72,10 +72,10 @@ protected: // Constructors - //- Construct by copying the addressing array + //- Copy construct from addressing array explicit inline IndirectListAddressing(const labelUList& addr); - //- Construct by transferring addressing array + //- Move construct from addressing array explicit inline IndirectListAddressing(List<label>&& addr); @@ -105,10 +105,10 @@ class IndirectList { // Private Member Functions - //- Disallow default assignment operator + //- Disallow copy construct void operator=(const IndirectList<T>&) = delete; - //- Disallow assignment from UIndirectList + //- Disallow copy assignment void operator=(const UIndirectList<T>&) = delete; @@ -116,25 +116,18 @@ public: // Constructors - //- Construct given the complete list and the addressing array - inline IndirectList - ( - const UList<T>& completeList, - const labelUList& addr - ); + //- Copy construct addressing, shallow copy values list reference. + inline IndirectList(const UList<T>& values, const labelUList& addr); - //- Construct given the complete list and by transferring addressing - inline IndirectList - ( - const UList<T>& completeList, - List<label>&& addr - ); + //- Move construct addressing, shallow copy values list reference. + inline IndirectList(const UList<T>& values, List<label>&& addr); - //- Copy constructor - inline IndirectList(const IndirectList<T>& lst); + //- Copy construct addressing, shallow copy values list reference. + inline IndirectList(const IndirectList<T>& list); - //- Construct from UIndirectList - explicit inline IndirectList(const UIndirectList<T>& lst); + //- Copy construct addressing, shallow copy values list reference + //- from UIndirectList + explicit inline IndirectList(const UIndirectList<T>& list); // Member Functions @@ -142,7 +135,7 @@ public: //- Return the list addressing using UIndirectList<T>::addressing; - //- Reset addressing + //- Reset the list addressing using IndirectListAddressing::resetAddressing; diff --git a/src/OpenFOAM/containers/Lists/IndirectList/IndirectListI.H b/src/OpenFOAM/containers/Lists/IndirectList/IndirectListI.H index 27eb6ced04ef9712d11f61e414a679c322259a66..a4961b79135a4d31e45c663b59168a7ca75d7d46 100644 --- a/src/OpenFOAM/containers/Lists/IndirectList/IndirectListI.H +++ b/src/OpenFOAM/containers/Lists/IndirectList/IndirectListI.H @@ -46,14 +46,14 @@ inline Foam::IndirectListAddressing::IndirectListAddressing template<class T> inline Foam::IndirectList<T>::IndirectList ( - const UList<T>& completeList, + const UList<T>& values, const labelUList& addr ) : IndirectListAddressing(addr), UIndirectList<T> ( - completeList, + values, IndirectListAddressing::addressing() ) {} @@ -62,14 +62,14 @@ inline Foam::IndirectList<T>::IndirectList template<class T> inline Foam::IndirectList<T>::IndirectList ( - const UList<T>& completeList, + const UList<T>& values, List<label>&& addr ) : IndirectListAddressing(std::move(addr)), UIndirectList<T> ( - completeList, + values, IndirectListAddressing::addressing() ) {} @@ -78,13 +78,13 @@ inline Foam::IndirectList<T>::IndirectList template<class T> inline Foam::IndirectList<T>::IndirectList ( - const IndirectList<T>& lst + const IndirectList<T>& list ) : - IndirectListAddressing(lst.addressing()), + IndirectListAddressing(list.addressing()), // Copy addressing UIndirectList<T> ( - lst.completeList(), + list.completeList(), IndirectListAddressing::addressing() ) {} @@ -93,13 +93,13 @@ inline Foam::IndirectList<T>::IndirectList template<class T> inline Foam::IndirectList<T>::IndirectList ( - const UIndirectList<T>& lst + const UIndirectList<T>& list ) : - IndirectListAddressing(lst.addressing()), + IndirectListAddressing(list.addressing()), // Copy addressing UIndirectList<T> ( - lst.completeList(), + list.completeList(), IndirectListAddressing::addressing() ) {} diff --git a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.C b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.C index 931e93efb11bd8023eb3f8b9c147321599d42b32..68eb14802408c979a43d2bc51de75f15dbdb9259 100644 --- a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.C +++ b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -34,14 +34,14 @@ inline Foam::label Foam::UIndirectList<T>::find { if (start >= 0) { - List_CONST_ACCESS(T, completeList_, lst); + List_CONST_ACCESS(T, values_, vals); List_CONST_ACCESS(label, addressing_, addr); const label len = addressing_.size(); for (label i = start; i < len; ++i) { - if (lst[addr[i]] == val) + if (vals[addr[i]] == val) { return i; } @@ -59,7 +59,7 @@ inline Foam::label Foam::UIndirectList<T>::rfind const label pos ) const { - List_CONST_ACCESS(T, completeList_, lst); + List_CONST_ACCESS(T, values_, vals); List_CONST_ACCESS(label, addressing_, addr); for @@ -74,7 +74,7 @@ inline Foam::label Foam::UIndirectList<T>::rfind --i ) { - if (lst[addr[i]] == val) + if (vals[addr[i]] == val) { return i; } diff --git a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.H b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.H index 2fb26f4a36a0866b6a76ce9f7ab4100c353a8613..e8e0f30c385dbd99d694be709f1c7b803248b60f 100644 --- a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.H +++ b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectList.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -29,7 +29,7 @@ Description Like IndirectList but does not store addressing. - Note the const_cast of the completeList. This is so we can use it both + Note the const_cast of the list values. This is so we can use it both on const and non-const lists. Alternative would be to have a const_ variant etc. @@ -48,7 +48,7 @@ SourceFiles namespace Foam { -// Forward declaration of friend functions and operators +// Forward declarations template<class T> class UIndirectList; template<class T> Ostream& operator<<(Ostream&, const UIndirectList<T>&); @@ -65,25 +65,50 @@ class UIndirectList { // Private data - UList<T>& completeList_; + UList<T>& values_; const labelUList& addressing_; - public: + // STL type definitions + + //- Type of values the list contains. + typedef T value_type; + + //- The pointer type for non-const access to value_type items + typedef T* pointer; + + //- The pointer type for const access to value_type items + typedef const T* const_pointer; + + //- The type used for storing into value_type objects + typedef T& reference; + + //- The type used for reading from constant value_type objects. + typedef const T& const_reference; + + //- The type to represent the size of a UList + typedef label size_type; + + //- The difference between iterator objects + typedef label difference_type; + + //- Forward iterator with non-const access + class iterator; + + //- Forward iterator with const access + class const_iterator; + + // Constructors - //- Construct given the complete list and the addressing array - inline UIndirectList - ( - const UList<T>& completeList, - const labelUList& addr - ); + //- Copy construct from the values list and the addressing array + inline UIndirectList(const UList<T>& values, const labelUList& addr); // Member Functions - // Access + // Access //- Return the number of elements in the list inline label size() const; @@ -103,14 +128,14 @@ public: //- Return the last element of the list. inline const T& last() const; - //- Return the complete list + //- Return the complete list of values inline const UList<T>& completeList() const; //- Return the list addressing inline const List<label>& addressing() const; - // Search + // Search //- Find index of the first occurence of the value. // When start is specified, any occurences before start are ignored. @@ -139,38 +164,142 @@ public: //- Return const access to an element inline const T& operator[](const label i) const; - //- Assignment to UList of addressed elements - inline void operator=(const UList<T>& ae); + //- Copy assignment from a list of the addressed elements + inline void operator=(const UList<T>& rhs); - //- Assignment to UIndirectList of addressed elements - inline void operator=(const UIndirectList<T>& ae); + //- Copy assignment from a indirect list of the addressed elements + inline void operator=(const UIndirectList<T>& rhs); //- Assignment of all entries to the given value - inline void operator=(const T& t); - - - // STL type definitions - - //- Type of values the list contains. - typedef T value_type; - - //- The type used for storing into UList::value_type objects. - typedef T& reference; - - //- The type used for reading from constant UList::value_type objects - typedef const T& const_reference; - - //- The type that can represent the difference between any two - //- UList iterator objects. - typedef label difference_type; - - //- The type that can represent the size of a UList. - typedef label size_type; + inline void operator=(const T& val); + + //- An iterator for an indirect list + class iterator + { + typename UList<T>::pointer data_; + labelUList::const_iterator base_; + + public: + + iterator + ( + UList<T>& list, + labelUList::const_iterator baseIter + ) + : + data_(list.begin()), + base_(baseIter) + {} + + reference operator*() const + { + return data_[*base_]; + } + + iterator& operator++() + { + ++base_; + return *this; + } + + bool operator==(iterator& rhs) const + { + return base_ == rhs.base_; + } + + bool operator!=(iterator& rhs) const + { + return (base_ != rhs.base_); + } + }; + + + //- A const iterator for an indirect list + class const_iterator + { + typename UList<T>::const_pointer data_; + labelUList::const_iterator base_; + + public: + + const_iterator + ( + const UList<T>& list, + labelUList::const_iterator baseIter + ) + : + data_(list.begin()), + base_(baseIter) + {} + + const_reference operator*() const + { + return data_[*base_]; + } + + const_iterator& operator++() + { + ++base_; + return *this; + } + + bool operator==(const_iterator& rhs) const + { + return base_ == rhs.base_; + } + + bool operator!=(const_iterator& rhs) const + { + return base_ != rhs.base_; + } + }; + + + // iterator (non-const) + + //- Return an iterator at begin of list + inline iterator begin() + { + return iterator(values_, addressing_.cbegin()); + } + + //- Return an iterator at end of list + inline iterator end() + { + return iterator(values_, addressing_.cend()); + } + + + // iterator (const) + + //- Return a const_iterator at begin of list + inline const_iterator cbegin() const + { + return const_iterator(values_, addressing_.cbegin()); + } + + //- Return a const_iterator at end of list + inline const_iterator cend() const + { + return const_iterator(values_, addressing_.cend()); + } + + //- Return a const_iterator at end of list + inline const_iterator begin() const + { + return cbegin(); + } + + //- Return a const_iterator at end of list + inline const_iterator end() const + { + return cend(); + } // Writing - //- Write the List, with line-breaks in ASCII if the list length + //- Write the list, with line-breaks in ASCII if its length //- exceeds shortListLen. // Using '0' suppresses line-breaks entirely. Ostream& writeList(Ostream& os, const label shortListLen=0) const; @@ -178,11 +307,11 @@ public: // Ostream operator - //- Write List to Ostream, as per writeList() with shortListLen=10 + //- Write list to Ostream, as per writeList() with shortListLen=10 friend Ostream& operator<< <T> ( Ostream& os, - const UIndirectList<T>& lst + const UIndirectList<T>& list ); }; diff --git a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListI.H b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListI.H index 15daa10969f02763074f05cc6cc13cbd6a1d7e0d..47d88a7db2259b67b5c5040c547ecb6ff3914ca0 100644 --- a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListI.H +++ b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListI.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,11 +28,11 @@ License template<class T> inline Foam::UIndirectList<T>::UIndirectList ( - const UList<T>& completeList, + const UList<T>& values, const labelUList& addr ) : - completeList_(const_cast<UList<T>&>(completeList)), + values_(const_cast<UList<T>&>(values)), addressing_(addr) {} @@ -56,35 +56,35 @@ inline bool Foam::UIndirectList<T>::empty() const template<class T> inline T& Foam::UIndirectList<T>::first() { - return completeList_[addressing_.first()]; + return values_[addressing_.first()]; } template<class T> inline const T& Foam::UIndirectList<T>::first() const { - return completeList_[addressing_.first()]; + return values_[addressing_.first()]; } template<class T> inline T& Foam::UIndirectList<T>::last() { - return completeList_[addressing_.last()]; + return values_[addressing_.last()]; } template<class T> inline const T& Foam::UIndirectList<T>::last() const { - return completeList_[addressing_.last()]; + return values_[addressing_.last()]; } template<class T> inline const Foam::UList<T>& Foam::UIndirectList<T>::completeList() const { - return completeList_; + return values_; } @@ -125,61 +125,63 @@ inline Foam::List<T> Foam::UIndirectList<T>::operator()() const template<class T> inline T& Foam::UIndirectList<T>::operator[](const label i) { - return completeList_[addressing_[i]]; + return values_[addressing_[i]]; } template<class T> inline const T& Foam::UIndirectList<T>::operator[](const label i) const { - return completeList_[addressing_[i]]; + return values_[addressing_[i]]; } template<class T> -inline void Foam::UIndirectList<T>::operator=(const UList<T>& ae) +inline void Foam::UIndirectList<T>::operator=(const UList<T>& rhs) { - if (addressing_.size() != ae.size()) + const label len = addressing_.size(); + + if (len != rhs.size()) { FatalErrorInFunction << "Addressing and list of addressed elements " - "have different sizes: " - << addressing_.size() << " " << ae.size() + "have different sizes: " << len << " " << rhs.size() << abort(FatalError); } - forAll(addressing_, i) + for (label i = 0; i < len; ++i) { - completeList_[addressing_[i]] = ae[i]; + values_[addressing_[i]] = rhs[i]; } } template<class T> -inline void Foam::UIndirectList<T>::operator=(const UIndirectList<T>& ae) +inline void Foam::UIndirectList<T>::operator=(const UIndirectList<T>& rhs) { - if (addressing_.size() != ae.size()) + const label len = addressing_.size(); + + if (len != rhs.size()) { FatalErrorInFunction << "Addressing and list of addressed elements " - "have different sizes: " - << addressing_.size() << " " << ae.size() + "have different sizes: " << len << " " << rhs.size() << abort(FatalError); } - forAll(addressing_, i) + for (label i = 0; i < len; ++i) { - completeList_[addressing_[i]] = ae[i]; + values_[addressing_[i]] = rhs[i]; } } template<class T> -inline void Foam::UIndirectList<T>::operator=(const T& t) +inline void Foam::UIndirectList<T>::operator=(const T& val) { - forAll(addressing_, i) + for (const label idx : addressing_) { - completeList_[addressing_[i]] = t; + values_[idx] = val; } } diff --git a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListIO.C b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListIO.C index df0e3d6d65b2dd816e2321c17e60f6f3df685559..9f3b8bbfa64567de6d0fa8c9d43f02447cc5c2f4 100644 --- a/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListIO.C +++ b/src/OpenFOAM/containers/Lists/UIndirectList/UIndirectListIO.C @@ -140,10 +140,10 @@ template<class T> Foam::Ostream& Foam::operator<< ( Foam::Ostream& os, - const Foam::UIndirectList<T>& lst + const Foam::UIndirectList<T>& list ) { - return lst.writeList(os, 10); + return list.writeList(os, 10); }