0030683: Coding Rules - eliminate CLang compiler warnings -Wreturn-std-move
[occt.git] / src / TopoDS / TopoDS_Shape.hxx
1 // Created on: 1990-12-11
2 // Created by: Remi Lequette
3 // Copyright (c) 1990-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef _TopoDS_Shape_HeaderFile
18 #define _TopoDS_Shape_HeaderFile
19
20 #include <Standard_DefineAlloc.hxx>
21 #include <Standard_Handle.hxx>
22 #include <TopAbs.hxx>
23 #include <TopAbs_Orientation.hxx>
24 #include <TopLoc_Location.hxx>
25 #include <TopoDS_TShape.hxx>
26
27 // resolve name collisions with X11 headers
28 #ifdef Convex
29   #undef Convex
30 #endif
31
32 //! Describes a shape which
33 //! - references an underlying shape with the potential
34 //! to be given a location and an orientation
35 //! - has a location for the underlying shape, giving its
36 //! placement in the local coordinate system
37 //! - has an orientation for the underlying shape, in
38 //! terms of its geometry (as opposed to orientation in
39 //! relation to other shapes).
40 //! Note: A Shape is empty if it references an underlying
41 //! shape which has an empty list of shapes.
42 class TopoDS_Shape 
43 {
44 public:
45
46   DEFINE_STANDARD_ALLOC
47
48   //! Creates a NULL Shape referring to nothing.
49   TopoDS_Shape() : myOrient (TopAbs_EXTERNAL) {}
50
51 #ifndef OCCT_NO_RVALUE_REFERENCE
52
53   //! Generalized move constructor, accepting also sub-classes
54   //! (TopoDS_Shape hierarchy declares only fake sub-classes with no extra fields).
55   template<class T2>
56   TopoDS_Shape (T2&& theOther, typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value>::type* = 0)
57   : myTShape  (std::forward<T2> (theOther).myTShape),
58     myLocation(std::forward<T2> (theOther).myLocation),
59     myOrient  (std::forward<T2> (theOther).myOrient)
60   {
61   }
62
63   //! Generalized move assignment operator.
64   template<class T2>
65   typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value, TopoDS_Shape>::type&
66   operator= (T2&& theOther)
67   {
68     myTShape   = std::forward<T2> (theOther).myTShape;
69     myLocation = std::forward<T2> (theOther).myLocation;
70     myOrient   = std::forward<T2> (theOther).myOrient;
71     return *this;
72   }
73
74 #endif
75
76   //! Returns true if this shape is null. In other words, it
77   //! references no underlying shape with the potential to
78   //! be given a location and an orientation.
79   Standard_Boolean IsNull() const { return myTShape.IsNull(); }
80
81   //! Destroys the reference to the underlying shape
82   //! stored in this shape. As a result, this shape becomes null.
83   void Nullify() { myTShape.Nullify(); }
84
85   //! Returns the shape local coordinate system.
86   const TopLoc_Location& Location() const { return myLocation; }
87
88   //! Sets the shape local coordinate system.
89   void Location (const TopLoc_Location& theLoc) { myLocation = theLoc; }
90
91   //! Returns a  shape  similar to <me> with   the local
92   //! coordinate system set to <Loc>.
93   TopoDS_Shape Located (const TopLoc_Location& theLoc) const
94   {
95     TopoDS_Shape aShape (*this);
96     aShape.Location (theLoc);
97     return aShape;
98   }
99
100   //! Returns the shape orientation.
101   TopAbs_Orientation Orientation() const { return myOrient; }
102
103   //! Sets the shape orientation.
104   void Orientation (TopAbs_Orientation theOrient) { myOrient = theOrient; }
105
106   //! Returns  a    shape  similar  to  <me>   with  the
107   //! orientation set to <Or>.
108   TopoDS_Shape Oriented (TopAbs_Orientation theOrient) const
109   {
110     TopoDS_Shape aShape (*this);
111     aShape.Orientation (theOrient);
112     return aShape;
113   }
114
115   //! Returns a handle to the actual shape implementation.
116   const Handle(TopoDS_TShape)& TShape() const { return myTShape; }
117
118   //! Returns the value of the TopAbs_ShapeEnum
119   //! enumeration that corresponds to this shape, for
120   //! example VERTEX, EDGE, and so on.
121   //! Exceptions
122   //! Standard_NullObject if this shape is null.
123   TopAbs_ShapeEnum ShapeType() const { return myTShape->ShapeType(); }
124
125   //! Returns the free flag.
126   Standard_Boolean Free() const { return myTShape->Free(); }
127
128   //! Sets the free flag.
129   void Free (Standard_Boolean theIsFree) { myTShape->Free (theIsFree); }
130
131   //! Returns the locked flag.
132   Standard_Boolean Locked() const { return myTShape->Locked(); }
133
134   //! Sets the locked flag.
135   void Locked (Standard_Boolean theIsLocked) { myTShape->Locked (theIsLocked); }
136
137   //! Returns the modification flag.
138   Standard_Boolean Modified() const { return myTShape->Modified(); }
139
140   //! Sets the modification flag.
141   void Modified (Standard_Boolean theIsModified) { myTShape->Modified (theIsModified); }
142
143   //! Returns the checked flag.
144   Standard_Boolean Checked() const { return myTShape->Checked(); }
145
146   //! Sets the checked flag.
147   void Checked (Standard_Boolean theIsChecked) { myTShape->Checked (theIsChecked); }
148
149   //! Returns the orientability flag.
150   Standard_Boolean Orientable() const { return myTShape->Orientable(); }
151
152   //! Sets the orientability flag.
153   void Orientable (const Standard_Boolean theIsOrientable) { myTShape->Orientable (theIsOrientable); }
154
155   //! Returns the closedness flag.
156   Standard_Boolean Closed() const { return myTShape->Closed(); }
157
158   //! Sets the closedness flag.
159   void Closed (Standard_Boolean theIsClosed) { myTShape->Closed (theIsClosed); }
160
161   //! Returns the infinity flag.
162   Standard_Boolean Infinite() const { return myTShape->Infinite(); }
163
164   //! Sets the infinity flag.
165   void Infinite (Standard_Boolean theIsInfinite) { myTShape->Infinite (theIsInfinite); }
166
167   //! Returns the convexness flag.
168   Standard_Boolean Convex() const { return myTShape->Convex(); }
169
170   //! Sets the convexness flag.
171   void Convex (Standard_Boolean theIsConvex) { myTShape->Convex (theIsConvex); }
172
173   //! Multiplies the Shape location by thePosition.
174   void Move (const TopLoc_Location& thePosition) { myLocation = thePosition * myLocation; }
175
176   //! Returns a shape similar to <me> with a location multiplied by thePosition.
177   TopoDS_Shape Moved (const TopLoc_Location& thePosition) const
178   {
179     TopoDS_Shape aShape (*this);
180     aShape.Move (thePosition);
181     return aShape;
182   }
183
184   //! Reverses the orientation, using the Reverse method
185   //! from the TopAbs package.
186   void Reverse() { myOrient = TopAbs::Reverse (myOrient); }
187
188   //! Returns    a shape  similar    to  <me>  with  the
189   //! orientation  reversed, using  the   Reverse method
190   //! from the TopAbs package.
191   TopoDS_Shape Reversed() const
192   {
193     TopoDS_Shape aShape (*this);
194     aShape.Reverse();
195     return aShape;
196   }
197
198   //! Complements the orientation, using the  Complement
199   //! method from the TopAbs package.
200   void Complement() { myOrient = TopAbs::Complement (myOrient); }
201
202   //! Returns  a   shape  similar  to   <me>   with  the
203   //! orientation complemented,  using   the  Complement
204   //! method from the TopAbs package.
205   TopoDS_Shape Complemented() const
206   {
207     TopoDS_Shape aShape (*this);
208     aShape.Complement();
209     return aShape;
210   }
211
212   //! Updates the Shape Orientation by composition with theOrient,
213   //! using the Compose method from the TopAbs package.
214   void Compose (TopAbs_Orientation theOrient) { myOrient = TopAbs::Compose (myOrient, theOrient); }
215
216   //! Returns  a  shape   similar   to  <me>   with  the
217   //! orientation composed with theOrient, using the
218   //! Compose method from the TopAbs package.
219   TopoDS_Shape Composed (TopAbs_Orientation theOrient) const
220   {
221     TopoDS_Shape aShape (*this);
222     aShape.Compose (theOrient);
223     return aShape;
224   }
225
226   //! Returns the number of direct sub-shapes (children).
227   //! @sa TopoDS_Iterator for accessing sub-shapes
228   Standard_Integer NbChildren() const { return myTShape.IsNull() ? 0 : myTShape->NbChildren(); }
229
230   //! Returns True if two shapes  are partners, i.e.  if
231   //! they   share   the   same  TShape.  Locations  and
232   //! Orientations may differ.
233   Standard_Boolean IsPartner (const TopoDS_Shape& theOther) const { return (myTShape == theOther.myTShape); }
234
235   //! Returns True if two shapes are same, i.e.  if they
236   //! share  the  same TShape  with the same  Locations.
237   //! Orientations may differ.
238   Standard_Boolean IsSame (const TopoDS_Shape& theOther) const
239   {
240     return myTShape   == theOther.myTShape
241         && myLocation == theOther.myLocation;
242   }
243
244   //! Returns True if two shapes are equal, i.e. if they
245   //! share the same TShape with  the same Locations and
246   //! Orientations.
247   Standard_Boolean IsEqual (const TopoDS_Shape& theOther) const
248   {
249     return myTShape   == theOther.myTShape
250         && myLocation == theOther.myLocation
251         && myOrient   == theOther.myOrient;
252   }
253
254   Standard_Boolean operator == (const TopoDS_Shape& theOther) const { return IsEqual (theOther); }
255   
256   //! Negation of the IsEqual method.
257   Standard_Boolean IsNotEqual  (const TopoDS_Shape& theOther) const { return !IsEqual (theOther); }
258   Standard_Boolean operator != (const TopoDS_Shape& theOther) const { return IsNotEqual (theOther); }
259
260   //! Returns a hashed value denoting <me>. This value is in the range [1, theUpperBound]. It is computed from the
261   //! TShape and the Location. The Orientation is not used.
262   //! @param theUpperBound the upper bound of the range a computing hash code must be within
263   //! @return a computed hash code, in the range [1, theUpperBound]
264   Standard_EXPORT Standard_Integer HashCode (Standard_Integer theUpperBound) const;
265
266   //! Replace   <me> by  a  new   Shape with the    same
267   //! Orientation and Location and a new TShape with the
268   //! same geometry and no sub-shapes.
269   void EmptyCopy() { myTShape = myTShape->EmptyCopy(); }
270
271   //! Returns a new Shape with the  same Orientation and
272   //! Location and  a new TShape  with the same geometry
273   //! and no sub-shapes.
274   TopoDS_Shape EmptyCopied() const
275   {
276     TopoDS_Shape aShape (*this);
277     aShape.EmptyCopy();
278     return aShape;
279   }
280
281   void TShape (const Handle(TopoDS_TShape)& theTShape) { myTShape = theTShape; }
282
283 private:
284
285   Handle(TopoDS_TShape) myTShape;
286   TopLoc_Location myLocation;
287   TopAbs_Orientation myOrient;
288
289 };
290
291 //! Computes a hash code for the given shape, in the range [1, theUpperBound]
292 //! @param theShape the shape which hash code is to be computed
293 //! @param theUpperBound the upper bound of the range a computing hash code must be within
294 //! @return a computed hash code, in the range [1, theUpperBound]
295 inline Standard_Integer HashCode (const TopoDS_Shape& theShape, const Standard_Integer theUpperBound)
296 {
297   return theShape.HashCode (theUpperBound);
298 }
299
300 #endif // _TopoDS_Shape_HeaderFile