Skip to content
Snippets Groups Projects
Commit 10059fef authored by Kilian Weishaupt's avatar Kilian Weishaupt
Browse files

Merge branch 'feature/enumerate' into 'master'

Feature/enumerate

See merge request !2270
parents d0a45437 944085cc
No related branches found
No related tags found
1 merge request!2270Feature/enumerate
......@@ -17,6 +17,7 @@ doubleexpintegrationconstants.hh
doubleexpintegrator.hh
dumuxmessage.hh
entitymap.hh
enumerate.hh
exceptions.hh
fixedlengthspline_.hh
fvproblem.hh
......
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*****************************************************************************
* See the file COPYING for full copying permissions. *
* *
* This program 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. *
* *
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>. *
*****************************************************************************/
/*!
* \file
* \brief A Python-like enumerate function
*/
#ifndef DUMUX_COMMON_ENUMERATE_HH
#define DUMUX_COMMON_ENUMERATE_HH
#include <tuple>
namespace Dumux {
/*!
* \brief A Python-like enumerate function
* \param iterable Some iterable type with begin/end (e.g. std::vector)
* \note From Nathan Reed (CC BY 4.0): http://reedbeta.com/blog/python-like-enumerate-in-cpp17/
*
* Usage example: for (const auto& [i, item] : enumerate(list))
*/
template <typename Range,
typename RangeIterator = decltype(std::begin(std::declval<Range>())),
typename = decltype(std::end(std::declval<Range>()))>
constexpr auto enumerate(Range&& iterable)
{
struct Iterator
{
std::size_t i;
RangeIterator iter;
bool operator != (const Iterator & other) const { return iter != other.iter; }
void operator ++ () { ++i; ++iter; }
auto operator * () const { return std::tie(i, *iter); }
};
struct Iteratable
{
Range iterable;
auto begin() { return Iterator{ 0, std::begin(iterable) }; }
auto end() { return Iterator{ 0, std::end(iterable) }; }
};
return Iteratable{ std::forward<Range>(iterable) };
}
} // end namespace Dumux
#endif
......@@ -8,3 +8,4 @@ add_subdirectory(timeloop)
add_subdirectory(typetraits)
dumux_add_test(SOURCES test_partial.cc LABELS unit)
dumux_add_test(SOURCES test_enumerate.cc LABELS unit)
#include <config.h>
#include <vector>
#include <numeric>
#include <dune/common/exceptions.hh>
#include <dumux/common/enumerate.hh>
int main(int argc, char* argv[]) {
using namespace Dumux;
std::vector<std::size_t> vec(20);
std::iota(vec.begin(), vec.end(), 0);
for (const auto& [i, item] : enumerate(vec))
if (i != item)
DUNE_THROW(Dune::Exception, "Wrong index!");
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment