File indexing completed on 2023-03-17 11:03:47
0001 #ifndef FWCore_SOA_TableItr_h
0002 #define FWCore_SOA_TableItr_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <tuple>
0023 #include <array>
0024 #include <type_traits>
0025
0026
0027 #include "RowView.h"
0028
0029
0030
0031 namespace edm {
0032 namespace soa {
0033 namespace impl {
0034
0035 template <int I, typename... Args>
0036 struct TableItrAdvance {
0037 using Layout = std::tuple<Args...>;
0038 static void advance(std::array<void*, sizeof...(Args)>& iArray, long iStep) {
0039 using Type = typename std::tuple_element<I, Layout>::type::type;
0040 TableItrAdvance<I - 1, Args...>::advance(iArray, iStep);
0041 auto p = static_cast<Type*>(iArray[I]);
0042 iArray[I] = p + iStep;
0043 }
0044 };
0045
0046 template <typename... Args>
0047 struct TableItrAdvance<0, Args...> {
0048 using Layout = std::tuple<Args...>;
0049 static void advance(std::array<void*, sizeof...(Args)>& iArray, long iStep) {
0050 using Type = typename std::tuple_element<0, Layout>::type::type;
0051 auto p = static_cast<Type*>(iArray[0]);
0052 iArray[0] = p + iStep;
0053 }
0054 };
0055
0056 template <int I, typename... Args>
0057 struct ConstTableItrAdvance {
0058 using Layout = std::tuple<Args...>;
0059 static void advance(std::array<void const*, sizeof...(Args)>& iArray, long iStep) {
0060 using Type = typename std::tuple_element<I, Layout>::type::type;
0061 ConstTableItrAdvance<I - 1, Args...>::advance(iArray, iStep);
0062 auto p = static_cast<Type const*>(iArray[I]);
0063 iArray[I] = p + iStep;
0064 }
0065 };
0066
0067 template <typename... Args>
0068 struct ConstTableItrAdvance<0, Args...> {
0069 using Layout = std::tuple<Args...>;
0070 static void advance(std::array<void const*, sizeof...(Args)>& iArray, long iStep) {
0071 using Type = typename std::tuple_element<0, Layout>::type::type;
0072 auto p = static_cast<Type const*>(iArray[0]);
0073 iArray[0] = p + iStep;
0074 }
0075 };
0076 }
0077
0078 template <typename... Args>
0079 class TableItr {
0080 using Layout = std::tuple<Args...>;
0081 std::array<void*, sizeof...(Args)> m_values;
0082
0083 public:
0084 using value_type = MutableRowView<Args...>;
0085
0086 explicit TableItr(std::array<void*, sizeof...(Args)> const& iValues) : m_values{iValues} {}
0087
0088 explicit TableItr(std::array<void*, sizeof...(Args)> const& iValues, long iOffset) : m_values{iValues} {
0089 impl::TableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, iOffset);
0090 }
0091
0092 explicit TableItr(std::array<void*, sizeof...(Args)> const& iValues, unsigned int iOffset) : m_values{iValues} {
0093 impl::TableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, static_cast<long>(iOffset));
0094 }
0095
0096 value_type operator*() { return value_type{m_values}; }
0097
0098 TableItr& operator++() {
0099 impl::TableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, 1);
0100 return *this;
0101 }
0102
0103 bool operator==(const TableItr<Args...>& iOther) { return m_values[0] == iOther.m_values[0]; }
0104
0105 bool operator!=(const TableItr<Args...>& iOther) { return m_values[0] != iOther.m_values[0]; }
0106
0107 TableItr<Args...> makeOffset(long iDiff) const { return TableItr<Args...>{m_values, iDiff}; }
0108 };
0109
0110 template <typename... Args>
0111 TableItr<Args...> operator+(TableItr<Args...> const& iLHS, long iDiff) {
0112 return iLHS.makeOffset(iDiff);
0113 }
0114
0115 template <typename... Args>
0116 class ConstTableItr {
0117 using Layout = std::tuple<Args...>;
0118 std::array<void const*, sizeof...(Args)> m_values;
0119
0120 public:
0121 using value_type = RowView<Args...>;
0122
0123 explicit ConstTableItr(std::array<void const*, sizeof...(Args)> const& iValues) : m_values{iValues} {}
0124
0125 ConstTableItr(std::array<void const*, sizeof...(Args)> const& iValues, long iOffset) : m_values{iValues} {
0126 impl::ConstTableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, iOffset);
0127 }
0128
0129 ConstTableItr(std::array<void const*, sizeof...(Args)> const& iValues, unsigned int iOffset) : m_values{iValues} {
0130 impl::ConstTableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, static_cast<long>(iOffset));
0131 }
0132
0133 value_type operator*() const { return value_type{m_values}; }
0134
0135 ConstTableItr& operator++() {
0136 impl::ConstTableItrAdvance<sizeof...(Args) - 1, Args...>::advance(m_values, 1);
0137 return *this;
0138 }
0139
0140 bool operator==(const ConstTableItr<Args...>& iOther) { return m_values[0] == iOther.m_values[0]; }
0141
0142 bool operator!=(const ConstTableItr<Args...>& iOther) { return m_values[0] != iOther.m_values[0]; }
0143
0144 TableItr<Args...> makeOffset(long iDiff) const { return TableItr<Args...>{m_values, iDiff}; }
0145 };
0146
0147 template <typename... Args>
0148 ConstTableItr<Args...> operator+(ConstTableItr<Args...> const& iLHS, long iDiff) {
0149 return iLHS.makeOffset(iDiff);
0150 }
0151
0152 }
0153 }
0154
0155 #endif