From f1234f1f7f0d5ce93d806beb02b7758a8b1c9855 Mon Sep 17 00:00:00 2001
From: Wouter Hulsbergen <wouter.hulsbergen@nikhef.nl>
Date: Mon, 22 Jan 2024 15:35:34 +0100
Subject: [PATCH] forward debug output for SOA container packing

---
 Event/EventPacker/include/Event/PackedDataBuffer.h   | 12 ++++++------
 .../src/component/BufferSOAPackerBaseAlg.h           |  8 +++++---
 .../src/component/BufferSOAUnpackerBaseAlg.h         |  3 ++-
 .../src/component/BufferUnpackerBaseAlg.h            |  2 +-
 Event/EventPacker/src/component/SelectivePacker.cpp  |  3 ++-
 5 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/Event/EventPacker/include/Event/PackedDataBuffer.h b/Event/EventPacker/include/Event/PackedDataBuffer.h
index 69a73f681b6..d3dfd02949c 100644
--- a/Event/EventPacker/include/Event/PackedDataBuffer.h
+++ b/Event/EventPacker/include/Event/PackedDataBuffer.h
@@ -374,10 +374,10 @@ namespace LHCb::Hlt::PackedData {
       for ( const auto& object : v ) PackedData::save( soabuf, object );
     }
     /// Save a soa object
-    template <typename T>
+    template <bool debug, typename T>
     auto save( const T& object ) -> decltype( object.pack( this->m_buffer ), std::pair<std::size_t, std::size_t>() ) {
       auto index0 = m_buffer.pos();
-      object.template pack<true>( this->m_buffer );
+      object.template pack<debug>( this->m_buffer );
       return {index0, m_buffer.pos() - index0};
     }
   };
@@ -508,18 +508,18 @@ namespace LHCb::Hlt::PackedData {
     }
 
     /// Save a soa object
-    template <typename T>
+    template <bool debug, typename T>
     auto save( const T& object ) -> decltype( object.pack( this->m_buffer ), std::pair<std::size_t, std::size_t>() ) {
       auto index0 = m_buffer.pos();
-      object.template pack<true>( m_buffer );
+      object.template pack<debug>( m_buffer );
       return {index0, m_buffer.pos() - index0};
     }
 
     /// Load a soa object.
-    template <typename T>
+    template <bool debug, typename T>
     auto load( T& object ) -> decltype( object.unpack( this->m_buffer ), std::size_t() ) {
       auto index0 = m_buffer.pos();
-      object.template unpack<true>( m_buffer );
+      object.template unpack<debug>( m_buffer );
       return m_buffer.pos() - index0;
     }
   };
diff --git a/Event/EventPacker/src/component/BufferSOAPackerBaseAlg.h b/Event/EventPacker/src/component/BufferSOAPackerBaseAlg.h
index f012a57afb6..4946eec588a 100644
--- a/Event/EventPacker/src/component/BufferSOAPackerBaseAlg.h
+++ b/Event/EventPacker/src/component/BufferSOAPackerBaseAlg.h
@@ -72,8 +72,9 @@ namespace DataPacking::Buffer::SOA {
           unsigned int nlinks = 0;
           buffer.saveSize( nlinks );
 
-          auto oSize1 = buffer.saveSize( 0 );                     // get position from this one
-          auto oSize2 = buffer.save( *data );                     // get size from this one
+          auto oSize1 = buffer.saveSize( 0 ); // get position from this one
+          auto oSize2 = this->msgLevel( MSG::DEBUG ) ? buffer.save<true>( *data )
+                                                     : buffer.save<false>( *data ); // get size from this one
           buffer.saveAt<uint32_t>( oSize2.second, oSize1.first ); // save the correct size of the object
 
           if ( m_enableCheck ) {
@@ -84,7 +85,8 @@ namespace DataPacking::Buffer::SOA {
             while ( !test_buffer.eof() ) {
               LHCb::Hlt::PackedData::ObjectHeader header{test_buffer};
 
-              std::size_t nbytes = test_buffer.load( unpacked );
+              std::size_t nbytes = this->msgLevel( MSG::DEBUG ) ? test_buffer.load<true>( unpacked )
+                                                                : test_buffer.load<false>( unpacked );
 
               if ( nbytes != header.storedSize )
                 this->error() << "Unpacking check failed "
diff --git a/Event/EventPacker/src/component/BufferSOAUnpackerBaseAlg.h b/Event/EventPacker/src/component/BufferSOAUnpackerBaseAlg.h
index 65810d3b4a1..7fe8ca9ba29 100644
--- a/Event/EventPacker/src/component/BufferSOAUnpackerBaseAlg.h
+++ b/Event/EventPacker/src/component/BufferSOAUnpackerBaseAlg.h
@@ -57,7 +57,8 @@ namespace DataPacking::Buffer::SOA {
 
       while ( !readBuffer.eof() ) {
         LHCb::Hlt::PackedData::ObjectHeader header{readBuffer};
-        auto                                nBytesRead = readBuffer.load( data );
+        auto const                          nBytesRead =
+            this->msgLevel( MSG::DEBUG ) ? readBuffer.load<true>( data ) : readBuffer.load<false>( data );
 
         if ( nBytesRead != header.storedSize ) {
           this->fatal() << "Loading of object (CLID=" << header.classID << " locationID=" << header.locationID << ") "
diff --git a/Event/EventPacker/src/component/BufferUnpackerBaseAlg.h b/Event/EventPacker/src/component/BufferUnpackerBaseAlg.h
index 29e38af5379..619a617d06d 100644
--- a/Event/EventPacker/src/component/BufferUnpackerBaseAlg.h
+++ b/Event/EventPacker/src/component/BufferUnpackerBaseAlg.h
@@ -283,7 +283,7 @@ namespace LHCb::Hlt::PackedData {
     auto   data            = std::make_unique<DataVector>();
     using PackedDataVector = LHCb::Packers::Traits::packed_representation<DataVector>;
     if constexpr ( std::is_same<DataVector, PackedDataVector>::value ) {
-      nBytesRead = buffer.load( *data );
+      nBytesRead = loader.msgLevel( MSG::DEBUG ) ? buffer.load<true>( *data ) : buffer.load<false>( *data );
       if ( nBytesRead != header.storedSize ) return Unexpected{ErrorCode::INCONSISTENT_SIZE};
       if ( !buffer.eof() ) {
         loader.warning() << " buffer not eof??? while restoring "
diff --git a/Event/EventPacker/src/component/SelectivePacker.cpp b/Event/EventPacker/src/component/SelectivePacker.cpp
index cb4c9d89778..1c8d43f0b51 100644
--- a/Event/EventPacker/src/component/SelectivePacker.cpp
+++ b/Event/EventPacker/src/component/SelectivePacker.cpp
@@ -532,7 +532,8 @@ namespace LHCb {
             auto posObjectSize = buffer.saveSize( 0 ).first;
 
             // Save the object actual object and see how many bytes were written
-            auto objectSize = buffer.save( data ).second;
+            auto objectSize =
+                parent().msgLevel( MSG::DEBUG ) ? buffer.save<true>( data ).second : buffer.save<false>( data ).second;
 
             // Save the object's size in the correct position
             buffer.saveAt<uint32_t>( objectSize, posObjectSize );
-- 
GitLab