Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : #include "DataStructures/TaggedTuple.hpp"
9 : #include "Utilities/TMPL.hpp"
10 : #include "Utilities/TypeTraits/CreateIsCallable.hpp"
11 :
12 : namespace Parallel {
13 : namespace detail {
14 : CREATE_IS_CALLABLE(output_inbox)
15 : CREATE_IS_CALLABLE_V(output_inbox)
16 : } // namespace detail
17 :
18 : /*!
19 : * \brief Returns a string of the contents of the inbox.
20 : *
21 : * Calls a static `output_inbox` member function of the `InboxTag`. If the inbox
22 : * tag doesn't have the `output_inbox` function, then this function can't be
23 : * called with that inbox (a `static_assert` will fail).
24 : *
25 : * \note It's up to the individual inbox what to include in the string. Data may
26 : * or may not be included
27 : *
28 : * \tparam InboxTag Inbox tag with an `output_inbox` member function
29 : * \tparam InboxTypes Types of all inboxes (deduced)
30 : * \param inboxes All inboxes
31 : * \param indent_pad Number of empty spaces to pad the message with incase
32 : * indenting is needed.
33 : * \return std::string The contents of the inbox
34 : */
35 : template <typename InboxTag, typename... InboxTypes>
36 1 : std::string output_inbox(const tuples::TaggedTuple<InboxTypes...>& inboxes,
37 : const size_t indent_pad) {
38 : static_assert(tmpl::list_contains_v<tmpl::list<InboxTypes...>, InboxTag>);
39 :
40 : return InboxTag::output_inbox(tuples::get<InboxTag>(inboxes), indent_pad);
41 : }
42 : } // namespace Parallel
|