ATLAS Offline Software
VariantDef.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 #ifndef COLUMNAR_VARIANT_VARIANT_DEF_H
9 #define COLUMNAR_VARIANT_VARIANT_DEF_H
10 
12 
13 #include <boost/mp11/list.hpp>
14 #include <boost/mp11/algorithm.hpp>
15 #include <array>
16 #include <tuple>
17 
18 namespace columnar
19 {
95 
96  template<ContainerIdConcept CIBase,ContainerIdConcept... CIList>
98  {
99  static_assert (sizeof...(CIList) > 0, "need to have at least one variant container type for VariantContainerId");
100 
102  static constexpr bool isContainerId = true;
103 
105  static constexpr bool isMutable = CIBase::isMutable;
106 
108  static constexpr bool perEventRange = false;
109 
111  static constexpr bool perEventId = false;
112 
114  using xAODObjectIdType = typename CIBase::xAODObjectIdType;
115 
117  using xAODObjectRangeType = typename CIBase::xAODObjectRangeType;
118 
120  using xAODElementLinkType = typename CIBase::xAODElementLinkType;
121 
122 
125 
126  using baseId = CIBase;
127 
128  static constexpr std::size_t numVariants = sizeof...(CIList);
129 
130  static constexpr std::array<std::string_view,numVariants> idNameArray = {CIList::idName...};
131 
132  template<ContainerIdConcept CI>
133  static constexpr bool isValidContainer ()
134  {
135  return (... || std::is_same_v<CI,CIList>);
136  }
137 
139  template<ContainerIdConcept CI>
140  static constexpr unsigned getVariantIndex ()
141  {
142  constexpr unsigned index = boost::mp11::mp_find<std::tuple<CIList...>,CI>::value;
143  return index;
144  }
145 
146  using mpCIList = boost::mp11::mp_list<CIList...>;
147  };
148 }
149 
150 #endif
columnar::VariantContainerId
a "variant" ContainerId
Definition: VariantDef.h:98
columnar::VariantContainerId::getVariantIndex
static constexpr unsigned getVariantIndex()
get the index of the given container in the list
Definition: VariantDef.h:140
index
Definition: index.py:1
athena.value
value
Definition: athena.py:124
columnar::VariantContainerId::numVariants
static constexpr std::size_t numVariants
Definition: VariantDef.h:128
columnar::VariantContainerId::isMutable
static constexpr bool isMutable
whether this is a non-const container
Definition: VariantDef.h:105
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
columnar::VariantContainerId::xAODObjectIdType
typename CIBase::xAODObjectIdType xAODObjectIdType
the xAOD type to use with ObjectId
Definition: VariantDef.h:114
columnar::VariantContainerId::xAODElementLinkType
typename CIBase::xAODElementLinkType xAODElementLinkType
the xAOD type to use with ElementLink
Definition: VariantDef.h:120
columnar::VariantContainerId::perEventId
static constexpr bool perEventId
whether this can be retrieved as a single object per event
Definition: VariantDef.h:111
columnar::VariantContainerId::mpCIList
boost::mp11::mp_list< CIList... > mpCIList
Definition: VariantDef.h:146
columnar::VariantContainerId::isValidContainer
static constexpr bool isValidContainer()
Definition: VariantDef.h:133
columnar::VariantContainerId::isContainerId
static constexpr bool isContainerId
identify this as a container id definition
Definition: VariantDef.h:102
DeMoScan.index
string index
Definition: DeMoScan.py:362
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
ContainerId.h
columnar::VariantContainerId::perEventRange
static constexpr bool perEventRange
whether this can be retrieved as a range per event
Definition: VariantDef.h:108
columnar::VariantContainerId::idNameArray
static constexpr std::array< std::string_view, numVariants > idNameArray
Definition: VariantDef.h:130
columnar::VariantContainerId::baseId
CIBase baseId
Definition: VariantDef.h:126
columnar::VariantContainerId::xAODObjectRangeType
typename CIBase::xAODObjectRangeType xAODObjectRangeType
the xAOD type to use with ObjectRange
Definition: VariantDef.h:117