lumiera_/tests/library/meta/tuple-diagnostics.hpp
Ichthyostega 20f3252892 Upgrade: down with typename!!
Yet another chainsaw massacre.

One of the most obnoxious annoyances with C++ metaprogramming
is the need to insert `typename` and `template` qualifiers into
most definitions, to help the compiler to cope with the syntax,
which is not context-free.

The recent standards adds several clarifications, so that most
of these qualifiers are redundant now, at least at places where
it is unambiguously clear that only a type can be given.

GCC already supports most of these relaxing rules
(Clang unfortunately lags way behind with support of newer language features...)
2025-07-06 01:19:08 +02:00

86 lines
2.2 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
TUPLE-DIAGNOSTICS - helper for diagnostics of type tuples
Copyright (C)
2009, 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 tuple-diagnostics.hpp
** an extension to typelist-diagnostics.hpp, allowing to dump the \em contents of a Tuple datatype.
** With the help of our [generic string converter](\ref util::toString), and the BuildTupleAccessor
** defined within tuple-helper.hpp, we're able to show the type and contents of any data record
** based on std::tuple. For unit-testing, special formatting is provided for the Num<int>
** test types, which makes typelist and tuples of these types a good candidate for tests.
**
** @see TupleHelper_test
** @see FunctionClosure_test
** @see TypelistManip_test
**
*/
#ifndef META_TUPLE_DIAGNOSTICS_H
#define META_TUPLE_DIAGNOSTICS_H
#include "meta/typelist-diagnostics.hpp"
#include "lib/meta/tuple-helper.hpp"
#include "lib/format-string.hpp"
#include "lib/format-obj.hpp"
#include <string>
using std::string;
namespace util {
template<int i>
struct StringConv<lib::meta::Num<i>>
{
static std::string
invoke (lib::meta::Num<i> num) noexcept
{
static util::_Fmt constElm("(%i)");
static util::_Fmt changedElm("{%i}");
return string( (num.o_==i? constElm:changedElm) % int(num.o_));
}
};
}
namespace lib {
namespace meta {
namespace test {
/* ===== printing Tuple types and contents ===== */
template<tuple_like TUP>
inline string
showType ()
{
using TypeList = RebindTupleTypes<TUP>::List;
using DumpPrinter = InstantiateChained<TypeList, Printer, NullP>;
return "TUPLE"
+ DumpPrinter::show();
}
// see the macros DISPLAY and DUMPVAL defined in typelist-diagnostics.hpp
}}} // namespace lib::meta::test
#endif