CMS 3D CMS Logo

Column.h
Go to the documentation of this file.
1 #ifndef FWCore_SOA_Column_h
2 #define FWCore_SOA_Column_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/SOA
6 // Class : Column
7 //
42 //
43 // Original Author: Chris Jones
44 // Created: Thu, 24 Aug 2017 16:17:56 GMT
45 //
46 
47 // system include files
48 
49 // user include files
50 
51 // forward declarations
52 namespace edm {
53  namespace soa {
54 
58  template <typename COL, typename F>
60  using Column_type = COL;
61  F m_f;
62  };
63 
64  template <typename T, typename INHERIT>
65  struct Column {
66  using type = T;
67 
68  static constexpr const char* const& label() { return INHERIT::kLabel; }
69 
70  template <typename F>
72  return {iF};
73  }
74 
75  private:
76  Column() = default;
77  Column(const Column&) = delete; // stop default
78 
79  const Column& operator=(const Column&) = delete; // stop default
80  };
81 
82  } // namespace soa
83 } // namespace edm
84 
85 #define SOA_DECLARE_COLUMN(_ClassName_, _Type_, _String_) \
86  struct _ClassName_ : public edm::soa::Column<_Type_, _ClassName_> { \
87  static constexpr const char* const kLabel = _String_; \
88  }
89 
90 /*
91  * SOA_DECLARE_DEFAULT macro to define a default way to retrieve the column
92  * values from an arbitrary class, i.e. a templated value_for_column function.
93  * A call to the macro should be placed in edm::soa namespace.
94  *
95  * This templated value_for_column function has the advantage that
96  * value_for_column does not have to be redefined for multiple classes with a
97  * similar interface, but it has one caveat: if a different value_for_column
98  * function needs to be defined for a given class, it needs to be defined also
99  * for all derived classes, otherwise the templated value_for_column function
100  * will still be used for the derived classes.
101  *
102  * If this becomes a real problem, the SOA_DECLARE_DEFAULT can be changed to
103  * define a value_for_column_default() function, and all callers of
104  * value_for_column() check the existence of a value_for_column_default()
105  * overload first.
106  *
107  * For now, it is encouraged to adapt the interface of the class to the generic
108  * value_for_column function generated by this macro, rather than implementing
109  * value_for_column overloads for each class.
110  */
111 #define SOA_DECLARE_DEFAULT(_ClassName_, _Expression_) \
112  template <class Object> \
113  _ClassName_::type value_for_column(Object const& x, _ClassName_*) { \
114  return x._Expression_; \
115  }
116 #endif
edm::soa::Column::label
static constexpr const char *const & label()
Definition: Column.h:68
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::soa::Column< int, MissingInnerHits >::type
int type
Definition: Column.h:66
F
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
edm::soa::Column::filler
static ColumnFillerHolder< INHERIT, F > filler(F &&iF)
Definition: Column.h:71
edm::soa::Column::Column
Column()=default
edm::soa::ColumnFillerHolder::m_f
F m_f
Definition: Column.h:61
edm::soa::ColumnFillerHolder::Column_type
COL Column_type
Definition: Column.h:60
T
long double T
Definition: Basic3DVectorLD.h:48
edm::soa::Column
Definition: Column.h:65
edm::soa::Column::operator=
const Column & operator=(const Column &)=delete
edm::soa::ColumnFillerHolder
Definition: Column.h:59