From 485b0b58a0a303e8edaabfb8fa5a689cadda720d Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sat, 7 Nov 2020 08:36:24 +0100 Subject: [PATCH] Sketcher: GeometryFacade inheritance correctness - Make explicit private inheritance of the interface - Correct inheritance of ExternalGeometryFacade - Correct inheritance of ExternalGeometryExtension - Better document the inheritance choice --- .../App/ExternalGeometryExtension.cpp | 2 +- .../Sketcher/App/ExternalGeometryExtension.h | 29 +++++++++---------- .../App/ExternalGeometryExtensionPyImp.cpp | 2 +- src/Mod/Sketcher/App/ExternalGeometryFacade.h | 2 +- .../App/ExternalGeometryFacadePyImp.cpp | 16 +++++----- src/Mod/Sketcher/App/GeometryFacade.h | 7 +++-- .../Sketcher/App/SketchGeometryExtension.h | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp index f229e690e3..aeaa434cd7 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp @@ -33,7 +33,7 @@ using namespace Sketcher; //---------- Geometry Extension -constexpr std::array ISketchExternalGeometryExtension::flag2str; +constexpr std::array ExternalGeometryExtension::flag2str; TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension,Part::GeometryExtension) diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.h b/src/Mod/Sketcher/App/ExternalGeometryExtension.h index 58557fdc1f..d6501d829e 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.h +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.h @@ -32,20 +32,6 @@ namespace Sketcher class ISketchExternalGeometryExtension { -public: - // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) - enum Flag { - Defining = 0, // allow an external geometry to build shape - Frozen = 1, // freeze an external geometry - Detached = 2, // signal the intentions of detaching the geometry from external reference - Missing = 3, // geometry with missing external reference - Sync = 4, // signal the intention to synchronize a frozen geometry - NumFlags // Must be the last type - }; - // END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) - - constexpr static std::array flag2str {{ "Defining", "Frozen", "Detached","Missing", "Sync" }}; - public: // Identification information // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) @@ -60,10 +46,23 @@ public: virtual void setRef(const std::string & ref) = 0; }; -class SketcherExport ExternalGeometryExtension : public Part::GeometryExtension, public ISketchExternalGeometryExtension +class SketcherExport ExternalGeometryExtension : public Part::GeometryExtension, private ISketchExternalGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: + // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) + enum Flag { + Defining = 0, // allow an external geometry to build shape + Frozen = 1, // freeze an external geometry + Detached = 2, // signal the intentions of detaching the geometry from external reference + Missing = 3, // geometry with missing external reference + Sync = 4, // signal the intention to synchronize a frozen geometry + NumFlags // Must be the last type + }; + // END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) + + constexpr static std::array flag2str {{ "Defining", "Frozen", "Detached","Missing", "Sync" }}; +public: ExternalGeometryExtension() = default; virtual ~ExternalGeometryExtension() override = default; diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtensionPyImp.cpp b/src/Mod/Sketcher/App/ExternalGeometryExtensionPyImp.cpp index f1addee140..bdf010574c 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtensionPyImp.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryExtensionPyImp.cpp @@ -55,7 +55,7 @@ std::string ExternalGeometryExtensionPy::representation(void) const bool first=true; - for(size_t i=0;itestFlag(i)) { if(first) { first=false; diff --git a/src/Mod/Sketcher/App/ExternalGeometryFacade.h b/src/Mod/Sketcher/App/ExternalGeometryFacade.h index 9f5bda7895..9f6cb94063 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryFacade.h +++ b/src/Mod/Sketcher/App/ExternalGeometryFacade.h @@ -45,7 +45,7 @@ class ExternalGeometryFacadePy; // It is intended to have a separate type (not being a Geometry type). // it is intended to have the relevant interface in full for the sketcher extension only // It is intended to work on borrowed memory allocation. -class SketcherExport ExternalGeometryFacade : public Base::BaseClass, public ISketchGeometryExtension, public ISketchExternalGeometryExtension +class SketcherExport ExternalGeometryFacade : public Base::BaseClass, private ISketchGeometryExtension, private ISketchExternalGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); diff --git a/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp b/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp index 8c19125f54..a8e122194f 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp @@ -87,12 +87,12 @@ PyObject* ExternalGeometryFacadePy::testFlag(PyObject *args) char* flag; if (PyArg_ParseTuple(args, "s",&flag)) { - auto pos = std::find_if(getExternalGeometryFacadePtr()->flag2str.begin(), - getExternalGeometryFacadePtr()->flag2str.end(), + auto pos = std::find_if(ExternalGeometryExtension::flag2str.begin(), + ExternalGeometryExtension::flag2str.end(), [flag](const char * val) { return strcmp(val,flag) == 0;}); - if( pos != getExternalGeometryFacadePtr()->flag2str.end()) { - int index = std::distance( getExternalGeometryFacadePtr()->flag2str.begin(), pos ); + if( pos != ExternalGeometryExtension::flag2str.end()) { + int index = std::distance( ExternalGeometryExtension::flag2str.begin(), pos ); return new_reference_to(Py::Boolean(this->getExternalGeometryFacadePtr()->testFlag(index))); } @@ -112,14 +112,14 @@ PyObject* ExternalGeometryFacadePy::setFlag(PyObject *args) PyObject * bflag = Py_True; if (PyArg_ParseTuple(args, "s|O!", &flag, &PyBool_Type, &bflag)) { - auto pos = std::find_if(getExternalGeometryFacadePtr()->flag2str.begin(), - getExternalGeometryFacadePtr()->flag2str.end(), + auto pos = std::find_if(ExternalGeometryExtension::flag2str.begin(), + ExternalGeometryExtension::flag2str.end(), [flag](const char * val) { return strcmp(val,flag)==0;} ); - if( pos != getExternalGeometryFacadePtr()->flag2str.end()) { - int index = std::distance( getExternalGeometryFacadePtr()->flag2str.begin(), pos ); + if( pos != ExternalGeometryExtension::flag2str.end()) { + int index = std::distance( ExternalGeometryExtension::flag2str.begin(), pos ); this->getExternalGeometryFacadePtr()->setFlag(index,PyObject_IsTrue(bflag) ? true : false); Py_Return; diff --git a/src/Mod/Sketcher/App/GeometryFacade.h b/src/Mod/Sketcher/App/GeometryFacade.h index f9252a405f..6e491b3978 100644 --- a/src/Mod/Sketcher/App/GeometryFacade.h +++ b/src/Mod/Sketcher/App/GeometryFacade.h @@ -38,8 +38,9 @@ namespace Sketcher class GeometryFacadePy; // This class is a Facade to handle geometry and sketcher geometry extensions with a single sketcher specific interface // -// The inherits and thus provides the same interface as the extension. It does not inherit from Part::Geometry and thus -// is intended to provide, in part a convenience subset of the interface of Part::Geometry, in part a different interface. +// The facade privately inherits from a common interface it shares with the extension thereby implementing a compiler enforced +// same interface as the extension. It does not inherit from Part::Geometry and thus is intended to provide, in part a convenience +// subset of the interface of Part::Geometry, in part a different interface. // // GeometryFacade has private constructors and objects may only be created using the getFacade factory methods. // @@ -73,7 +74,7 @@ class GeometryFacadePy; // It is intended to have a separate type (not being a Geometry type). // it is intended to have the relevant interface in full for the sketcher extension only // It is intended to work on borrowed memory allocation. -class SketcherExport GeometryFacade : public Base::BaseClass, ISketchGeometryExtension +class SketcherExport GeometryFacade : public Base::BaseClass, private ISketchGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.h b/src/Mod/Sketcher/App/SketchGeometryExtension.h index 774816c588..1211d97cc2 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.h +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.h @@ -38,7 +38,7 @@ public: virtual void setId(long id) = 0; }; -class SketcherExport SketchGeometryExtension : public Part::GeometryExtension, ISketchGeometryExtension +class SketcherExport SketchGeometryExtension : public Part::GeometryExtension, private ISketchGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: