From 6b56da60384f18b04194ea54d23af27643d27ae5 Mon Sep 17 00:00:00 2001
From: Peter Van Gemmeren <peter.van.gemmeren@cern.ch>
Date: Fri, 20 May 2016 20:51:54 +0200
Subject: [PATCH] DataHeaderCnv_p5 contain DataHeaderForm by pointer, rather
 than copy (PersistentDataModelTPCnv-00-02-11)

	* src/DataHeaderCnv_p5: Contain DataHeaderForm by pointer, rather than copy.
	* tag PersistentDataModelTPCnv-00-02-11


Former-commit-id: 27c5c2972b0a0c99a80fc689c22e5c60c283ddf7
---
 .../PersistentDataModelTPCnv/DataHeader_p5.h  |  6 +-
 .../src/DataHeaderCnv_p5.cxx                  | 63 ++++++++++---------
 .../src/DataHeader_p5.cxx                     | 46 +++++++-------
 3 files changed, 61 insertions(+), 54 deletions(-)

diff --git a/Database/PersistentDataModelTPCnv/PersistentDataModelTPCnv/DataHeader_p5.h b/Database/PersistentDataModelTPCnv/PersistentDataModelTPCnv/DataHeader_p5.h
index 79ef61e44c90..c54bc8a6d104 100755
--- a/Database/PersistentDataModelTPCnv/PersistentDataModelTPCnv/DataHeader_p5.h
+++ b/Database/PersistentDataModelTPCnv/PersistentDataModelTPCnv/DataHeader_p5.h
@@ -83,15 +83,15 @@ public: // Constructor and Destructor
 friend class DataHeaderCnv_p5;
 
    const std::vector<DataHeaderElement_p5>& elements() const;
-   const DataHeaderForm_p5& dhForm() const;
-   void setDhForm(const DataHeaderForm_p5& form);
+   const DataHeaderForm_p5* dhForm() const;
+   void setDhForm(DataHeaderForm_p5* form);
    const std::string& dhFormToken() const;
    void setDhFormToken(const std::string& formToken);
    const std::string& dhFormMdx() const;
 
 private:
    std::vector<DataHeaderElement_p5> m_dataHeader;
-   DataHeaderForm_p5 m_dhForm;
+   DataHeaderForm_p5* m_dhForm;
    std::string m_dhFormToken;
    std::string m_dhFormMdx;
 };
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
index 0efb9ab70cf0..9e2bfb98d926 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
@@ -210,51 +210,56 @@ DataHeaderCnv_p5::DataHeaderCnv_p5() {}
 DataHeaderCnv_p5::~DataHeaderCnv_p5() {}
 //______________________________________________________________________________
 void DataHeaderCnv_p5::persToTrans(const DataHeader_p5* pers, DataHeader* trans) {
-   pers->m_dhForm.start();
-   const unsigned int provSize = pers->m_dhForm.params()[0];
-   trans->m_inputDataHeader.resize(provSize);
-   std::vector<DataHeaderElement>::iterator it = trans->m_inputDataHeader.begin();
-   std::vector<DataHeaderElement_p5>::const_iterator pit = pers->m_dataHeader.begin();
-   for (unsigned int i = 0U; i < provSize; i++, it++, pit++) {
-      pers->m_dhForm.next();
-      m_elemCnv.persToTrans(&(*pit), &(*it), pers->m_dhForm);
-   }
-   trans->m_dataHeader.resize(pers->m_dataHeader.size() - provSize);
-   it = trans->m_dataHeader.begin();
-   for (std::vector<DataHeaderElement_p5>::const_iterator last = pers->m_dataHeader.end();
-		   pit != last; it++, pit++) {
-      pers->m_dhForm.next();
-      m_elemCnv.persToTrans(&(*pit), &(*it), pers->m_dhForm);
+   if (pers->m_dhForm) {
+      pers->m_dhForm->start();
+      const unsigned int provSize = pers->m_dhForm->params()[0];
+      trans->m_inputDataHeader.resize(provSize);
+      std::vector<DataHeaderElement>::iterator it = trans->m_inputDataHeader.begin();
+      std::vector<DataHeaderElement_p5>::const_iterator pit = pers->m_dataHeader.begin();
+      for (unsigned int i = 0U; i < provSize; i++, it++, pit++) {
+         pers->m_dhForm->next();
+         m_elemCnv.persToTrans(&(*pit), &(*it), *pers->m_dhForm);
+      }
+      trans->m_dataHeader.resize(pers->m_dataHeader.size() - provSize);
+      it = trans->m_dataHeader.begin();
+      for (std::vector<DataHeaderElement_p5>::const_iterator last = pers->m_dataHeader.end();
+		      pit != last; it++, pit++) {
+         pers->m_dhForm->next();
+         m_elemCnv.persToTrans(&(*pit), &(*it), *pers->m_dhForm);
+      }
    }
 }
 //______________________________________________________________________________
 void DataHeaderCnv_p5::transToPers(const DataHeader* trans, DataHeader_p5* pers) {
+   delete pers->m_dhForm; pers->m_dhForm = new DataHeaderForm_p5;
    const unsigned int provSize = trans->m_inputDataHeader.size();
    pers->m_dataHeader.resize(provSize + trans->m_dataHeader.size());
-   pers->m_dhForm.resize(provSize + trans->m_dataHeader.size() + 2);
-   pers->m_dhForm.start();
-   pers->m_dhForm.insertParam(provSize);
+   pers->m_dhForm->resize(provSize + trans->m_dataHeader.size() + 2);
+   pers->m_dhForm->start();
+   pers->m_dhForm->insertParam(provSize);
    std::vector<DataHeaderElement_p5>::iterator pit = pers->m_dataHeader.begin();
    for (std::vector<DataHeaderElement>::const_iterator it = trans->m_inputDataHeader.begin(),
 		   last = trans->m_inputDataHeader.end(); it != last; it++, pit++) {
-      pers->m_dhForm.next();
-      m_elemCnv.transToPers(&(*it), &(*pit), pers->m_dhForm);
+      pers->m_dhForm->next();
+      m_elemCnv.transToPers(&(*it), &(*pit), *pers->m_dhForm);
    }
    for (std::vector<DataHeaderElement>::const_iterator it = trans->m_dataHeader.begin(),
 		   last = trans->m_dataHeader.end(); it != last; it++, pit++) {
-      pers->m_dhForm.next();
-      m_elemCnv.transToPers(&(*it), &(*pit), pers->m_dhForm);
+      pers->m_dhForm->next();
+      m_elemCnv.transToPers(&(*it), &(*pit), *pers->m_dhForm);
    }
 }
 //______________________________________________________________________________
 void DataHeaderCnv_p5::insertDHRef(DataHeader_p5* pers,
 	const std::string& key,
 	const std::string& strToken) {
-   Token* token = new Token;
-   token->fromString(strToken);
-   DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token);
-   DataHeaderElement_p5 pEle;
-   pers->m_dhForm.next();
-   m_elemCnv.transToPers(&tEle, &pEle, pers->m_dhForm);
-   pers->m_dataHeader.push_back(pEle);
+   if (pers->m_dhForm) {
+      Token* token = new Token;
+      token->fromString(strToken);
+      DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token);
+      DataHeaderElement_p5 pEle;
+      pers->m_dhForm->next();
+      m_elemCnv.transToPers(&tEle, &pEle, *pers->m_dhForm);
+      pers->m_dataHeader.push_back(pEle);
+   }
 }
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeader_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeader_p5.cxx
index 0d577295de63..57d0423e9e61 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeader_p5.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeader_p5.cxx
@@ -84,9 +84,9 @@ void DataHeaderForm_p5::resize(unsigned int size) {
 }
 
 
-DataHeader_p5::DataHeader_p5() : m_dataHeader(), m_dhForm(), m_dhFormToken(), m_dhFormMdx() {}
+DataHeader_p5::DataHeader_p5() : m_dataHeader(), m_dhForm(0), m_dhFormToken(), m_dhFormMdx() {}
 DataHeader_p5::DataHeader_p5(const DataHeader_p5& rhs) : m_dataHeader(rhs.m_dataHeader),
-	m_dhForm(rhs.m_dhForm),
+	m_dhForm(0),
 	m_dhFormToken(rhs.m_dhFormToken),
 	m_dhFormMdx(rhs.m_dhFormMdx) {}
 DataHeader_p5::~DataHeader_p5() {}
@@ -94,7 +94,7 @@ DataHeader_p5::~DataHeader_p5() {}
 DataHeader_p5& DataHeader_p5::operator=(const DataHeader_p5& rhs) {
    if (this != &rhs) {
       m_dataHeader = rhs.m_dataHeader;
-      m_dhForm = rhs.m_dhForm;
+      m_dhForm = 0;
       m_dhFormToken = rhs.m_dhFormToken;
       m_dhFormMdx = rhs.m_dhFormMdx;
    }
@@ -105,11 +105,11 @@ const std::vector<DataHeaderElement_p5>& DataHeader_p5::elements() const {
    return(m_dataHeader);
 }
 
-const DataHeaderForm_p5& DataHeader_p5::dhForm() const {
+const DataHeaderForm_p5* DataHeader_p5::dhForm() const {
    return(m_dhForm);
 }
 
-void DataHeader_p5::setDhForm(const DataHeaderForm_p5& form) {
+void DataHeader_p5::setDhForm(DataHeaderForm_p5* form) {
    m_dhForm = form;
 }
 
@@ -118,25 +118,27 @@ const std::string& DataHeader_p5::dhFormToken() const {
 }
 
 void DataHeader_p5::setDhFormToken(const std::string& formToken) {
-   m_dhFormToken = formToken;
-   std::ostringstream stream;
-   for (std::vector<std::string>::const_iterator iter = m_dhForm.map().begin(),
-		   last = m_dhForm.map().end(); iter != last; iter++) {
-      stream << *iter << "\n";
-   }
-   for (m_dhForm.start(); m_dhForm.entry() <= m_dhForm.size(); m_dhForm.next()) {
-      for (std::vector<unsigned int>::const_iterator iter = m_dhForm.params().begin(),
-		      last = m_dhForm.params().end(); iter != last; iter++) {
-         stream << *iter << ",";
+   if (m_dhForm) {
+      m_dhFormToken = formToken;
+      std::ostringstream stream;
+      for (std::vector<std::string>::const_iterator iter = m_dhForm->map().begin(),
+		      last = m_dhForm->map().end(); iter != last; iter++) {
+         stream << *iter << "\n";
+      }
+      for (m_dhForm->start(); m_dhForm->entry() <= m_dhForm->size(); m_dhForm->next()) {
+         for (std::vector<unsigned int>::const_iterator iter = m_dhForm->params().begin(),
+		         last = m_dhForm->params().end(); iter != last; iter++) {
+            stream << *iter << ",";
+         }
+         stream << "\n";
       }
-      stream << "\n";
+      MD5 checkSum((unsigned char*)stream.str().c_str(), stream.str().size());
+      uuid_t checkSumUuid;
+      checkSum.raw_digest((unsigned char*)(&checkSumUuid));
+      char text[37];
+      uuid_unparse_upper(checkSumUuid, text);
+      m_dhFormMdx = text;
    }
-   MD5 checkSum((unsigned char*)stream.str().c_str(), stream.str().size());
-   uuid_t checkSumUuid;
-   checkSum.raw_digest((unsigned char*)(&checkSumUuid));
-   char text[37];
-   uuid_unparse_upper(checkSumUuid, text);
-   m_dhFormMdx = text;
 }
 const std::string& DataHeader_p5::dhFormMdx() const {
    return(m_dhFormMdx);
-- 
GitLab