Sketcher: GeometryFacade inheritance correctness
- Make explicit private inheritance of the interface - Correct inheritance of ExternalGeometryFacade - Correct inheritance of ExternalGeometryExtension - Better document the inheritance choice
This commit is contained in:
committed by
abdullahtahiriyo
parent
645535234a
commit
485b0b58a0
@@ -33,7 +33,7 @@ using namespace Sketcher;
|
||||
|
||||
//---------- Geometry Extension
|
||||
|
||||
constexpr std::array<const char *, ISketchExternalGeometryExtension::NumFlags> ISketchExternalGeometryExtension::flag2str;
|
||||
constexpr std::array<const char *, ExternalGeometryExtension::NumFlags> ExternalGeometryExtension::flag2str;
|
||||
|
||||
TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension,Part::GeometryExtension)
|
||||
|
||||
|
||||
@@ -32,20 +32,6 @@ namespace Sketcher
|
||||
|
||||
class ISketchExternalGeometryExtension
|
||||
{
|
||||
public:
|
||||
// START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) <realthunder.dev@gmail.com>
|
||||
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) <realthunder.dev@gmail.com>
|
||||
|
||||
constexpr static std::array<const char *,NumFlags> flag2str {{ "Defining", "Frozen", "Detached","Missing", "Sync" }};
|
||||
|
||||
public:
|
||||
// Identification information
|
||||
// START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) <realthunder.dev@gmail.com>
|
||||
@@ -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) <realthunder.dev@gmail.com>
|
||||
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) <realthunder.dev@gmail.com>
|
||||
|
||||
constexpr static std::array<const char *,NumFlags> flag2str {{ "Defining", "Frozen", "Detached","Missing", "Sync" }};
|
||||
public:
|
||||
|
||||
ExternalGeometryExtension() = default;
|
||||
virtual ~ExternalGeometryExtension() override = default;
|
||||
|
||||
@@ -55,7 +55,7 @@ std::string ExternalGeometryExtensionPy::representation(void) const
|
||||
|
||||
bool first=true;
|
||||
|
||||
for(size_t i=0;i<ISketchExternalGeometryExtension::NumFlags;i++) {
|
||||
for(size_t i=0;i<ExternalGeometryExtension::NumFlags;i++) {
|
||||
if(getExternalGeometryExtensionPtr()->testFlag(i)) {
|
||||
if(first) {
|
||||
first=false;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user