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