@@ -813,4 +813,298 @@ SOA_HOST_ONLY std::ostream& operator<<(std::ostream& os, const SOA& soa) {
813813 return os;
814814}
815815
816+ namespace cms ::soa {
817+ // Helper function for streaming column
818+ template <typename T>
819+ void printColumn (std::ostream& soa_impl_os,
820+ const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
821+ std::string_view name,
822+ cms::soa::byte_size_type& soa_impl_offset,
823+ cms::soa::size_type,
824+ cms::soa::byte_size_type alignment) {
825+ soa_impl_os << " Scalar " << name << " at offset " << soa_impl_offset << " has size " << sizeof (T)
826+ << " and padding " << ((sizeof (T) - 1 ) / alignment + 1 ) * alignment - sizeof (T) << std::endl;
827+ soa_impl_offset += ((sizeof (T) - 1 ) / alignment + 1 ) * alignment;
828+ }
829+
830+ template <typename T>
831+ void printColumn (std::ostream& soa_impl_os,
832+ const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
833+ std::string_view name,
834+ cms::soa::byte_size_type& soa_impl_offset,
835+ cms::soa::size_type elements,
836+ cms::soa::byte_size_type alignment) {
837+ soa_impl_os << " Column " << name << " at offset " << soa_impl_offset << " has size " << sizeof (T) * elements
838+ << " and padding " << cms::soa::alignSize (elements * sizeof (T), alignment) - (elements * sizeof (T))
839+ << std::endl;
840+ soa_impl_offset += cms::soa::alignSize (elements * sizeof (T), alignment);
841+ }
842+
843+ template <typename T>
844+ void printColumn (std::ostream& soa_impl_os,
845+ const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
846+ std::string_view name,
847+ cms::soa::byte_size_type& soa_impl_offset,
848+ cms::soa::size_type elements,
849+ cms::soa::byte_size_type alignment) {
850+ soa_impl_os << " Eigen value " << name << " at offset " << soa_impl_offset << " has dimension "
851+ << " (" << T::RowsAtCompileTime << " x " << T::ColsAtCompileTime << " )"
852+ << " and per column size " << sizeof (T::Scalar) * elements << " and padding "
853+ << cms::soa::alignSize (elements * sizeof (T::Scalar), alignment) - (elements * sizeof (T::Scalar))
854+ << std::endl;
855+ soa_impl_offset +=
856+ cms::soa::alignSize (elements * sizeof (T::Scalar), alignment) * T::RowsAtCompileTime * T::ColsAtCompileTime;
857+ }
858+
859+ // Helper functions for accumulating column elements
860+ template <typename ColumnType>
861+ struct AccumulateSoAElements ;
862+
863+ template <typename T>
864+ struct AccumulateSoAElements <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
865+ cms::soa::byte_size_type operator ()(cms::soa::size_type, cms::soa::byte_size_type alignment) const {
866+ return cms::soa::alignSize (sizeof (T), alignment);
867+ }
868+ };
869+
870+ template <typename T>
871+ struct AccumulateSoAElements <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
872+ cms::soa::byte_size_type operator ()(cms::soa::size_type elements, cms::soa::byte_size_type alignment) const {
873+ return cms::soa::alignSize (elements * sizeof (T), alignment);
874+ }
875+ };
876+
877+ template <typename T>
878+ struct AccumulateSoAElements <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
879+ cms::soa::byte_size_type operator ()(cms::soa::size_type elements, cms::soa::byte_size_type alignment) const {
880+ return cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
881+ T::ColsAtCompileTime;
882+ }
883+ };
884+
885+ // Helper functions for computing the pitch of each column
886+ template <typename T>
887+ cms::soa::byte_size_type computePitch (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
888+ cms::soa::byte_size_type alignment,
889+ cms::soa::size_type elements) {
890+ return cms::soa::alignSize (sizeof (T), alignment);
891+ }
892+
893+ template <typename T>
894+ cms::soa::byte_size_type computePitch (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
895+ cms::soa::byte_size_type alignment,
896+ cms::soa::size_type elements) {
897+ return cms::soa::alignSize (elements * sizeof (T), alignment);
898+ }
899+
900+ template <typename T>
901+ cms::soa::byte_size_type computePitch (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
902+ cms::soa::byte_size_type alignment,
903+ cms::soa::size_type elements) {
904+ return cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
905+ T::ColsAtCompileTime;
906+ }
907+
908+ // Helper type trait for obtaining a span type for a column
909+ template <typename ColumnType>
910+ struct getSpanType ;
911+
912+ template <typename T>
913+ struct getSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
914+ using type = std::span<T, 1 >;
915+ };
916+
917+ template <typename T>
918+ struct getSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
919+ using type = std::span<T>;
920+ };
921+
922+ template <typename T>
923+ struct getSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
924+ using type = std::span<typename T::Scalar>;
925+ };
926+
927+ template <typename T>
928+ struct getSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
929+ using type = std::span<T, 1 >;
930+ };
931+
932+ template <typename T>
933+ struct getSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
934+ using type = std::span<T>;
935+ };
936+
937+ template <typename T>
938+ struct getSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
939+ using type = std::span<typename T::Scalar>;
940+ };
941+
942+ // Helper type trait for obtaining a const-span type for a column
943+ template <typename ColumnType>
944+ struct getConstSpanType ;
945+
946+ template <typename T>
947+ struct getConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
948+ using type = std::span<std::add_const_t <T>, 1 >;
949+ };
950+
951+ template <typename T>
952+ struct getConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
953+ using type = std::span<std::add_const_t <T>>;
954+ };
955+
956+ template <typename T>
957+ struct getConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
958+ using type = std::span<std::add_const_t <typename T::Scalar>>;
959+ };
960+
961+ template <typename T>
962+ struct getConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
963+ using type = std::span<std::add_const_t <T>, 1 >;
964+ };
965+
966+ template <typename T>
967+ struct getConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
968+ using type = std::span<std::add_const_t <T>>;
969+ };
970+
971+ template <typename T>
972+ struct getConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
973+ using type = std::span<std::add_const_t <typename T::Scalar>>;
974+ };
975+
976+ // Helper functions for constructing a span from a column
977+ template <typename T>
978+ auto assignSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
979+ cms::soa::size_type,
980+ cms::soa::byte_size_type alignment) {
981+ return std::span (column.addr_ , 1 );
982+ }
983+
984+ template <typename T>
985+ auto assignSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
986+ cms::soa::size_type elements,
987+ cms::soa::byte_size_type alignment) {
988+ return std::span (column.addr_ , elements);
989+ }
990+
991+ template <typename T>
992+ auto assignSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
993+ cms::soa::size_type elements,
994+ cms::soa::byte_size_type alignment) {
995+ return std::span (column.addr_ ,
996+ cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
997+ T::ColsAtCompileTime / sizeof (typename T::Scalar));
998+ }
999+
1000+ template <typename T>
1001+ auto assignSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
1002+ cms::soa::size_type elements,
1003+ cms::soa::byte_size_type alignment) {
1004+ return std::span (column.addr_ , 1 );
1005+ }
1006+
1007+ template <typename T>
1008+ auto assignSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
1009+ cms::soa::size_type elements,
1010+ cms::soa::byte_size_type alignment) {
1011+ return std::span (column.addr_ , elements);
1012+ }
1013+
1014+ template <typename T>
1015+ auto assignSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1016+ cms::soa::size_type elements,
1017+ cms::soa::byte_size_type alignment) {
1018+ return std::span (column.addr_ ,
1019+ cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
1020+ T::ColsAtCompileTime / sizeof (typename T::Scalar));
1021+ }
1022+
1023+ // TODO: This function can be used when the layout will contain ColumnTypes as members
1024+ // Helper functions for memcpy from file column
1025+ // template <typename T>
1026+ // void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& destColumn,
1027+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& originColumn) {
1028+ // memcpy(destColumn.addr_, originColumn.addr_, sizeof(T));
1029+ // }
1030+
1031+ // template <typename T>
1032+ // void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& destColumn,
1033+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& originColumn) {
1034+ // memcpy(destColumn.addr_, originColumn.addr_, originColumn.elements_ * sizeof(T));
1035+ // }
1036+
1037+ // template <typename T>
1038+ // void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& destColumn,
1039+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& originColumn) {
1040+ // memcpy(destColumn.addr_,
1041+ // originColumn.addr_,
1042+ // sizeof(T::Scalar) * destColumn.ElementsWithPadding);
1043+ // }
1044+
1045+ // TODO: This function can be used when the layout will contain ColumnTypes as members
1046+ // // Helper functions for memcpy from view column
1047+ // template <typename T>
1048+ // void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& destColumn,
1049+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& originColumn) {
1050+ // memcpy(destColumn.addr_, originColumn.addr_, sizeof(T));
1051+ // }
1052+
1053+ // template <typename T>
1054+ // void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& destColumn,
1055+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& originColumn) {
1056+ // memcpy(destColumn.addr_, originColumn.addr_, originColumn.elements_ * sizeof(T));
1057+ // }
1058+
1059+ // template <typename T>
1060+ // void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& destColumn,
1061+ // const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& originColumn) {
1062+ // for (auto i = 0u; i < T::RowsAtCompileTime * T::ColsAtCompileTime; ++i) {
1063+ // memcpy(destColumn.addr_ + i * destColumn.stride_,
1064+ // originColumn.addr_,
1065+ // sizeof(T::Scalar) * destColumn.stride_ * T::RowsAtCompileTime * T::ColsAtCompileTime);
1066+ // }
1067+ // }
1068+
1069+ // TODO: This function can be used when the layout will contain ColumnTypes as members
1070+ // Helper functions for computing the location of columns in memory
1071+ // computeColumnPosition(BOOST_PP_CAT(typename Metadata::ParametersTypeOf_, NAME)(), BOOST_PP_CAT(NAME, _), _soa_impl_curMem, alignment, elements_);
1072+ // template <typename T>
1073+ // void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>&& column,
1074+ // T*& columnAddr,
1075+ // std::byte*& currMem,
1076+ // cms::soa::byte_size_type alignment,
1077+ // cms::soa::size_type elements) {
1078+ // using ColumnType = decltype(column);
1079+ // //column = ColumnType(reinterpret_cast<T*>(currMem), elements);
1080+ // columnAddr = reinterpret_cast<T*>(currMem);
1081+ // currMem += cms::soa::alignSize(sizeof(T), alignment);
1082+ // }
1083+
1084+ // template <typename T>
1085+ // void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>&& column,
1086+ // T*& columnAddr,
1087+ // std::byte*& currMem,
1088+ // cms::soa::byte_size_type alignment,
1089+ // cms::soa::size_type elements) {
1090+ // using ColumnType = decltype(column);
1091+ // //column = ColumnType(reinterpret_cast<T*>(currMem), elements);
1092+ // columnAddr = reinterpret_cast<T*>(currMem);
1093+ // currMem += cms::soa::alignSize(elements * sizeof(T), alignment);
1094+ // }
1095+
1096+ // template <typename T>
1097+ // void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>&& column,
1098+ // typename T::Scalar*& columnAddr,
1099+ // std::byte*& currMem,
1100+ // cms::soa::byte_size_type alignment,
1101+ // cms::soa::size_type elements) {
1102+ // using ColumnType = decltype(column);
1103+ // //column = ColumnType(reinterpret_cast<T::Scalar*>(currMem),
1104+ // columnAddr = reinterpret_cast<T::Scalar*>(currMem);
1105+ // currMem += cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
1106+ // T::ColsAtCompileTime;
1107+ // }
1108+ } // namespace cms::soa
1109+
8161110#endif // DataFormats_SoATemplate_interface_SoACommon_h
0 commit comments