← Back to team overview

kicad-developers team mailing list archive

[PATCH v2] Make EDA_ITEM::Clone() abstract

 

---
 3d-viewer/3d_material.h                    | 3 +++
 3d-viewer/3d_struct.h                      | 2 ++
 common/base_struct.cpp                     | 7 -------
 eeschema/class_libentry.h                  | 6 ++++++
 eeschema/class_sch_screen.h                | 3 +++
 gerbview/class_gbr_screen.h                | 3 +++
 gerbview/class_gerber_draw_item.h          | 2 ++
 include/base_struct.h                      | 9 +--------
 include/class_pcb_screen.h                 | 3 +++
 include/origin_viewitem.h                  | 3 +++
 include/worksheet_viewitem.h               | 3 +++
 pagelayout_editor/class_pl_editor_screen.h | 3 +++
 pagelayout_editor/pl_editor_undo_redo.cpp  | 3 +++
 pcbnew/class_board.h                       | 3 +++
 pcbnew/class_marker_pcb.h                  | 3 +++
 pcbnew/class_netinfo.h                     | 2 ++
 pcbnew/ratsnest_viewitem.h                 | 3 +++
 pcbnew/router/router_preview_item.h        | 3 +++
 pcbnew/tools/bright_box.h                  | 2 ++
 pcbnew/tools/edit_points.h                 | 2 ++
 pcbnew/tools/selection_area.h              | 2 ++
 21 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/3d-viewer/3d_material.h b/3d-viewer/3d_material.h
index 3bff7e6..4d8ab53 100644
--- a/3d-viewer/3d_material.h
+++ b/3d-viewer/3d_material.h
@@ -76,6 +76,9 @@ public:
     {
         return wxT( "S3D_MATERIAL" );
     }
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone S3D_MATERIAL" ) ); }
 };
 
 void SetOpenGlDefaultMaterial();
diff --git a/3d-viewer/3d_struct.h b/3d-viewer/3d_struct.h
index fc85567..43d0b65 100644
--- a/3d-viewer/3d_struct.h
+++ b/3d-viewer/3d_struct.h
@@ -169,6 +169,8 @@ private:
     void    calcBBox();
     CBBOX   m_BBox;             ///< Model oriented Bouding Box
     CBBOX   m_fastAABBox;       ///< Axis Align Bounding Box that contain the other bounding boxes
+
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone S3D_MASTER" ) ); }
 };
 
 
diff --git a/common/base_struct.cpp b/common/base_struct.cpp
index 9b6273d..10ca003 100644
--- a/common/base_struct.cpp
+++ b/common/base_struct.cpp
@@ -100,13 +100,6 @@ void EDA_ITEM::SetModified()
 }
 
 
-EDA_ITEM* EDA_ITEM::Clone() const
-{
-    wxCHECK_MSG( false, NULL, wxT( "Clone not implemented in derived class " ) + GetClass() +
-                 wxT( ".  Bad programmer!" ) );
-}
-
-
 SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM*     listStart,
                                         INSPECTOR*    inspector,
                                         const void*   testData,
diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h
index 2359349..21e2cb6 100644
--- a/eeschema/class_libentry.h
+++ b/eeschema/class_libentry.h
@@ -180,6 +180,9 @@ public:
 #if defined(DEBUG)
     void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
 #endif
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone LIB_PART" ) ); }
 };
 
 extern bool operator<( const LIB_ALIAS& aItem1, const LIB_ALIAS& aItem2 );
@@ -772,6 +775,9 @@ public:
 #if defined(DEBUG)
     void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
 #endif
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone LIB_PART" ) ); }
 };
 
 #endif  //  CLASS_LIBENTRY_H
diff --git a/eeschema/class_sch_screen.h b/eeschema/class_sch_screen.h
index a6715f0..7f10f2c 100644
--- a/eeschema/class_sch_screen.h
+++ b/eeschema/class_sch_screen.h
@@ -529,6 +529,9 @@ public:
 #if defined(DEBUG)
     void Show( int nestLevel, std::ostream& os ) const;     // overload
 #endif
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone SCH_SCREEN" ) ); }
 };
 
 
diff --git a/gerbview/class_gbr_screen.h b/gerbview/class_gbr_screen.h
index 19b5f90..b1d13fe 100644
--- a/gerbview/class_gbr_screen.h
+++ b/gerbview/class_gbr_screen.h
@@ -63,6 +63,9 @@ public:
      * virtual pure in BASE_SCREEN, so it must be defined here
      */
     void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 );
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone GBR_SCREEN" ) ); }
 };
 
 
diff --git a/gerbview/class_gerber_draw_item.h b/gerbview/class_gerber_draw_item.h
index 49e3340..f6d3633 100644
--- a/gerbview/class_gerber_draw_item.h
+++ b/gerbview/class_gerber_draw_item.h
@@ -304,6 +304,8 @@ public:
     void Show( int nestLevel, std::ostream& os ) const;  // override
 #endif
 
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone GERBER_DRAW_ITEM" ) ); }
 };
 
 #endif /* CLASS_GERBER_DRAW_ITEM_H */
diff --git a/include/base_struct.h b/include/base_struct.h
index d9903fb..f356828 100644
--- a/include/base_struct.h
+++ b/include/base_struct.h
@@ -332,16 +332,9 @@ public:
      * Function Clone
      * creates a duplicate of this item with linked list members set to NULL.
      *
-     * The default version will return NULL in release builds and likely crash the
-     * program.  In debug builds, a warning message indicating the derived class
-     * has not implemented cloning.  This really should be a pure virtual function.
-     * Due to the fact that there are so many objects derived from EDA_ITEM, the
-     * decision was made to return NULL until all the objects derived from EDA_ITEM
-     * implement cloning.  Once that happens, this function should be made pure.
-     *
      * @return A clone of the item.
      */
-    virtual EDA_ITEM* Clone() const; // should not be inline, to save the ~ 6 bytes per call site.
+    virtual EDA_ITEM* Clone() const = 0;
 
     /**
      * Function IterateForward
diff --git a/include/class_pcb_screen.h b/include/class_pcb_screen.h
index dc65b3d..06ded62 100644
--- a/include/class_pcb_screen.h
+++ b/include/class_pcb_screen.h
@@ -100,6 +100,9 @@ public:
      * So this function can be called to remove old commands
      */
     void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 );
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone PCB_SCREEN" ) ); }
 };
 
 #endif  // CLASS_PCB_SCREEN_H_
diff --git a/include/origin_viewitem.h b/include/origin_viewitem.h
index 02900fb..0f0912d 100644
--- a/include/origin_viewitem.h
+++ b/include/origin_viewitem.h
@@ -138,6 +138,9 @@ protected:
 
     ///> If set, the marker will be drawn even if its position is 0,0
     bool            m_drawAtZero;
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone ORIGIN_VIEWITEM" ) ); }
 };
 
 } // namespace KIGFX
diff --git a/include/worksheet_viewitem.h b/include/worksheet_viewitem.h
index 149f804..ccaa3f0 100644
--- a/include/worksheet_viewitem.h
+++ b/include/worksheet_viewitem.h
@@ -165,6 +165,9 @@ protected:
 
     /// Draws a border that determines the page size.
     void drawBorder( GAL* aGal ) const;
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone ORIGIN_VIEWITEM" ) ); }
 };
 }
 
diff --git a/pagelayout_editor/class_pl_editor_screen.h b/pagelayout_editor/class_pl_editor_screen.h
index 957180f..31d5c3f 100644
--- a/pagelayout_editor/class_pl_editor_screen.h
+++ b/pagelayout_editor/class_pl_editor_screen.h
@@ -74,6 +74,9 @@ public:
      * @param aItem Any object derived from WORKSHEET_DATAITEM
      */
     void SetCurItem( WORKSHEET_DATAITEM* aItem ) { BASE_SCREEN::SetCurItem( (EDA_ITEM*)aItem ); }
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone PL_EDITOR_SCREEN" ) ); }
 };
 
 
diff --git a/pagelayout_editor/pl_editor_undo_redo.cpp b/pagelayout_editor/pl_editor_undo_redo.cpp
index de00b81..cabc8bc 100644
--- a/pagelayout_editor/pl_editor_undo_redo.cpp
+++ b/pagelayout_editor/pl_editor_undo_redo.cpp
@@ -65,6 +65,9 @@ public:
     {
         return wxT( "PL_ITEM_LAYOUT" );
     }
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone PL_ITEM_LAYOUT" ) ); }
 };
 
 void PL_EDITOR_FRAME::SaveCopyInUndoList()
diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h
index ba5241f..245e7ac 100644
--- a/pcbnew/class_board.h
+++ b/pcbnew/class_board.h
@@ -1391,6 +1391,9 @@ public:
      *         aPosition and a pointer to the via are returned.
      */
     TRACK* CreateLockPoint( wxPoint& aPosition, TRACK* aSegment, PICKED_ITEMS_LIST* aList );
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone BOARD" ) ); }
 };
 
 #endif      // CLASS_BOARD_H_
diff --git a/pcbnew/class_marker_pcb.h b/pcbnew/class_marker_pcb.h
index e524ae7..8035b09 100644
--- a/pcbnew/class_marker_pcb.h
+++ b/pcbnew/class_marker_pcb.h
@@ -135,6 +135,9 @@ public:
 protected:
     ///> Pointer to BOARD_ITEM that causes DRC error.
     const BOARD_ITEM* m_item;
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone PCB_MARKER" ) ); }
 };
 
 #endif      //  CLASS_MARKER_PCB_H
diff --git a/pcbnew/class_netinfo.h b/pcbnew/class_netinfo.h
index 82ac8d7..86903c1 100644
--- a/pcbnew/class_netinfo.h
+++ b/pcbnew/class_netinfo.h
@@ -706,6 +706,8 @@ public:
         return m_parent;
     }
 
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone NETINFO_ITEM" ) ); }
 };
 
 
diff --git a/pcbnew/ratsnest_viewitem.h b/pcbnew/ratsnest_viewitem.h
index 8898be8..0ae4edd 100644
--- a/pcbnew/ratsnest_viewitem.h
+++ b/pcbnew/ratsnest_viewitem.h
@@ -70,6 +70,9 @@ public:
 protected:
     ///> Object containing ratsnest data.
     RN_DATA* m_data;
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone RATSNEST_VIEWITEM" ) ); }
 };
 
 }   // namespace KIGFX
diff --git a/pcbnew/router/router_preview_item.h b/pcbnew/router/router_preview_item.h
index 653900d..c40748c 100644
--- a/pcbnew/router/router_preview_item.h
+++ b/pcbnew/router/router_preview_item.h
@@ -122,6 +122,9 @@ private:
 
     KIGFX::COLOR4D m_color;
     VECTOR2I m_pos;
+
+private:
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone ROUTER_PREVIEW_ITEM" ) ); }
 };
 
 #endif
diff --git a/pcbnew/tools/bright_box.h b/pcbnew/tools/bright_box.h
index fc9aeee..86ea561 100644
--- a/pcbnew/tools/bright_box.h
+++ b/pcbnew/tools/bright_box.h
@@ -74,6 +74,8 @@ private:
     static const double LINE_WIDTH;
 
     BOARD_ITEM* m_item;
+
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone BRIGHT_BOX" ) ); }
 };
 
 #endif
diff --git a/pcbnew/tools/edit_points.h b/pcbnew/tools/edit_points.h
index ca9e373..5d7ae5b 100644
--- a/pcbnew/tools/edit_points.h
+++ b/pcbnew/tools/edit_points.h
@@ -525,6 +525,8 @@ private:
     std::deque<EDIT_POINT> m_points;    ///< EDIT_POINTs for modifying m_parent
     std::deque<EDIT_LINE> m_lines;      ///< EDIT_LINEs for modifying m_parent
     std::list<int> m_contours;          ///< Indices of end contour points
+
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone EDIT_POINTS" ) ); }
 };
 
 #endif /* EDIT_POINTS_H_ */
diff --git a/pcbnew/tools/selection_area.h b/pcbnew/tools/selection_area.h
index 737e7be..aceb1e1 100644
--- a/pcbnew/tools/selection_area.h
+++ b/pcbnew/tools/selection_area.h
@@ -79,6 +79,8 @@ public:
 
 private:
     VECTOR2I m_origin, m_end;
+
+    virtual EDA_ITEM* Clone() const { wxCHECK_MSG( false, nullptr, wxT( "Cannot clone SELECTION_AREA" ) ); }
 };
 
 #endif

References