/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2017-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM 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 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . Application Test-ListOps2 Description \*---------------------------------------------------------------------------*/ #include "argList.H" #include "List.H" #include "FixedList.H" #include "DynamicList.H" #include "SubList.H" #include "ListOps.H" #include "FlatOutput.H" #include "UPtrList.H" using namespace Foam; // Proof-of-concept for sorted HashTable output // .. but yet not really convincing // Forward declarations template class HashSorter; template Ostream& operator<< ( Ostream& os, const HashSorter& sorter ); template> class HashSorter { const HashTable& table; public: HashSorter(const HashTable& ht) : table(ht) {} friend Ostream& operator<< ( Ostream& os, const HashSorter& sorter ) { const auto& tbl = sorter.table; const label len = tbl.size(); // Should actually be able to get the flat entries or iterators // and sort that instead. UPtrList keys(len); label count = 0; for (auto iter = tbl.cbegin(); iter != tbl.cend(); ++iter) { keys.set(count, &(iter.key())); ++count; } labelList order(identity(len)); std::sort ( order.begin(), order.end(), ListOps::less>(keys) ); // Size and start list delimiter os << nl << len << nl << token::BEGIN_LIST << nl; // Contents for (const label idx : order) { const auto& k = keys[idx]; os << k << token::SPACE << tbl[k] << nl; } os << token::END_LIST; // End list delimiter return os; } }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template void testFind(const ListType& list) { Info<< nl << "list: " << flatOutput(list) << nl << endl; for (auto val : { 20, 35, 6, 13, 12, -12}) { Info<< "lookup " << val << " found " << list.found(val) << " index " << list.find(val) << nl; } } template void testMoving(ListType& list) { Info<< nl << "list: " << flatOutput(list) << nl << endl; { const label i = 3; list.swapFirst(i); Info<<"swapFirst: " << i << " = " << flatOutput(list) << nl; } { const label i = 6; list.moveFirst(i); Info<<"moveFirst: " << i << " = " << flatOutput(list) << nl; } { const label i = 6; list.moveLast(i); Info<<"moveLast: " << i << " = " << flatOutput(list) << nl; } { const label i = 8; list.swapLast(i); Info<<"swapLast: " << i << " = " << flatOutput(list) << nl; } } // Main program: int main(int argc, char *argv[]) { List