File indexing completed on 2023-03-17 10:51:25
0001 #ifndef DataFormats_SoATemplate_interface_SoAView_h
0002 #define DataFormats_SoATemplate_interface_SoAView_h
0003
0004
0005
0006
0007
0008
0009
0010 #include "SoACommon.h"
0011
0012 #define SOA_VIEW_LAYOUT(TYPE, NAME) (TYPE, NAME)
0013
0014 #define SOA_VIEW_LAYOUT_LIST(...) __VA_ARGS__
0015
0016 #define SOA_VIEW_VALUE(LAYOUT_NAME, LAYOUT_MEMBER) (LAYOUT_NAME, LAYOUT_MEMBER, LAYOUT_MEMBER)
0017
0018 #define SOA_VIEW_VALUE_RENAME(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) (LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME)
0019
0020 #define SOA_VIEW_VALUE_LIST(...) __VA_ARGS__
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 namespace cms::soa {
0042
0043
0044
0045
0046 template <class C, SoAColumnType COLUMN_TYPE>
0047 struct ConstValueTraits : public C {
0048 using C::C;
0049 };
0050
0051 template <class C>
0052 struct ConstValueTraits<C, SoAColumnType::scalar> {
0053
0054 SOA_HOST_DEVICE SOA_INLINE ConstValueTraits(size_type, const typename C::valueType*) {}
0055 SOA_HOST_DEVICE SOA_INLINE ConstValueTraits(size_type, const typename C::Params&) {}
0056 SOA_HOST_DEVICE SOA_INLINE ConstValueTraits(size_type, const typename C::ConstParams&) {}
0057
0058 };
0059
0060 }
0061
0062
0063
0064
0065
0066
0067
0068
0069 #define _DECLARE_VIEW_LAYOUT_PARAMETRIZED_TEMPLATE_IMPL(TYPE, NAME) \
0070 (using BOOST_PP_CAT(TYPE, _default) = BOOST_PP_CAT(TYPE, _StagedTemplates) < VIEW_ALIGNMENT, \
0071 VIEW_ALIGNMENT_ENFORCEMENT > ;)
0072
0073 #define _DECLARE_VIEW_LAYOUT_PARAMETRIZED_TEMPLATE(R, DATA, TYPE_NAME) \
0074 BOOST_PP_EXPAND(_DECLARE_VIEW_LAYOUT_PARAMETRIZED_TEMPLATE_IMPL TYPE_NAME)
0075
0076
0077
0078
0079 #define _DECLARE_VIEW_LAYOUT_TYPE_ALIAS_IMPL(TYPE, NAME) using BOOST_PP_CAT(TypeOf_, NAME) = TYPE;
0080
0081 #define _DECLARE_VIEW_LAYOUT_TYPE_ALIAS(R, DATA, TYPE_NAME) \
0082 BOOST_PP_EXPAND(_DECLARE_VIEW_LAYOUT_TYPE_ALIAS_IMPL TYPE_NAME)
0083
0084
0085
0086
0087
0088 #define _DECLARE_VIEW_MEMBER_TYPE_ALIAS_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, CAST) \
0089 using BOOST_PP_CAT(TypeOf_, LOCAL_NAME) = \
0090 typename BOOST_PP_CAT(TypeOf_, LAYOUT_NAME)::Metadata::BOOST_PP_CAT(TypeOf_, LAYOUT_MEMBER); \
0091 using BOOST_PP_CAT(ParametersTypeOf_, LOCAL_NAME) = \
0092 typename BOOST_PP_CAT(TypeOf_, LAYOUT_NAME)::Metadata::BOOST_PP_CAT(ParametersTypeOf_, LAYOUT_MEMBER); \
0093 constexpr static cms::soa::SoAColumnType BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME) = \
0094 BOOST_PP_CAT(TypeOf_, LAYOUT_NAME)::Metadata::BOOST_PP_CAT(ColumnTypeOf_, LAYOUT_MEMBER); \
0095 using BOOST_PP_CAT(ConstAccessorOf_, LOCAL_NAME) = \
0096 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0097 template ColumnType<BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0098 cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
0099 template RestrictQualifier<restrictQualify> ; \
0100 using BOOST_PP_CAT(MutableAccessorOf_, LOCAL_NAME) = \
0101 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0102 template ColumnType<BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0103 cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
0104 template RestrictQualifier<restrictQualify> ; \
0105 SOA_HOST_DEVICE SOA_INLINE \
0106 const auto BOOST_PP_CAT(parametersOf_, LOCAL_NAME)() const { \
0107 return CAST(parent_.BOOST_PP_CAT(LOCAL_NAME, Parameters_)); \
0108 };
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 #define _DECLARE_VIEW_MEMBER_TYPE_ALIAS(R, DATA, LAYOUT_MEMBER_NAME) \
0119 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_TYPE_ALIAS_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0120
0121
0122
0123
0124
0125 #define _DECLARE_VIEW_MEMBER_POINTERS_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0126 SOA_HOST_DEVICE SOA_INLINE auto* BOOST_PP_CAT(addressOf_, LOCAL_NAME)() { \
0127 return BOOST_PP_CAT(parametersOf_, LOCAL_NAME)().addr_; \
0128 };
0129
0130
0131 #define _DECLARE_VIEW_MEMBER_POINTERS(R, DATA, LAYOUT_MEMBER_NAME) \
0132 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_POINTERS_IMPL LAYOUT_MEMBER_NAME)
0133
0134
0135
0136
0137
0138 #define _DECLARE_VIEW_MEMBER_CONST_POINTERS_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0139 SOA_HOST_DEVICE SOA_INLINE auto const* BOOST_PP_CAT(addressOf_, LOCAL_NAME)() const { \
0140 return BOOST_PP_CAT(parametersOf_, LOCAL_NAME)().addr_; \
0141 };
0142
0143
0144 #define _DECLARE_VIEW_MEMBER_CONST_POINTERS(R, DATA, LAYOUT_MEMBER_NAME) \
0145 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_CONST_POINTERS_IMPL LAYOUT_MEMBER_NAME)
0146
0147
0148
0149
0150 #define _DECLARE_VIEW_CONSTRUCTION_PARAMETERS_IMPL(LAYOUT_TYPE, LAYOUT_NAME, DATA) (DATA LAYOUT_TYPE & LAYOUT_NAME)
0151
0152 #define _DECLARE_VIEW_CONSTRUCTION_PARAMETERS(R, DATA, TYPE_NAME) \
0153 BOOST_PP_EXPAND(_DECLARE_VIEW_CONSTRUCTION_PARAMETERS_IMPL BOOST_PP_TUPLE_PUSH_BACK(TYPE_NAME, DATA))
0154
0155
0156
0157
0158 #define _DECLARE_VIEW_CONSTRUCTION_BYCOLUMN_PARAMETERS_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0159 (DATA typename BOOST_PP_CAT(Metadata::ParametersTypeOf_, LOCAL_NAME)::TupleOrPointerType LOCAL_NAME)
0160
0161 #define _DECLARE_VIEW_CONSTRUCTION_BYCOLUMN_PARAMETERS(R, DATA, LAYOUT_MEMBER_NAME) \
0162 BOOST_PP_EXPAND( \
0163 _DECLARE_VIEW_CONSTRUCTION_BYCOLUMN_PARAMETERS_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0164
0165
0166
0167
0168
0169
0170 #define _DECLARE_VIEW_MEMBER_INITIALIZERS_IMPL(LAYOUT, MEMBER, NAME) \
0171 (BOOST_PP_CAT(NAME, Parameters_)([&]() -> auto { \
0172 auto params = LAYOUT.metadata().BOOST_PP_CAT(parametersOf_, MEMBER)(); \
0173 if constexpr (alignmentEnforcement == AlignmentEnforcement::enforced) \
0174 if (reinterpret_cast<intptr_t>(params.addr_) % alignment) \
0175 throw std::runtime_error("In constructor by layout: misaligned column: " #NAME); \
0176 return params; \
0177 }()))
0178
0179
0180 #define _DECLARE_VIEW_MEMBER_INITIALIZERS(R, DATA, LAYOUT_MEMBER_NAME) \
0181 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_INITIALIZERS_IMPL LAYOUT_MEMBER_NAME)
0182
0183
0184
0185
0186
0187
0188 #define _UPDATE_SIZE_OF_VIEW_IMPL(LAYOUT_TYPE, LAYOUT_NAME) \
0189 if (set) { \
0190 if (ret != LAYOUT_NAME.metadata().size()) \
0191 throw std::runtime_error("In constructor by layout: different sizes from layouts."); \
0192 } else { \
0193 ret = LAYOUT_NAME.metadata().size(); \
0194 set = true; \
0195 }
0196
0197
0198 #define _UPDATE_SIZE_OF_VIEW(R, DATA, TYPE_NAME) BOOST_PP_EXPAND(_UPDATE_SIZE_OF_VIEW_IMPL TYPE_NAME)
0199
0200
0201
0202
0203
0204
0205 #define _DECLARE_VIEW_MEMBER_INITIALIZERS_BYCOLUMN_IMPL(LAYOUT, MEMBER, NAME) \
0206 ( \
0207 BOOST_PP_CAT(NAME, Parameters_)([&]() -> auto { \
0208 if constexpr (alignmentEnforcement == AlignmentEnforcement::enforced) \
0209 if (Metadata:: BOOST_PP_CAT(ParametersTypeOf_, NAME)::checkAlignment(NAME, alignment)) \
0210 throw std::runtime_error("In constructor by column: misaligned column: " #NAME); \
0211 return NAME; \
0212 }()) \
0213 )
0214
0215
0216 #define _DECLARE_VIEW_MEMBER_INITIALIZERS_BYCOLUMN(R, DATA, LAYOUT_MEMBER_NAME) \
0217 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_INITIALIZERS_BYCOLUMN_IMPL LAYOUT_MEMBER_NAME)
0218
0219
0220
0221
0222 #define _DECLARE_LAYOUT_LIST_IMPL(LAYOUT, NAME) (NAME)
0223
0224 #define _DECLARE_LAYOUT_LIST(R, DATA, LAYOUT_MEMBER_NAME) BOOST_PP_EXPAND(_DECLARE_LAYOUT_LIST_IMPL LAYOUT_MEMBER_NAME)
0225
0226
0227
0228
0229 #define _DECLARE_VIEW_MEMBER_LIST_IMPL(LAYOUT, MEMBER, NAME) (NAME)
0230
0231 #define _DECLARE_VIEW_MEMBER_LIST(R, DATA, LAYOUT_MEMBER_NAME) \
0232 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_LIST_IMPL LAYOUT_MEMBER_NAME)
0233
0234
0235
0236
0237 #define _DECLARE_VIEW_MEMBER_INITIALIZERS_FROM_OTHER_IMPL(LAYOUT, MEMBER, LOCAL_NAME, DATA) \
0238 (BOOST_PP_CAT(MEMBER, Parameters_){DATA.BOOST_PP_CAT(MEMBER, Parameters_)})
0239
0240 #define _DECLARE_VIEW_MEMBER_INITIALIZERS_FROM_OTHER(R, DATA, LAYOUT_MEMBER_NAME) \
0241 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_INITIALIZERS_FROM_OTHER_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0242
0243
0244
0245
0246 #define _DECLARE_VIEW_MEMBER_ASSIGNMENT_FROM_OTHER_IMPL(LAYOUT, MEMBER, LOCAL_NAME, DATA) \
0247 BOOST_PP_CAT(MEMBER, Parameters_) = DATA.BOOST_PP_CAT(MEMBER, Parameters_);
0248
0249 #define _DECLARE_VIEW_MEMBER_ASSIGNMENT_FROM_OTHER(R, DATA, LAYOUT_MEMBER_NAME) \
0250 BOOST_PP_EXPAND(_DECLARE_VIEW_MEMBER_ASSIGNMENT_FROM_OTHER_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0251
0252
0253
0254
0255 #define _DECLARE_VIEW_ELEM_MEMBER_INIT_IMPL(LAYOUT, MEMBER, LOCAL_NAME, DATA) (LOCAL_NAME(DATA, LOCAL_NAME))
0256
0257 #define _DECLARE_VIEW_ELEM_MEMBER_INIT(R, DATA, LAYOUT_MEMBER_NAME) \
0258 BOOST_PP_EXPAND(_DECLARE_VIEW_ELEM_MEMBER_INIT_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0259
0260
0261
0262
0263 #define _COLUMN_TYPE(LAYOUT_NAME, LAYOUT_MEMBER) \
0264 typename std::remove_pointer<decltype(BOOST_PP_CAT(LAYOUT_NAME, Type)()::LAYOUT_MEMBER())>::type
0265
0266
0267
0268
0269 #define _DECLARE_VIEW_ELEMENT_VALUE_ARG_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0270 (DATA typename BOOST_PP_CAT(Metadata::ParametersTypeOf_, LOCAL_NAME) LOCAL_NAME)
0271
0272 #define _DECLARE_VIEW_ELEMENT_VALUE_ARG(R, DATA, LAYOUT_MEMBER_NAME) \
0273 _DECLARE_VIEW_ELEMENT_VALUE_ARG_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA)
0274
0275
0276
0277
0278 #define _DECLARE_CONST_VIEW_ELEMENT_VALUE_ARG_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0279 (DATA typename BOOST_PP_CAT(Metadata::ParametersTypeOf_, LOCAL_NAME)::ConstType LOCAL_NAME)
0280
0281 #define _DECLARE_CONST_VIEW_ELEMENT_VALUE_ARG(R, DATA, LAYOUT_MEMBER_NAME) \
0282 _DECLARE_CONST_VIEW_ELEMENT_VALUE_ARG_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA)
0283
0284
0285
0286
0287 #define _DECLARE_VIEW_CONST_ELEM_MEMBER_INIT_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0288 (BOOST_PP_CAT(LOCAL_NAME, _)(DATA, LOCAL_NAME))
0289
0290
0291 #define _DECLARE_VIEW_CONST_ELEM_MEMBER_INIT(R, DATA, LAYOUT_MEMBER_NAME) \
0292 BOOST_PP_EXPAND(_DECLARE_VIEW_CONST_ELEM_MEMBER_INIT_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0293
0294
0295
0296
0297
0298 #define _DECLARE_VIEW_CONST_ELEMENT_ACCESSOR_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0299 SOA_HOST_DEVICE SOA_INLINE \
0300 const typename SoAConstValueWithConf<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME), \
0301 const typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>::RefToConst \
0302 LOCAL_NAME() const { \
0303 return BOOST_PP_CAT(LOCAL_NAME, _)(); \
0304 }
0305
0306
0307 #define _DECLARE_VIEW_CONST_ELEMENT_ACCESSOR(R, DATA, LAYOUT_MEMBER_NAME) \
0308 _DECLARE_VIEW_CONST_ELEMENT_ACCESSOR_IMPL LAYOUT_MEMBER_NAME
0309
0310
0311
0312
0313
0314 #define _DECLARE_VIEW_CONST_ELEMENT_VALUE_MEMBER_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0315 const cms::soa::ConstValueTraits<SoAConstValueWithConf<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME), \
0316 typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>, \
0317 BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)> \
0318 BOOST_PP_CAT(LOCAL_NAME, _);
0319
0320
0321 #define _DECLARE_VIEW_CONST_ELEMENT_VALUE_MEMBER(R, DATA, LAYOUT_MEMBER_NAME) \
0322 _DECLARE_VIEW_CONST_ELEMENT_VALUE_MEMBER_IMPL LAYOUT_MEMBER_NAME
0323
0324
0325
0326
0327 #define _DECLARE_VIEW_ELEMENT_VALUE_COPY_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0328 if constexpr (Metadata::BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME) != cms::soa::SoAColumnType::scalar) \
0329 LOCAL_NAME() = other.LOCAL_NAME();
0330
0331 #define _DECLARE_VIEW_ELEMENT_VALUE_COPY(R, DATA, LAYOUT_MEMBER_NAME) \
0332 BOOST_PP_EXPAND(_DECLARE_VIEW_ELEMENT_VALUE_COPY_IMPL LAYOUT_MEMBER_NAME)
0333
0334
0335
0336
0337
0338 #define _DECLARE_VIEW_ELEMENT_VALUE_MEMBER_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0339 SoAValueWithConf<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME), \
0340 typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)> \
0341 LOCAL_NAME;
0342
0343
0344 #define _DECLARE_VIEW_ELEMENT_VALUE_MEMBER(R, DATA, LAYOUT_MEMBER_NAME) \
0345 _DECLARE_VIEW_ELEMENT_VALUE_MEMBER_IMPL LAYOUT_MEMBER_NAME
0346
0347
0348
0349
0350 #define _DECLARE_VIEW_CONST_ELEMENT_CONSTR_CALL_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0351 (BOOST_PP_CAT(LOCAL_NAME, Parameters_))
0352
0353 #define _DECLARE_VIEW_CONST_ELEMENT_CONSTR_CALL(R, DATA, LAYOUT_MEMBER_NAME) \
0354 BOOST_PP_EXPAND(_DECLARE_VIEW_CONST_ELEMENT_CONSTR_CALL_IMPL LAYOUT_MEMBER_NAME)
0355
0356
0357
0358
0359
0360
0361
0362 #define _DECLARE_VIEW_ELEMENT_CONSTR_CALL_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0363 (const_cast_SoAParametersImpl(base_type::BOOST_PP_CAT(LOCAL_NAME, Parameters_)))
0364
0365 #define _DECLARE_VIEW_ELEMENT_CONSTR_CALL(R, DATA, LAYOUT_MEMBER_NAME) \
0366 BOOST_PP_EXPAND(_DECLARE_VIEW_ELEMENT_CONSTR_CALL_IMPL LAYOUT_MEMBER_NAME)
0367
0368
0369
0370
0371
0372 #define _DECLARE_VIEW_SOA_ACCESSOR_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0373 \
0374 SOA_HOST_DEVICE SOA_INLINE \
0375 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0376 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0377 cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
0378 template RestrictQualifier<restrictQualify>::NoParamReturnType \
0379 LOCAL_NAME() { \
0380 return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0381 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0382 cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
0383 template RestrictQualifier<restrictQualify>(const_cast_SoAParametersImpl( \
0384 base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(); \
0385 } \
0386 SOA_HOST_DEVICE SOA_INLINE \
0387 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0388 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0389 cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
0390 template RestrictQualifier<restrictQualify>::ParamReturnType \
0391 LOCAL_NAME(size_type index) { \
0392 if constexpr (rangeChecking == cms::soa::RangeChecking::enabled) { \
0393 if (index >= base_type::elements_) \
0394 SOA_THROW_OUT_OF_RANGE("Out of range index in mutable " #LOCAL_NAME "(size_type index)") \
0395 } \
0396 return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0397 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0398 cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
0399 template RestrictQualifier<restrictQualify>(const_cast_SoAParametersImpl( \
0400 base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(index); \
0401 }
0402
0403
0404 #define _DECLARE_VIEW_SOA_ACCESSOR(R, DATA, LAYOUT_MEMBER_NAME) \
0405 BOOST_PP_EXPAND(_DECLARE_VIEW_SOA_ACCESSOR_IMPL LAYOUT_MEMBER_NAME)
0406
0407
0408
0409
0410
0411 #define _DECLARE_VIEW_SOA_CONST_ACCESSOR_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME) \
0412 \
0413 SOA_HOST_DEVICE SOA_INLINE \
0414 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0415 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0416 cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
0417 template RestrictQualifier<restrictQualify>::NoParamReturnType \
0418 LOCAL_NAME() const { \
0419 return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0420 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0421 cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
0422 template RestrictQualifier<restrictQualify>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(); \
0423 } \
0424 SOA_HOST_DEVICE SOA_INLINE \
0425 typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0426 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0427 cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
0428 template RestrictQualifier<restrictQualify>::ParamReturnType \
0429 LOCAL_NAME(size_type index) const { \
0430 if constexpr (rangeChecking == cms::soa::RangeChecking::enabled) { \
0431 if (index >= elements_) \
0432 SOA_THROW_OUT_OF_RANGE("Out of range index in const " #LOCAL_NAME "(size_type index)") \
0433 } \
0434 return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
0435 template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
0436 cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
0437 template RestrictQualifier<restrictQualify>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(index); \
0438 }
0439
0440
0441 #define _DECLARE_VIEW_SOA_CONST_ACCESSOR(R, DATA, LAYOUT_MEMBER_NAME) \
0442 BOOST_PP_EXPAND(_DECLARE_VIEW_SOA_CONST_ACCESSOR_IMPL LAYOUT_MEMBER_NAME)
0443
0444
0445
0446
0447 #define _DECLARE_VIEW_SOA_MEMBER_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0448 typename BOOST_PP_CAT(Metadata::ParametersTypeOf_, LOCAL_NAME) BOOST_PP_CAT(LOCAL_NAME, Parameters_);
0449
0450 #define _DECLARE_VIEW_SOA_MEMBER(R, DATA, LAYOUT_MEMBER_NAME) \
0451 BOOST_PP_EXPAND(_DECLARE_VIEW_SOA_MEMBER_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0452
0453
0454
0455
0456 #define _DECLARE_CONST_VIEW_SOA_MEMBER_IMPL(LAYOUT_NAME, LAYOUT_MEMBER, LOCAL_NAME, DATA) \
0457 typename BOOST_PP_CAT(Metadata::ParametersTypeOf_, LOCAL_NAME)::ConstType BOOST_PP_CAT(LOCAL_NAME, Parameters_);
0458
0459 #define _DECLARE_CONST_VIEW_SOA_MEMBER(R, DATA, LAYOUT_MEMBER_NAME) \
0460 BOOST_PP_EXPAND(_DECLARE_CONST_VIEW_SOA_MEMBER_IMPL BOOST_PP_TUPLE_PUSH_BACK(LAYOUT_MEMBER_NAME, DATA))
0461
0462
0463
0464
0465
0466
0467 #define _TRIVIAL_VIEW_ASSIGN_VALUE_ELEMENT_IMPL(VALUE_TYPE, CPP_TYPE, NAME) \
0468 _SWITCH_ON_TYPE(VALUE_TYPE, \
0469 \
0470 , \
0471 \
0472 NAME() = value.NAME; \
0473 , \
0474 \
0475 NAME() = value.NAME; \
0476 )
0477
0478
0479 #define _TRIVIAL_VIEW_ASSIGN_VALUE_ELEMENT(R, DATA, TYPE_NAME) _TRIVIAL_VIEW_ASSIGN_VALUE_ELEMENT_IMPL TYPE_NAME
0480
0481
0482
0483 #define _GENERATE_SOA_VIEW_PART_0(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0484 template <CMS_SOA_BYTE_SIZE_TYPE VIEW_ALIGNMENT = cms::soa::CacheLineSize::defaultSize, \
0485 bool VIEW_ALIGNMENT_ENFORCEMENT = cms::soa::AlignmentEnforcement::relaxed, \
0486 bool RESTRICT_QUALIFY = cms::soa::RestrictQualify::enabled, \
0487 bool RANGE_CHECKING = cms::soa::RangeChecking::disabled> \
0488 struct VIEW : public CONST_VIEW<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT, RESTRICT_QUALIFY, RANGE_CHECKING> { \
0489 \
0490 \
0491 \
0492 using self_type = VIEW; \
0493 using base_type = CONST_VIEW<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT, RESTRICT_QUALIFY, RANGE_CHECKING>;
0494
0495
0496
0497 #define _GENERATE_SOA_VIEW_PART_0_NO_DEFAULTS(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0498 template <CMS_SOA_BYTE_SIZE_TYPE VIEW_ALIGNMENT, \
0499 bool VIEW_ALIGNMENT_ENFORCEMENT, \
0500 bool RESTRICT_QUALIFY, \
0501 bool RANGE_CHECKING> \
0502 struct VIEW : public CONST_VIEW<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT, RESTRICT_QUALIFY, RANGE_CHECKING> { \
0503 \
0504 \
0505 \
0506 using self_type = VIEW; \
0507 using base_type = CONST_VIEW<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT, RESTRICT_QUALIFY, RANGE_CHECKING>;
0508
0509
0510
0511
0512
0513
0514
0515 #define _GENERATE_SOA_VIEW_PART_1(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0516 using size_type = cms::soa::size_type; \
0517 using byte_size_type = cms::soa::byte_size_type; \
0518 using AlignmentEnforcement = cms::soa::AlignmentEnforcement; \
0519 \
0520
0521
0522
0523 \
0524 constexpr static byte_size_type defaultAlignment = cms::soa::CacheLineSize::defaultSize; \
0525 constexpr static byte_size_type alignment = VIEW_ALIGNMENT; \
0526 constexpr static bool alignmentEnforcement = VIEW_ALIGNMENT_ENFORCEMENT; \
0527 constexpr static byte_size_type conditionalAlignment = \
0528 alignmentEnforcement == AlignmentEnforcement::enforced ? alignment : 0; \
0529 constexpr static bool restrictQualify = RESTRICT_QUALIFY; \
0530 constexpr static bool rangeChecking = RANGE_CHECKING; \
0531 \
0532 template <cms::soa::SoAColumnType COLUMN_TYPE, class C> \
0533 using SoAValueWithConf = cms::soa::SoAValue<COLUMN_TYPE, C, conditionalAlignment, restrictQualify>; \
0534 \
0535 template <cms::soa::SoAColumnType COLUMN_TYPE, class C> \
0536 using SoAConstValueWithConf = cms::soa::SoAConstValue<COLUMN_TYPE, C, conditionalAlignment, restrictQualify>; \
0537 \
0538
0539
0540 \
0541 struct Metadata { \
0542 friend VIEW; \
0543 SOA_HOST_DEVICE SOA_INLINE size_type size() const { return parent_.elements_; } \
0544 \
0545 _ITERATE_ON_ALL(_DECLARE_VIEW_LAYOUT_TYPE_ALIAS, ~, LAYOUTS_LIST) \
0546 \
0547 \
0548 _ITERATE_ON_ALL(_DECLARE_VIEW_MEMBER_TYPE_ALIAS, const_cast_SoAParametersImpl, VALUE_LIST) \
0549 _ITERATE_ON_ALL(_DECLARE_VIEW_MEMBER_POINTERS, ~, VALUE_LIST) \
0550 _ITERATE_ON_ALL(_DECLARE_VIEW_MEMBER_CONST_POINTERS, ~, VALUE_LIST) \
0551 \
0552 \
0553 Metadata& operator=(const Metadata&) = delete; \
0554 Metadata(const Metadata&) = delete; \
0555 \
0556 private: \
0557 SOA_HOST_DEVICE SOA_INLINE Metadata(const VIEW& parent) : parent_(parent) {} \
0558 const VIEW& parent_; \
0559 }; \
0560 \
0561 friend Metadata; \
0562 SOA_HOST_DEVICE SOA_INLINE const Metadata metadata() const { return Metadata(*this); } \
0563 SOA_HOST_DEVICE SOA_INLINE Metadata metadata() { return Metadata(*this); } \
0564 \
0565 \
0566 VIEW() = default; \
0567 \
0568 \
0569 SOA_HOST_ONLY VIEW(_ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONSTRUCTION_PARAMETERS, BOOST_PP_EMPTY(), LAYOUTS_LIST)) \
0570 : base_type{_ITERATE_ON_ALL_COMMA(_DECLARE_LAYOUT_LIST, BOOST_PP_EMPTY(), LAYOUTS_LIST)} {} \
0571 \
0572 \
0573 SOA_HOST_ONLY VIEW(size_type elements, \
0574 _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONSTRUCTION_BYCOLUMN_PARAMETERS, \
0575 BOOST_PP_EMPTY(), \
0576 VALUE_LIST)) \
0577 : base_type{elements, _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_MEMBER_LIST, BOOST_PP_EMPTY(), VALUE_LIST)} {} \
0578 \
0579 \
0580 VIEW(VIEW const&) = default; \
0581 VIEW& operator=(VIEW const&) = default; \
0582 \
0583 \
0584 VIEW(VIEW &&) = default; \
0585 VIEW& operator=(VIEW &&) = default; \
0586 \
0587 \
0588 ~VIEW() = default; \
0589 \
0590 \
0591 using const_element = typename base_type::const_element; \
0592 \
0593 using base_type::operator[]; \
0594 \
0595 \
0596 struct element { \
0597 SOA_HOST_DEVICE SOA_INLINE \
0598 element(size_type index, \
0599 _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_ELEMENT_VALUE_ARG, BOOST_PP_EMPTY(), VALUE_LIST)) \
0600 : _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_ELEM_MEMBER_INIT, index, VALUE_LIST) {} \
0601 SOA_HOST_DEVICE SOA_INLINE \
0602 element& operator=(const element& other) { \
0603 _ITERATE_ON_ALL(_DECLARE_VIEW_ELEMENT_VALUE_COPY, ~, VALUE_LIST) \
0604 return *this; \
0605 }
0606
0607
0608
0609 #define _GENERATE_SOA_VIEW_PART_2(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0610 _ITERATE_ON_ALL(_DECLARE_VIEW_ELEMENT_VALUE_MEMBER, ~, VALUE_LIST) \
0611 }; \
0612 \
0613 SOA_HOST_DEVICE SOA_INLINE \
0614 element operator[](size_type index) { \
0615 if constexpr (rangeChecking == cms::soa::RangeChecking::enabled) { \
0616 if (index >= base_type::elements_) \
0617 SOA_THROW_OUT_OF_RANGE("Out of range index in " #VIEW "::operator[]") \
0618 } \
0619 return element{index, _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_ELEMENT_CONSTR_CALL, ~, VALUE_LIST)}; \
0620 } \
0621 \
0622 \
0623 \
0624 \
0625 _ITERATE_ON_ALL(_DECLARE_VIEW_SOA_ACCESSOR, ~, VALUE_LIST) \
0626 \
0627 \
0628 template <typename T> \
0629 SOA_HOST_ONLY friend void dump(); \
0630 };
0631
0632
0633
0634
0635 #define _GENERATE_SOA_CONST_VIEW_PART_0(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0636 template <CMS_SOA_BYTE_SIZE_TYPE VIEW_ALIGNMENT = cms::soa::CacheLineSize::defaultSize, \
0637 bool VIEW_ALIGNMENT_ENFORCEMENT = cms::soa::AlignmentEnforcement::relaxed, \
0638 bool RESTRICT_QUALIFY = cms::soa::RestrictQualify::enabled, \
0639 bool RANGE_CHECKING = cms::soa::RangeChecking::disabled> \
0640 struct CONST_VIEW { \
0641 \
0642 using self_type = CONST_VIEW;
0643
0644
0645
0646 #define _GENERATE_SOA_CONST_VIEW_PART_0_NO_DEFAULTS(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0647 template <CMS_SOA_BYTE_SIZE_TYPE VIEW_ALIGNMENT, \
0648 bool VIEW_ALIGNMENT_ENFORCEMENT, \
0649 bool RESTRICT_QUALIFY, \
0650 bool RANGE_CHECKING> \
0651 struct CONST_VIEW { \
0652 \
0653 using self_type = CONST_VIEW;
0654
0655
0656
0657
0658
0659
0660
0661 #define _GENERATE_SOA_CONST_VIEW_PART_1(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0662 using size_type = cms::soa::size_type; \
0663 using byte_size_type = cms::soa::byte_size_type; \
0664 using AlignmentEnforcement = cms::soa::AlignmentEnforcement; \
0665 \
0666 template <CMS_SOA_BYTE_SIZE_TYPE, bool, bool, bool> \
0667 friend struct VIEW; \
0668 \
0669
0670
0671
0672 \
0673 constexpr static byte_size_type defaultAlignment = cms::soa::CacheLineSize::defaultSize; \
0674 constexpr static byte_size_type alignment = VIEW_ALIGNMENT; \
0675 constexpr static bool alignmentEnforcement = VIEW_ALIGNMENT_ENFORCEMENT; \
0676 constexpr static byte_size_type conditionalAlignment = \
0677 alignmentEnforcement == AlignmentEnforcement::enforced ? alignment : 0; \
0678 constexpr static bool restrictQualify = RESTRICT_QUALIFY; \
0679 constexpr static bool rangeChecking = RANGE_CHECKING; \
0680 \
0681 template <cms::soa::SoAColumnType COLUMN_TYPE, class C> \
0682 using SoAValueWithConf = cms::soa::SoAValue<COLUMN_TYPE, C, conditionalAlignment, restrictQualify>; \
0683 \
0684 template <cms::soa::SoAColumnType COLUMN_TYPE, class C> \
0685 using SoAConstValueWithConf = cms::soa::SoAConstValue<COLUMN_TYPE, C, conditionalAlignment, restrictQualify>; \
0686 \
0687
0688
0689 \
0690 struct Metadata { \
0691 friend CONST_VIEW; \
0692 SOA_HOST_DEVICE SOA_INLINE size_type size() const { return parent_.elements_; } \
0693 \
0694 _ITERATE_ON_ALL(_DECLARE_VIEW_LAYOUT_TYPE_ALIAS, ~, LAYOUTS_LIST) \
0695 \
0696 \
0697 _ITERATE_ON_ALL(_DECLARE_VIEW_MEMBER_TYPE_ALIAS, BOOST_PP_EMPTY(), VALUE_LIST) \
0698 _ITERATE_ON_ALL(_DECLARE_VIEW_MEMBER_CONST_POINTERS, ~, VALUE_LIST) \
0699 \
0700 \
0701 Metadata& operator=(const Metadata&) = delete; \
0702 Metadata(const Metadata&) = delete; \
0703 \
0704 private: \
0705 SOA_HOST_DEVICE SOA_INLINE Metadata(const CONST_VIEW& parent) : parent_(parent) {} \
0706 const CONST_VIEW& parent_; \
0707 }; \
0708 \
0709 friend Metadata; \
0710 SOA_HOST_DEVICE SOA_INLINE const Metadata metadata() const { return Metadata(*this); } \
0711 \
0712 \
0713 CONST_VIEW() = default; \
0714 \
0715 \
0716 SOA_HOST_ONLY CONST_VIEW(_ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONSTRUCTION_PARAMETERS, const, LAYOUTS_LIST)) \
0717 : elements_([&]() -> size_type { \
0718 bool set = false; \
0719 size_type ret = 0; \
0720 _ITERATE_ON_ALL(_UPDATE_SIZE_OF_VIEW, BOOST_PP_EMPTY(), LAYOUTS_LIST) \
0721 return ret; \
0722 }()), \
0723 _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_MEMBER_INITIALIZERS, ~, VALUE_LIST) {} \
0724 \
0725 \
0726 SOA_HOST_ONLY CONST_VIEW(size_type elements, \
0727 _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONSTRUCTION_BYCOLUMN_PARAMETERS, const, VALUE_LIST)) \
0728 : elements_(elements), _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_MEMBER_INITIALIZERS_BYCOLUMN, ~, VALUE_LIST) {} \
0729 \
0730 \
0731 CONST_VIEW(CONST_VIEW const&) = default; \
0732 CONST_VIEW& operator=(CONST_VIEW const&) = default; \
0733 \
0734 \
0735 CONST_VIEW(CONST_VIEW &&) = default; \
0736 CONST_VIEW& operator=(CONST_VIEW &&) = default; \
0737 \
0738 \
0739 ~CONST_VIEW() = default; \
0740 \
0741 \
0742 struct const_element { \
0743 SOA_HOST_DEVICE SOA_INLINE \
0744 const_element(size_type index, \
0745 _ITERATE_ON_ALL_COMMA(_DECLARE_CONST_VIEW_ELEMENT_VALUE_ARG, const, VALUE_LIST)) \
0746 : _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONST_ELEM_MEMBER_INIT, index, VALUE_LIST) {} \
0747 _ITERATE_ON_ALL(_DECLARE_VIEW_CONST_ELEMENT_ACCESSOR, ~, VALUE_LIST) \
0748 \
0749 private: \
0750 _ITERATE_ON_ALL(_DECLARE_VIEW_CONST_ELEMENT_VALUE_MEMBER, ~, VALUE_LIST) \
0751 }; \
0752 \
0753 SOA_HOST_DEVICE SOA_INLINE \
0754 const_element operator[](size_type index) const { \
0755 if constexpr (rangeChecking == cms::soa::RangeChecking::enabled) { \
0756 if (index >= elements_) \
0757 SOA_THROW_OUT_OF_RANGE("Out of range index in " #CONST_VIEW "::operator[]") \
0758 } \
0759 return const_element{index, _ITERATE_ON_ALL_COMMA(_DECLARE_VIEW_CONST_ELEMENT_CONSTR_CALL, ~, VALUE_LIST)}; \
0760 } \
0761 \
0762 \
0763 _ITERATE_ON_ALL(_DECLARE_VIEW_SOA_CONST_ACCESSOR, ~, VALUE_LIST) \
0764 \
0765 \
0766 template <typename T> \
0767 SOA_HOST_ONLY friend void dump(); \
0768 \
0769 private: \
0770 size_type elements_ = 0; \
0771 _ITERATE_ON_ALL(_DECLARE_CONST_VIEW_SOA_MEMBER, const, VALUE_LIST) \
0772 };
0773
0774
0775
0776
0777 #define _GENERATE_SOA_CONST_VIEW(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0778 _GENERATE_SOA_CONST_VIEW_PART_0(CONST_VIEW, VIEW, \
0779 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0780 _GENERATE_SOA_CONST_VIEW_PART_1(CONST_VIEW, VIEW, \
0781 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0782
0783 #define GENERATE_SOA_CONST_VIEW(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0784 _GENERATE_SOA_CONST_VIEW(CONST_VIEW, BOOST_PP_CAT(CONST_VIEW, Unused_), \
0785 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0786
0787 #define _GENERATE_SOA_TRIVIAL_CONST_VIEW(CLASS, LAYOUTS_LIST, VALUE_LIST) \
0788 _GENERATE_SOA_CONST_VIEW_PART_0_NO_DEFAULTS(ConstViewTemplateFreeParams, ViewTemplateFreeParams, \
0789 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0790 using BOOST_PP_CAT(CLASS, _parametrized) = CLASS<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT>; \
0791 _GENERATE_SOA_CONST_VIEW_PART_1(ConstViewTemplateFreeParams, ViewTemplateFreeParams, \
0792 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0793
0794 #define _GENERATE_SOA_VIEW(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0795 _GENERATE_SOA_VIEW_PART_0(CONST_VIEW, VIEW, SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0796 _GENERATE_SOA_VIEW_PART_1(CONST_VIEW, VIEW, SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0797 _GENERATE_SOA_VIEW_PART_2(CONST_VIEW, VIEW, SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0798
0799 #define GENERATE_SOA_VIEW(CONST_VIEW, VIEW, LAYOUTS_LIST, VALUE_LIST) \
0800 _GENERATE_SOA_CONST_VIEW(CONST_VIEW, VIEW, SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0801 _GENERATE_SOA_VIEW(CONST_VIEW, VIEW, SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0802
0803 #define _GENERATE_SOA_TRIVIAL_VIEW(CLASS, LAYOUTS_LIST, VALUE_LIST, ...) \
0804 _GENERATE_SOA_VIEW_PART_0_NO_DEFAULTS(ConstViewTemplateFreeParams, ViewTemplateFreeParams, \
0805 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0806 using BOOST_PP_CAT(CLASS, _parametrized) = CLASS<VIEW_ALIGNMENT, VIEW_ALIGNMENT_ENFORCEMENT>; \
0807 _GENERATE_SOA_VIEW_PART_1(ConstViewTemplateFreeParams, ViewTemplateFreeParams, \
0808 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST)) \
0809 \
0810 \
0811 SOA_HOST_DEVICE SOA_INLINE constexpr element & operator=(const typename \
0812 BOOST_PP_CAT(CLASS, _parametrized)::Metadata::value_element value) { \
0813 _ITERATE_ON_ALL(_TRIVIAL_VIEW_ASSIGN_VALUE_ELEMENT, ~, __VA_ARGS__) \
0814 return *this; \
0815 } \
0816 \
0817 _GENERATE_SOA_VIEW_PART_2(ConstViewTemplateFreeParams, ViewTemplateFreeParams, \
0818 SOA_VIEW_LAYOUT_LIST(LAYOUTS_LIST), SOA_VIEW_VALUE_LIST(VALUE_LIST))
0819
0820
0821
0822
0823
0824 #define _VIEW_FIELD_FROM_LAYOUT_IMPL(VALUE_TYPE, CPP_TYPE, NAME, DATA) (DATA, NAME, NAME)
0825
0826 #define _VIEW_FIELD_FROM_LAYOUT(R, DATA, VALUE_TYPE_NAME) \
0827 BOOST_PP_EXPAND((_VIEW_FIELD_FROM_LAYOUT_IMPL BOOST_PP_TUPLE_PUSH_BACK(VALUE_TYPE_NAME, DATA)))
0828
0829 #endif