From b6073190689b7b70c0fa52c649899a8e17c3158d Mon Sep 17 00:00:00 2001
From: Simon Heybrock <simon.heybrock@esss.se>
Date: Thu, 25 Aug 2016 09:32:33 +0200
Subject: [PATCH] Re #0. MatrixWorkspace::cloneEmpty() - polymorphic default
 ctor.

Conflicts:
	Framework/API/inc/MantidAPI/MatrixWorkspace.h
---
 Framework/API/inc/MantidAPI/IEventWorkspace.h             | 5 +++++
 Framework/API/inc/MantidAPI/MatrixWorkspace.h             | 6 ++++++
 .../DataObjects/inc/MantidDataObjects/EventWorkspace.h    | 6 ++++++
 .../DataObjects/inc/MantidDataObjects/GroupingWorkspace.h | 8 ++++++++
 .../DataObjects/inc/MantidDataObjects/MaskWorkspace.h     | 5 +++++
 .../DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h  | 7 +++++++
 .../DataObjects/inc/MantidDataObjects/RebinnedOutput.h    | 5 +++++
 .../inc/MantidDataObjects/SpecialWorkspace2D.h            | 7 +++++++
 Framework/DataObjects/inc/MantidDataObjects/Workspace2D.h | 6 ++++++
 .../inc/MantidDataObjects/WorkspaceSingleValue.h          | 7 +++++++
 Framework/TestHelpers/inc/MantidTestHelpers/FakeObjects.h | 3 +++
 11 files changed, 65 insertions(+)

diff --git a/Framework/API/inc/MantidAPI/IEventWorkspace.h b/Framework/API/inc/MantidAPI/IEventWorkspace.h
index d5e415fcc35..fcd06d77672 100644
--- a/Framework/API/inc/MantidAPI/IEventWorkspace.h
+++ b/Framework/API/inc/MantidAPI/IEventWorkspace.h
@@ -41,6 +41,10 @@ public:
   IEventWorkspace &operator=(const IEventWorkspace &) = delete;
   /// Returns a clone of the workspace
   IEventWorkspace_uptr clone() const { return IEventWorkspace_uptr(doClone()); }
+  /// Returns a default-initialized clone of the workspace
+  IEventWorkspace_uptr cloneEmpty() const {
+    return IEventWorkspace_uptr(doCloneEmpty());
+  }
 
   IEventList &getSpectrum(const size_t index) override = 0;
   const IEventList &getSpectrum(const size_t index) const override = 0;
@@ -71,6 +75,7 @@ protected:
 
 private:
   IEventWorkspace *doClone() const override = 0;
+  IEventWorkspace *doCloneEmpty() const override = 0;
 };
 }
 }
diff --git a/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Framework/API/inc/MantidAPI/MatrixWorkspace.h
index ded88a97b87..bccd3b4caee 100644
--- a/Framework/API/inc/MantidAPI/MatrixWorkspace.h
+++ b/Framework/API/inc/MantidAPI/MatrixWorkspace.h
@@ -88,6 +88,11 @@ public:
   /// Returns a clone of the workspace
   MatrixWorkspace_uptr clone() const { return MatrixWorkspace_uptr(doClone()); }
 
+  /// Returns a default-initialized clone of the workspace
+  MatrixWorkspace_uptr cloneEmpty() const {
+    return MatrixWorkspace_uptr(doCloneEmpty());
+  }
+
   Indexing::IndexTranslator indexTranslator() const;
   void setIndexTranslator(const Indexing::IndexTranslator &translator);
 
@@ -596,6 +601,7 @@ protected:
 
 private:
   MatrixWorkspace *doClone() const override = 0;
+  virtual MatrixWorkspace *doCloneEmpty() const = 0;
 
   /// Create an MantidImage instance.
   MantidImage_sptr
diff --git a/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h b/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h
index a3411f19ad2..2a815f91b35 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h
@@ -40,6 +40,11 @@ public:
     return std::unique_ptr<EventWorkspace>(doClone());
   }
 
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<EventWorkspace> cloneEmpty() const {
+    return std::unique_ptr<EventWorkspace>(doCloneEmpty());
+  }
+
   // Initialize the pixels
   void init(const std::size_t &, const std::size_t &,
             const std::size_t &) override;
@@ -142,6 +147,7 @@ protected:
 
 private:
   EventWorkspace *doClone() const override { return new EventWorkspace(*this); }
+  EventWorkspace *doCloneEmpty() const override { return new EventWorkspace(); }
 
   /** A vector that holds the event list for each spectrum; the key is
    * the workspace index, which is not necessarily the pixelid.
diff --git a/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h b/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
index 9fd6844e6af..50f21824e37 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
@@ -30,6 +30,11 @@ public:
     return std::unique_ptr<GroupingWorkspace>(doClone());
   }
 
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<GroupingWorkspace> cloneEmpty() const {
+    return std::unique_ptr<GroupingWorkspace>(doCloneEmpty());
+  }
+
   /** Gets the name of the workspace type
   @return Standard string name  */
   const std::string id() const override { return "GroupingWorkspace"; }
@@ -47,6 +52,9 @@ private:
   GroupingWorkspace *doClone() const override {
     return new GroupingWorkspace(*this);
   }
+  GroupingWorkspace *doCloneEmpty() const override {
+    return new GroupingWorkspace();
+  }
 };
 
 /// shared pointer to the GroupingWorkspace class
diff --git a/Framework/DataObjects/inc/MantidDataObjects/MaskWorkspace.h b/Framework/DataObjects/inc/MantidDataObjects/MaskWorkspace.h
index 890ce04a7c5..a71caabb1c7 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/MaskWorkspace.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/MaskWorkspace.h
@@ -23,6 +23,10 @@ public:
   std::unique_ptr<MaskWorkspace> clone() const {
     return std::unique_ptr<MaskWorkspace>(doClone());
   }
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<MaskWorkspace> cloneEmpty() const {
+    return std::unique_ptr<MaskWorkspace>(doCloneEmpty());
+  }
   MaskWorkspace &operator=(const MaskWorkspace &other) = delete;
   bool isMasked(const detid_t detectorID) const override;
   bool isMasked(const std::set<detid_t> &detectorIDs) const override;
@@ -49,6 +53,7 @@ protected:
 
 private:
   MaskWorkspace *doClone() const override { return new MaskWorkspace(*this); }
+  MaskWorkspace *doCloneEmpty() const override { return new MaskWorkspace(); }
 
   IMaskWorkspace *doInterfaceClone() const override { return doClone(); };
   /// Clear original incorrect mask
diff --git a/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h b/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
index d65930ac0de..b3108ad69bb 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
@@ -25,6 +25,10 @@ public:
   std::unique_ptr<OffsetsWorkspace> clone() const {
     return std::unique_ptr<OffsetsWorkspace>(doClone());
   }
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<OffsetsWorkspace> cloneEmpty() const {
+    return std::unique_ptr<OffsetsWorkspace>(doCloneEmpty());
+  }
   OffsetsWorkspace &operator=(const OffsetsWorkspace &) = delete;
   /** Gets the name of the workspace type
   @return Standard string name  */
@@ -38,6 +42,9 @@ private:
   OffsetsWorkspace *doClone() const override {
     return new OffsetsWorkspace(*this);
   }
+  OffsetsWorkspace *doCloneEmpty() const override {
+    return new OffsetsWorkspace();
+  }
 };
 
 /// shared pointer to the OffsetsWorkspace class
diff --git a/Framework/DataObjects/inc/MantidDataObjects/RebinnedOutput.h b/Framework/DataObjects/inc/MantidDataObjects/RebinnedOutput.h
index efa14bbd806..66ded0f1acc 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/RebinnedOutput.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/RebinnedOutput.h
@@ -45,6 +45,10 @@ public:
   std::unique_ptr<RebinnedOutput> clone() const {
     return std::unique_ptr<RebinnedOutput>(doClone());
   }
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<RebinnedOutput> cloneEmpty() const {
+    return std::unique_ptr<RebinnedOutput>(doCloneEmpty());
+  }
   RebinnedOutput &operator=(const RebinnedOutput &) = delete;
 
   /// Get the workspace ID.
@@ -80,6 +84,7 @@ protected:
 
 private:
   RebinnedOutput *doClone() const override { return new RebinnedOutput(*this); }
+  RebinnedOutput *doCloneEmpty() const override { return new RebinnedOutput(); }
 };
 
 /// shared pointer to the RebinnedOutput class
diff --git a/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h b/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
index 374df4c5d80..e9e7b58ad47 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
@@ -34,6 +34,10 @@ public:
   std::unique_ptr<SpecialWorkspace2D> clone() const {
     return std::unique_ptr<SpecialWorkspace2D>(doClone());
   }
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<SpecialWorkspace2D> cloneEmpty() const {
+    return std::unique_ptr<SpecialWorkspace2D>(doCloneEmpty());
+  }
   SpecialWorkspace2D &operator=(const SpecialWorkspace2D &) = delete;
   /** Gets the name of the workspace type
   @return Standard string name  */
@@ -59,6 +63,9 @@ private:
   SpecialWorkspace2D *doClone() const override {
     return new SpecialWorkspace2D(*this);
   }
+  SpecialWorkspace2D *doCloneEmpty() const override {
+    return new SpecialWorkspace2D();
+  }
   bool isCompatible(boost::shared_ptr<const SpecialWorkspace2D> ws);
 
 protected:
diff --git a/Framework/DataObjects/inc/MantidDataObjects/Workspace2D.h b/Framework/DataObjects/inc/MantidDataObjects/Workspace2D.h
index ef23193e15e..21e6eddc80f 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/Workspace2D.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/Workspace2D.h
@@ -57,6 +57,11 @@ public:
     return std::unique_ptr<Workspace2D>(doClone());
   }
 
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<Workspace2D> cloneEmpty() const {
+    return std::unique_ptr<Workspace2D>(doCloneEmpty());
+  }
+
   /// Returns the histogram number
   std::size_t getNumberHistograms() const override;
 
@@ -110,6 +115,7 @@ protected:
 
 private:
   Workspace2D *doClone() const override { return new Workspace2D(*this); }
+  Workspace2D *doCloneEmpty() const override { return new Workspace2D(); }
 
   virtual std::size_t getHistogramNumberHelper() const;
 };
diff --git a/Framework/DataObjects/inc/MantidDataObjects/WorkspaceSingleValue.h b/Framework/DataObjects/inc/MantidDataObjects/WorkspaceSingleValue.h
index 8611903746a..596e61bc02c 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/WorkspaceSingleValue.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/WorkspaceSingleValue.h
@@ -47,6 +47,10 @@ public:
   std::unique_ptr<WorkspaceSingleValue> clone() const {
     return std::unique_ptr<WorkspaceSingleValue>(doClone());
   }
+  /// Returns a default-initialized clone of the workspace
+  std::unique_ptr<WorkspaceSingleValue> cloneEmpty() const {
+    return std::unique_ptr<WorkspaceSingleValue>(doCloneEmpty());
+  }
   WorkspaceSingleValue &operator=(const WorkspaceSingleValue &other) = delete;
   /// Returns the number of single indexable items in the workspace
   std::size_t size() const override { return 1; }
@@ -75,6 +79,9 @@ private:
   WorkspaceSingleValue *doClone() const override {
     return new WorkspaceSingleValue(*this);
   }
+  WorkspaceSingleValue *doCloneEmpty() const override {
+    return new WorkspaceSingleValue();
+  }
 
   // allocates space in a new workspace - does nothing in this case
   void init(const std::size_t &NVectors, const std::size_t &XLength,
diff --git a/Framework/TestHelpers/inc/MantidTestHelpers/FakeObjects.h b/Framework/TestHelpers/inc/MantidTestHelpers/FakeObjects.h
index b142e477c8b..40481b5279f 100644
--- a/Framework/TestHelpers/inc/MantidTestHelpers/FakeObjects.h
+++ b/Framework/TestHelpers/inc/MantidTestHelpers/FakeObjects.h
@@ -160,6 +160,9 @@ private:
   WorkspaceTester *doClone() const override {
     throw std::runtime_error("Cloning of WorkspaceTester is not implemented.");
   }
+  WorkspaceTester *doCloneEmpty() const override {
+    throw std::runtime_error("Cloning of WorkspaceTester is not implemented.");
+  }
   std::vector<SpectrumTester> vec;
   size_t spec;
 };
-- 
GitLab