Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <ostream> 7 : #include <pup.h> 8 : #include <type_traits> 9 : #include <utility> 10 : 11 : /*! 12 : * \ingroup DataStructuresGroup 13 : * \brief A data structure that contains an ID and data associated with that ID. 14 : */ 15 : template <typename IdType, typename DataType> 16 1 : struct IdPair { 17 0 : IdPair(); 18 0 : IdPair(IdType id_in, DataType data_in); 19 : 20 0 : IdType id{}; 21 0 : DataType data{}; 22 : }; 23 : 24 : template <typename IdType, typename DataType> 25 : IdPair<IdType, DataType>::IdPair() = default; 26 : 27 : template <typename IdType, typename DataType> 28 : IdPair<IdType, DataType>::IdPair(IdType id_in, DataType data_in) 29 : : id(std::move(id_in)), data(std::move(data_in)) {} 30 : 31 : template <typename IdType, typename DataType> 32 0 : IdPair<std::decay_t<IdType>, std::decay_t<DataType>> make_id_pair( 33 : IdType&& id, DataType&& data) { 34 : return {std::forward<IdType>(id), std::forward<DataType>(data)}; 35 : } 36 : 37 : /// \cond 38 : // We write the pup function as a free function to keep IdPair a POD 39 : // clang-tidy: no non-const references 40 : template <typename IdType, typename DataType> 41 : void pup(PUP::er& p, IdPair<IdType, DataType>& t) { // NOLINT 42 : p | t.id; 43 : p | t.data; 44 : } 45 : 46 : // clang-tidy: no non-const references 47 : template <typename IdType, typename DataType> 48 : void operator|(PUP::er& p, IdPair<IdType, DataType>& t) { // NOLINT 49 : pup(p, t); 50 : } 51 : 52 : template <typename IdType, typename DataType> 53 : bool operator==(const IdPair<IdType, DataType>& lhs, 54 : const IdPair<IdType, DataType>& rhs) { 55 : return lhs.id == rhs.id and lhs.data == rhs.data; 56 : } 57 : 58 : template <typename IdType, typename DataType> 59 : bool operator!=(const IdPair<IdType, DataType>& lhs, 60 : const IdPair<IdType, DataType>& rhs) { 61 : return not(lhs == rhs); 62 : } 63 : 64 : template <typename IdType, typename DataType> 65 : std::ostream& operator<<(std::ostream& os, const IdPair<IdType, DataType>& t) { 66 : return os << '(' << t.id << ',' << t.data << ')'; 67 : } 68 : /// \endcond