- remove obsolete configuration settings - walk through all settings according to the documentation https://www.doxygen.nl/manual/config.html - now try to use the new feature to rely on Clang for C++ parsing - walk through the doxygen-warnings.txt and fix some obvious misspellings and structural problems in the documentation comments. With Debian-Trixie, we are now using Doxygen 1.9.8 — which produces massively better results in various fine points. However, there are still problems with automatic cross links, especially from implementation to the corresponding test classes.
87 lines
2.8 KiB
C++
87 lines
2.8 KiB
C++
/*
|
||
UTIL-TUPLE.hpp - helpers and convenience shortcuts for working with tuples
|
||
|
||
Copyright (C)
|
||
2023, Hermann Vosseler <Ichthyostega@web.de>
|
||
|
||
**Lumiera** 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 2 of the License, or (at your
|
||
option) any later version. See the file COPYING for further details.
|
||
|
||
*/
|
||
|
||
|
||
/** @file util-tuple.hpp
|
||
** Some small helpers and convenience shortcuts to simplify working with
|
||
** tuples and sequences (given by iterator). While tuples and sequences
|
||
** are fundamentally different insofar a tuple has a fixed structure (and
|
||
** may hold elements of different type), sometimes it can be convenient to
|
||
** treat a tuple like a sequence (especially a tuple holding elements of a
|
||
** single type. Notably, an iterator can be unloaded into a fixed-size tuple,
|
||
** which in turn can than be used in a structural binding to unpack references
|
||
** to the elements into scoped variables. Obviously, the meaning of the elements
|
||
** in the sequence must be fixed and predetermined -- which is often the case
|
||
** when dealing with tests or communication protocols.
|
||
**
|
||
** @see util-tuple-test.cpp
|
||
** @see util-coll.hpp
|
||
**
|
||
*/
|
||
|
||
|
||
#ifndef UTIL_TUPLE_H
|
||
#define UTIL_TUPLE_H
|
||
|
||
|
||
#include <tuple>
|
||
#include <utility>
|
||
|
||
|
||
|
||
namespace util {
|
||
|
||
namespace { // recursive builder helper to unpack a sequence...
|
||
|
||
template<size_t N>
|
||
using cnt_ = std::integral_constant<size_t, N>;
|
||
|
||
template<class SEQ>
|
||
inline auto
|
||
_buildSeqTuple (cnt_<0>, SEQ&&)
|
||
{
|
||
return std::tuple<>{};
|
||
}
|
||
|
||
template<size_t N, class SEQ>
|
||
inline auto
|
||
_buildSeqTuple (cnt_<N>, SEQ&& iter)
|
||
{
|
||
auto prefixTuple = std::tie (*iter);
|
||
++iter;
|
||
return std::tuple_cat (prefixTuple, _buildSeqTuple (cnt_<N-1>{}, std::forward<SEQ> (iter)));
|
||
}
|
||
}//(End) unpacking helper
|
||
|
||
|
||
/**
|
||
* Unpack an iterator to build a fixed-size std::tuple of references
|
||
* @tparam N (mandatory) defines the number of elements to unpack; can be zero
|
||
* @param iter anything compliant to the Lumiera Forward Iterator protocol
|
||
* @warning since the implementation uses `std::tie (*iter)`, a _reference_ is
|
||
* stored, which may lead to strange and dangerous behaviour if the given
|
||
* iterator exposes a reference to mutable internal state (e.g. "state core").
|
||
* Moreover, it is assumed the iterator yields enough values to fill the new
|
||
* tuple, and this is not checked; an empty or exhausted iterator might throw,
|
||
* or yield otherwise undefined behaviour.
|
||
*/
|
||
template<size_t N, class SEQ>
|
||
auto
|
||
seqTuple (SEQ&& iter)
|
||
{
|
||
return _buildSeqTuple (cnt_<N>{}, std::forward<SEQ> (iter));
|
||
}
|
||
|
||
|
||
} // namespace util
|
||
#endif /*UTIL_TUPLE_H*/
|