Salome HOME
Cleare Macros for easy atribute initialization in C++HighAPI interfaces
authorspo <sergey.pokhodenko@opencascade.com>
Fri, 27 May 2016 12:26:16 +0000 (15:26 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Fri, 17 Jun 2016 11:41:02 +0000 (14:41 +0300)
14 files changed:
CMakeCommon/PythonAPI.cmake
doc/swig/doxyfile.in
doc/tui/doxyfile.in
src/ConstructionAPI/ConstructionAPI_Point.cpp
src/ConstructionAPI/ConstructionAPI_Point.h
src/ConstructionAPI/Test/TestPoint.cpp
src/ModelAPI/ModelAPI_AttributeSelection.h
src/ModelHighAPI/CMakeLists.txt
src/ModelHighAPI/ModelHighAPI.i
src/ModelHighAPI/ModelHighAPI_Interface.cpp
src/ModelHighAPI/ModelHighAPI_Interface.h
src/ModelHighAPI/ModelHighAPI_Macro.h [new file with mode: 0644]
src/ModelHighAPI/ModelHighAPI_swig.h
src/ModelHighAPI/Test/TestDouble.cpp

index 123354160bae37625156141db8c2facf6f0aa8ff..c6f311bac7a047af8f878a221d38850a15b2bb2a 100644 (file)
@@ -33,5 +33,5 @@ endforeach()
 add_custom_command(OUTPUT doxyhelp.i
   COMMAND "${DOXYGEN_EXECUTABLE}"
   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/doxy2swig.py xml/index.xml doxyhelp.i
-  DEPENDS ${doc_sources}
+  DEPENDS ${doc_sources} ${PROJECT_SOURCE_DIR}/doc/swig/doxyfile.in
 )
index bffdb82f1e8019e11f0b36f20e49868f7a95818c..60b3b276e883e848234e2edd9a34ad5776d95e3d 100644 (file)
@@ -251,7 +251,7 @@ ENABLE_PREPROCESSING   = YES
 MACRO_EXPANSION        = YES
 EXPAND_ONLY_PREDEF     = NO
 SEARCH_INCLUDES        = YES
-INCLUDE_PATH           =
+INCLUDE_PATH           = @PROJECT_SOURCE_DIR@/src/ModelHighAPI
 INCLUDE_FILE_PATTERNS  =
 PREDEFINED = Standard_EXPORT __Standard_API __Draw_API Handle(a):=Handle DEFINE_STANDARD_ALLOC DEFINE_NCOLLECTION_ALLOC DEFINE_STANDARD_HANDLE DEFINE_STANDARD_RTTI
 EXPAND_AS_DEFINED      =
index 8cbc0235772f874d716f47e8fed38201505785a1..538e959257ae461dd503fd6f48ea1c2f66fa53d8 100644 (file)
@@ -1578,7 +1578,7 @@ SEARCH_INCLUDES        = YES
 # contain include files that are not input files but should be processed by
 # the preprocessor.
 
-INCLUDE_PATH           =
+INCLUDE_PATH           = @PROJECT_SOURCE_DIR@/src/ModelHighAPI
 
 # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
 # patterns (like *.h and *.hpp) to filter out the header-files in the
index 7464536c43ec5abccf12bf4407d358883d6bab72..e28a96bb4445c97db7c28a8b59b12d8aa57a03f2 100644 (file)
@@ -27,10 +27,8 @@ ConstructionAPI_Point::ConstructionAPI_Point(
     const ModelHighAPI_Double & theZ)
 : ModelHighAPI_Interface(theFeature)
 {
-  if (initialize()) {
+  if (initialize())
     setPoint(theX, theY, theZ);
-    execute();
-  }
 }
 
 ConstructionAPI_Point::~ConstructionAPI_Point()
@@ -38,52 +36,16 @@ ConstructionAPI_Point::~ConstructionAPI_Point()
 
 }
 
-//--------------------------------------------------------------------------------------
-bool ConstructionAPI_Point::initialize()
-{
-  if (!myFeature) {
-    throwException("ConstructionAPI_Point exception: The feature is NULL.");
-    return false;
-  }
-
-  if (feature()->getKind() != "Point") {
-    throwException("ConstructionAPI_Point exception: Wrong feature kind.");
-    return false;
-  }
-
-  // data() throws exceptions if the attribute is invalid
-  myX = feature()->real("x");
-  myY = feature()->real("y");
-  myZ = feature()->real("z");
-
-  if (!myX || !myY || !myZ)
-    return false;
-
-  return true;
-}
-
 //--------------------------------------------------------------------------------------
 void ConstructionAPI_Point::setPoint(const ModelHighAPI_Double & theX,
                                      const ModelHighAPI_Double & theY,
                                      const ModelHighAPI_Double & theZ)
 {
-  theX.fillAttribute(myX);
-  theY.fillAttribute(myY);
-  theZ.fillAttribute(myZ);
-}
+  theX.fillAttribute(myx);
+  theY.fillAttribute(myy);
+  theZ.fillAttribute(myz);
 
-//--------------------------------------------------------------------------------------
-std::shared_ptr<ModelAPI_AttributeDouble> ConstructionAPI_Point::x() const
-{
-  return myX;
-}
-std::shared_ptr<ModelAPI_AttributeDouble> ConstructionAPI_Point::y() const
-{
-  return myY;
-}
-std::shared_ptr<ModelAPI_AttributeDouble> ConstructionAPI_Point::z() const
-{
-  return myZ;
+  execute();
 }
 
 //--------------------------------------------------------------------------------------
index 4df2ded9792f8c660e51cf204c5ae3143e196059..aef5b8150ad4f0e236215f4efd78db29963ac42c 100644 (file)
@@ -11,6 +11,7 @@
 #include "ConstructionAPI.h"
 
 #include <ModelHighAPI_Interface.h>
+#include <ModelHighAPI_Macro.h>
 //--------------------------------------------------------------------------------------
 class ModelAPI_AttributeDouble;
 class ModelAPI_Document;
@@ -33,25 +34,18 @@ public:
   /// Destructor
   virtual ~ConstructionAPI_Point();
 
+  INTERFACE_3("Point",
+              x, "x", Double, /** X attribute */,
+              y, "y", Double, /** Y attribute */,
+              z, "z", Double, /** Z attribute */)
+
   /// Set point values
   void setPoint(const ModelHighAPI_Double & theX,
                 const ModelHighAPI_Double & theY,
                 const ModelHighAPI_Double & theZ);
-
-  /// X attribute
-  std::shared_ptr<ModelAPI_AttributeDouble> x() const;
-  /// Y attribute
-  std::shared_ptr<ModelAPI_AttributeDouble> y() const;
-  /// Z attribute
-  std::shared_ptr<ModelAPI_AttributeDouble> z() const;
-
-protected:
-  std::shared_ptr<ModelAPI_AttributeDouble> myX, myY, myZ;
-
-  bool initialize();
 };
 
-//! Pointer on point object
+//! Pointer on Point object
 typedef std::shared_ptr<ConstructionAPI_Point> PointPtr;
 
 /**\ingroup CPPHighAPI
index b136b03675f83e3f963f8afa04c0d5e421d86be1..b053d5f6ca502ca8d4a198e93089cde12ebc5682 100644 (file)
@@ -117,7 +117,8 @@ TEST_F(ConstructionAPI_Point_Constructor_Test, GetFeatureAndValues) {
   ConstructionAPI_Point aPoint(aFeature, 10, "20", std::string("x + 30"));
 }
 
-TEST_F(ConstructionAPI_Point_Constructor_Test, addPointWithValues) {
+
+TEST_F(ConstructionAPI_Point_Constructor_Test, addPoint) {
   DocumentPtr aDocument(&aMockDocument, &null_deleter);
 
   EXPECT_CALL(aMockDocument, addFeature("Point", true));
index 61b1979a0b2c1643f126059a716fe8b556948649..896b007591d3ba757e3072008f15f669c067d12b 100644 (file)
@@ -49,7 +49,7 @@ class ModelAPI_AttributeSelection : public ModelAPI_Attribute
   /// Returns a textual string of the selection
   /// \param theDefaultValue a value, which is used if the naming name can not be obtained
   virtual std::string namingName(const std::string& theDefaultValue = "") = 0;
-  
+
   /// Returns an id of the selection
   virtual int Id() = 0;
 
index 7ae927be6c8500bbca98943576b42366acaacd92..c9fa67ca823bd7492d017a34236fd308c08aa018 100644 (file)
@@ -6,6 +6,7 @@ SET(PROJECT_HEADERS
   ModelHighAPI.h
   ModelHighAPI_Double.h
   ModelHighAPI_Interface.h
+  ModelHighAPI_Macro.h
 )
 
 SET(PROJECT_SOURCES
index 754aa77074e4e36e9c7b08abd52e4c79ce4b013b..19a930efa7033b69d6eedb300a4b59a3cd9df51a 100644 (file)
@@ -40,3 +40,4 @@
 // all supported interfaces
 %include "ModelHighAPI_Double.h"
 %include "ModelHighAPI_Interface.h"
+%include "ModelHighAPI_Macro.h"
index a72146ab6446472580d523d334285e20912c7f28..e5a81879b60666638e283fe2d1aa742e0ab9e049 100644 (file)
@@ -28,6 +28,11 @@ std::shared_ptr<ModelAPI_Feature> ModelHighAPI_Interface::feature() const
   return myFeature;
 }
 
+const std::string& ModelHighAPI_Interface::getKind()
+{
+  return feature()->getKind();
+}
+
 void ModelHighAPI_Interface::execute()
 {
   feature()->execute();
index 4393b480736d1da945131d5d0f29a729855f73bd..295d870365e9a7205d4a050f5c3a31cd2ce36841 100644 (file)
@@ -28,6 +28,9 @@ public:
   /// Return ModelAPI_Feature
   std::shared_ptr<ModelAPI_Feature> feature() const;
 
+  /// Shortcut for feature()->getKind()
+  const std::string& getKind();
+
   /// Shortcut for feature()->execute()
   void execute();
 
diff --git a/src/ModelHighAPI/ModelHighAPI_Macro.h b/src/ModelHighAPI/ModelHighAPI_Macro.h
new file mode 100644 (file)
index 0000000..a00b075
--- /dev/null
@@ -0,0 +1,272 @@
+// Name   : ModelHighAPI_Macro.h
+// Purpose:
+//
+// History:
+// 27/05/16 - Sergey POKHODENKO - Creation of the file
+
+#ifndef SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
+#define SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
+
+//--------------------------------------------------------------------------------------
+#include <ModelAPI_Feature.h>
+
+//--------------------------------------------------------------------------------------
+// See ModelAPI_Feature functions
+#define FN_Boolean boolean
+#define FN_DocRef document
+#define FN_Double real
+#define FN_Integer integer
+#define FN_RefAttr refattr
+#define FN_Reference reference
+#define FN_RefList reflist
+#define FN_Selection selection
+#define FN_SelectionList selectionList
+#define FN_String string
+
+//--------------------------------------------------------------------------------------
+#define VAR_NAME(NAME) my##NAME
+
+//--------------------------------------------------------------------------------------
+// Used in INTERFACE_N for create variable and getter
+#define DEFINE_ATTRIBUTE(NAME, TYPE, COMMENT) \
+    COMMENT \
+    std::shared_ptr<ModelAPI_Attribute##TYPE> NAME() const { return VAR_NAME(NAME); } \
+  protected: \
+    std::shared_ptr<ModelAPI_Attribute##TYPE> VAR_NAME(NAME); \
+  public:
+
+//--------------------------------------------------------------------------------------
+// Used in INTERFACE_N inside START_INIT/END_INIT for set variable with attribute received from feature
+#define SET_ATTRIBUTE(NAME, TYPE, ATT_NAME) \
+  VAR_NAME(NAME) = feature()->FN_##TYPE(ATT_NAME); \
+  if (!VAR_NAME(NAME)) \
+    return false;
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_COMMON(KIND) \
+  static std::string ID() { return KIND; }
+
+//--------------------------------------------------------------------------------------
+#define START_INIT() \
+  bool initialize() { \
+    if (!feature()) { \
+      throwException(ID() + " exception: The feature is NULL."); \
+      return false; \
+    } \
+    if (getKind() != ID()) { \
+      throwException(ID() + " exception: Wrong feature kind."); \
+      return false; \
+    }
+
+//--------------------------------------------------------------------------------------
+#define END_INIT() \
+    return true; \
+  }
+
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_2(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_3(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_4(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_5(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3, \
+                    N_4, AN_4, T_4, C_4) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+      SET_ATTRIBUTE(N_4, T_4, AN_4) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_6(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3, \
+                    N_4, AN_4, T_4, C_4, \
+                    N_5, AN_5, T_5, C_5) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
+    DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+      SET_ATTRIBUTE(N_4, T_4, AN_4) \
+      SET_ATTRIBUTE(N_5, T_5, AN_5) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_7(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3, \
+                    N_4, AN_4, T_4, C_4, \
+                    N_5, AN_5, T_5, C_5, \
+                    N_6, AN_6, T_6, C_6) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
+    DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
+    DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+      SET_ATTRIBUTE(N_4, T_4, AN_4) \
+      SET_ATTRIBUTE(N_5, T_5, AN_5) \
+      SET_ATTRIBUTE(N_6, T_6, AN_6) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_8(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3, \
+                    N_4, AN_4, T_4, C_4, \
+                    N_5, AN_5, T_5, C_5, \
+                    N_6, AN_6, T_6, C_6, \
+                    N_7, AN_7, T_7, C_7) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
+    DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
+    DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
+    DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+      SET_ATTRIBUTE(N_4, T_4, AN_4) \
+      SET_ATTRIBUTE(N_5, T_5, AN_5) \
+      SET_ATTRIBUTE(N_6, T_6, AN_6) \
+      SET_ATTRIBUTE(N_7, T_7, AN_7) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#define INTERFACE_9(KIND, \
+                    N_0, AN_0, T_0, C_0, \
+                    N_1, AN_1, T_1, C_1, \
+                    N_2, AN_2, T_2, C_2, \
+                    N_3, AN_3, T_3, C_3, \
+                    N_4, AN_4, T_4, C_4, \
+                    N_5, AN_5, T_5, C_5, \
+                    N_6, AN_6, T_6, C_6, \
+                    N_7, AN_7, T_7, C_7, \
+                    N_8, AN_8, T_8, C_8) \
+  public: \
+    INTERFACE_COMMON(KIND) \
+    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
+    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
+    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
+    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
+    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
+    DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
+    DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
+    DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
+    DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
+  protected: \
+    START_INIT() \
+      SET_ATTRIBUTE(N_0, T_0, AN_0) \
+      SET_ATTRIBUTE(N_1, T_1, AN_1) \
+      SET_ATTRIBUTE(N_2, T_2, AN_2) \
+      SET_ATTRIBUTE(N_3, T_3, AN_3) \
+      SET_ATTRIBUTE(N_4, T_4, AN_4) \
+      SET_ATTRIBUTE(N_5, T_5, AN_5) \
+      SET_ATTRIBUTE(N_6, T_6, AN_6) \
+      SET_ATTRIBUTE(N_7, T_7, AN_7) \
+      SET_ATTRIBUTE(N_8, T_8, AN_8) \
+    END_INIT() \
+  public:
+
+//--------------------------------------------------------------------------------------
+#endif /* SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_ */
index 63b3b1b43de664282d19f2457a3e9e474a7d0f09..eba21331f161bc2040389722eff1b9742c07a179 100644 (file)
@@ -11,5 +11,6 @@
 
   #include "ModelHighAPI_Double.h"
   #include "ModelHighAPI_Interface.h"
+  #include "ModelHighAPI_Macro.h"
 
 #endif /* SRC_MODELHIGHAPI_MODELHIGHAPI_SWIG_H_ */
index 23c47a5d3459ac5ecefda86295a29012cb518ffe..546db2d73f96a479e17f453f6fc4ea61722447c5 100644 (file)
@@ -35,9 +35,9 @@ TEST_F(HighModelAPI_Double_Test, Default) {
 }
 
 TEST_F(HighModelAPI_Double_Test, Double) {
-  ModelHighAPI_Double aValue(100);
+  ModelHighAPI_Double aValue(100.5);
 
-  EXPECT_CALL(aMockAttributeDouble, setValue(100.));
+  EXPECT_CALL(aMockAttributeDouble, setValue(100.5));
 
   aValue.fillAttribute(anAttributeDouble);
 }