@@ -813,4 +813,222 @@ SOA_HOST_ONLY std::ostream& operator<<(std::ostream& os, const SOA& soa) {
813813 return os;
814814}
815815
816+ namespace cms ::soa::detail {
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 AccumulateColumnByteSizes ;
862+
863+ template <typename T>
864+ struct AccumulateColumnByteSizes <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 AccumulateColumnByteSizes <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 AccumulateColumnByteSizes <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+ SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch (
888+ const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
889+ cms::soa::byte_size_type alignment,
890+ cms::soa::size_type elements) {
891+ return cms::soa::alignSize (sizeof (T), alignment);
892+ }
893+
894+ template <typename T>
895+ SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch (
896+ const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
897+ cms::soa::byte_size_type alignment,
898+ cms::soa::size_type elements) {
899+ return cms::soa::alignSize (elements * sizeof (T), alignment);
900+ }
901+
902+ template <typename T>
903+ SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch (
904+ const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
905+ cms::soa::byte_size_type alignment,
906+ cms::soa::size_type elements) {
907+ return cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
908+ T::ColsAtCompileTime;
909+ }
910+
911+ // Helper type trait for obtaining a span type for a column
912+ template <typename ColumnType>
913+ struct GetSpanType ;
914+
915+ template <typename T>
916+ struct GetSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
917+ using type = std::span<T, 1 >;
918+ };
919+
920+ template <typename T>
921+ struct GetSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
922+ using type = std::span<T>;
923+ };
924+
925+ template <typename T>
926+ struct GetSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
927+ using type = std::span<typename T::Scalar>;
928+ };
929+
930+ template <typename T>
931+ struct GetSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
932+ using type = std::span<T, 1 >;
933+ };
934+
935+ template <typename T>
936+ struct GetSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
937+ using type = std::span<T>;
938+ };
939+
940+ template <typename T>
941+ struct GetSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
942+ using type = std::span<typename T::Scalar>;
943+ };
944+
945+ template <typename ColumnType>
946+ using SpanType = GetSpanType<ColumnType>::type;
947+
948+ // Helper type trait for obtaining a const-span type for a column
949+ template <typename ColumnType>
950+ struct GetConstSpanType ;
951+
952+ template <typename T>
953+ struct GetConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
954+ using type = std::span<std::add_const_t <T>, 1 >;
955+ };
956+
957+ template <typename T>
958+ struct GetConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
959+ using type = std::span<std::add_const_t <T>>;
960+ };
961+
962+ template <typename T>
963+ struct GetConstSpanType <cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
964+ using type = std::span<std::add_const_t <typename T::Scalar>>;
965+ };
966+
967+ template <typename T>
968+ struct GetConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
969+ using type = std::span<std::add_const_t <T>, 1 >;
970+ };
971+
972+ template <typename T>
973+ struct GetConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
974+ using type = std::span<std::add_const_t <T>>;
975+ };
976+
977+ template <typename T>
978+ struct GetConstSpanType <cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
979+ using type = std::span<std::add_const_t <typename T::Scalar>>;
980+ };
981+
982+ template <typename ColumnType>
983+ using ConstSpanType = GetConstSpanType<ColumnType>::type;
984+
985+ // Helper functions for constructing a span from a column
986+ template <typename T>
987+ auto getSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
988+ cms::soa::size_type,
989+ cms::soa::byte_size_type alignment) {
990+ return std::span (column.addr_ , 1 );
991+ }
992+
993+ template <typename T>
994+ auto getSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
995+ cms::soa::size_type elements,
996+ cms::soa::byte_size_type alignment) {
997+ return std::span (column.addr_ , elements);
998+ }
999+
1000+ template <typename T>
1001+ auto getSpanToColumn (const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1002+ cms::soa::size_type elements,
1003+ cms::soa::byte_size_type alignment) {
1004+ return std::span (column.addr_ ,
1005+ cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
1006+ T::ColsAtCompileTime / sizeof (typename T::Scalar));
1007+ }
1008+
1009+ template <typename T>
1010+ auto getSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
1011+ cms::soa::size_type elements,
1012+ cms::soa::byte_size_type alignment) {
1013+ return std::span (column.addr_ , 1 );
1014+ }
1015+
1016+ template <typename T>
1017+ auto getSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
1018+ cms::soa::size_type elements,
1019+ cms::soa::byte_size_type alignment) {
1020+ return std::span (column.addr_ , elements);
1021+ }
1022+
1023+ template <typename T>
1024+ auto getSpanToColumn (const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1025+ cms::soa::size_type elements,
1026+ cms::soa::byte_size_type alignment) {
1027+ return std::span (column.addr_ ,
1028+ cms::soa::alignSize (elements * sizeof (typename T::Scalar), alignment) * T::RowsAtCompileTime *
1029+ T::ColsAtCompileTime / sizeof (typename T::Scalar));
1030+ }
1031+
1032+ } // namespace cms::soa::detail
1033+
8161034#endif // DataFormats_SoATemplate_interface_SoACommon_h
0 commit comments