0028838: Configuration - undefine macros coming from X11 headers in place of collision
[occt.git] / src / Interface / Interface_Graph.hxx
1 // Created on: 1992-09-22
2 // Created by: Christian CAILLET
3 // Copyright (c) 1992-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 _Interface_Graph_HeaderFile
18 #define _Interface_Graph_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_DefineAlloc.hxx>
22 #include <Standard_Handle.hxx>
23
24 #include <Interface_BitMap.hxx>
25 #include <Interface_InterfaceModel.hxx>
26
27 #include <TCollection_HAsciiString.hxx>
28 #include <TColStd_HArray1OfInteger.hxx>
29 #include <TColStd_HArray1OfListOfInteger.hxx>
30 #include <TColStd_HSequenceOfTransient.hxx>
31
32 class Standard_DomainError;
33 class Interface_GeneralLib;
34 class Interface_Protocol;
35 class Interface_GTool;
36 class Standard_Transient;
37 class Interface_EntityIterator;
38
39 // resolve name collisions with X11 headers
40 #ifdef Status
41   #undef Status
42 #endif
43
44 //! Gives basic data structure for operating and storing
45 //! graph results (usage is normally internal)
46 //! Entities are Mapped according their Number in the Model
47 //!
48 //! Each Entity from the Model can be known as "Present" or
49 //! not; if it is, it is Mapped with a Status : an Integer
50 //! which can be used according to needs of each algorithm
51 //! In addition, the Graph brings a BitMap which can be used
52 //! by any caller
53 //!
54 //! Also, it is bound with two lists : a list of Shared
55 //! Entities (in fact, their Numbers in the Model) which is
56 //! filled by a ShareTool, and a list of Sharing Entities,
57 //! computed by deduction from the Shared Lists
58 //!
59 //! Moreover, it is possible to redefine the list of Entities
60 //! Shared by an Entity (instead of standard answer by general
61 //! service Shareds) : this new list can be empty; it can
62 //! be changed or reset (i.e. to come back to standard answer)
63 class Interface_Graph 
64 {
65 public:
66
67   DEFINE_STANDARD_ALLOC
68
69   
70   //! Creates an empty graph, ready to receive Entities from amodel
71   //! Note that this way of Creation allows <me> to verify that
72   //! Entities to work with are contained in <amodel>
73   //! Basic Shared and Sharing lists are obtained from a General
74   //! Services Library, given directly as an argument
75   Standard_EXPORT Interface_Graph(const Handle(Interface_InterfaceModel)& amodel, const Interface_GeneralLib& lib, const Standard_Boolean theModeStats = Standard_True);
76   
77   //! Same as above, but the Library is defined through a Protocol
78   Standard_EXPORT Interface_Graph(const Handle(Interface_InterfaceModel)& amodel, const Handle(Interface_Protocol)& protocol, const Standard_Boolean theModeStats = Standard_True);
79   
80   //! Same as above, but the Library is defined through a Protocol
81   Standard_EXPORT Interface_Graph(const Handle(Interface_InterfaceModel)& amodel, const Handle(Interface_GTool)& gtool, const Standard_Boolean theModeStats = Standard_True);
82   
83   //! Same a above but works with the Protocol recorded in the Model
84   Standard_EXPORT Interface_Graph(const Handle(Interface_InterfaceModel)& amodel, const Standard_Boolean theModeStats = Standard_True);
85   
86   //! Creates a Graph from another one, getting all its data
87   //! Remark that status are copied from <agraph>, but the other
88   //! lists (sharing/shared) are copied only if <copied> = True
89   Standard_EXPORT Interface_Graph(const Interface_Graph& agraph, const Standard_Boolean copied = Standard_False);
90   
91   //! Erases data, making graph ready to rebegin from void
92   //! (also resets Shared lists redefinitions)
93   Standard_EXPORT void Reset();
94   
95   //! Erases Status (Values and Flags of Presence), making graph
96   //! ready to rebegin from void. Does not concerns Shared lists
97   Standard_EXPORT void ResetStatus();
98   
99   //! Returns size (max nb of entities, i.e. Model's nb of entities)
100   Standard_EXPORT Standard_Integer Size() const;
101   
102   //! Returns size of array of statuses
103   Standard_EXPORT Standard_Integer NbStatuses() const;
104   
105   //! Returns the Number of the entity in the Map, computed at
106   //! creation time (Entities loaded from the Model)
107   //! Returns 0 if <ent> not contained by Model used to create <me>
108   //! (that is, <ent> is unknown from <me>)
109   Standard_EXPORT Standard_Integer EntityNumber (const Handle(Standard_Transient)& ent) const;
110   
111   //! Returns True if an Entity is noted as present in the graph
112   //! (See methods Get... which determine this status)
113   //! Returns False if <num> is out of range too
114   Standard_EXPORT Standard_Boolean IsPresent (const Standard_Integer num) const;
115   
116   //! Same as above but directly on an Entity <ent> : if it is not
117   //! contained in the Model, returns False. Else calls
118   //! IsPresent(num)  with <num> given by EntityNumber
119   Standard_EXPORT Standard_Boolean IsPresent (const Handle(Standard_Transient)& ent) const;
120   
121   //! Returns mapped Entity given its no (if it is present)
122   Standard_EXPORT const Handle(Standard_Transient)& Entity (const Standard_Integer num) const;
123   
124   //! Returns Status associated to a numero (only to read it)
125   Standard_EXPORT Standard_Integer Status (const Standard_Integer num) const;
126   
127   //! Modifies Status associated to a numero
128   Standard_EXPORT void SetStatus (const Standard_Integer num, const Standard_Integer stat);
129   
130   //! Clears Entity and sets Status to 0, for a numero
131   Standard_EXPORT void RemoveItem (const Standard_Integer num);
132   
133   //! Changes all status which value is oldstat to new value newstat
134   Standard_EXPORT void ChangeStatus (const Standard_Integer oldstat, const Standard_Integer newstat);
135   
136   //! Removes all items of which status has a given value stat
137   Standard_EXPORT void RemoveStatus (const Standard_Integer stat);
138   
139   //! Returns the Bit Map in order to read or edit flag values
140   Standard_EXPORT const Interface_BitMap& BitMap() const;
141   
142   //! Returns the Bit Map in order to edit it (add new flags)
143   Standard_EXPORT Interface_BitMap& CBitMap();
144   
145   //! Returns the Model with which this Graph was created
146   Standard_EXPORT const Handle(Interface_InterfaceModel)& Model() const;
147   
148   //! Loads Graph with all Entities contained in the Model
149   Standard_EXPORT void GetFromModel();
150   
151   //! Gets an Entity, plus its shared ones (at every level) if
152   //! "shared" is True. New items are set to status "newstat"
153   //! Items already present in graph remain unchanged
154   //! Of course, redefinitions of Shared lists are taken into
155   //! account if there are some
156   Standard_EXPORT void GetFromEntity (const Handle(Standard_Transient)& ent, const Standard_Boolean shared, const Standard_Integer newstat = 0);
157   
158   //! Gets an Entity, plus its shared ones (at every level) if
159   //! "shared" is True. New items are set to status "newstat".
160   //! Items already present in graph are processed as follows :
161   //! - if they already have status "newstat", they remain unchanged
162   //! - if they have another status, this one is modified :
163   //! if cumul is True,  to former status + overlapstat (cumul)
164   //! if cumul is False, to overlapstat (enforce)
165   Standard_EXPORT void GetFromEntity (const Handle(Standard_Transient)& ent, const Standard_Boolean shared, const Standard_Integer newstat, const Standard_Integer overlapstat, const Standard_Boolean cumul);
166   
167   //! Gets Entities given by an EntityIterator. Entities which were
168   //! not yet present in the graph are mapped with status "newstat"
169   //! Entities already present remain unchanged
170   Standard_EXPORT void GetFromIter (const Interface_EntityIterator& iter, const Standard_Integer newstat);
171   
172   //! Gets Entities given by an EntityIterator and distinguishes
173   //! those already present in the Graph :
174   //! - new entities added to the Graph with status "newstst"
175   //! - entities already present with status = "newstat" remain
176   //! unchanged
177   //! - entities already present with status different form
178   //! "newstat" have their status modified :
179   //! if cumul is True,  to former status + overlapstat (cumul)
180   //! if cumul is False, to overlapstat (enforce)
181   //! (Note : works as GetEntity, shared = False, for each entity)
182   Standard_EXPORT void GetFromIter (const Interface_EntityIterator& iter, const Standard_Integer newstat, const Standard_Integer overlapstat, const Standard_Boolean cumul);
183   
184   //! Gets all present items from another graph
185   Standard_EXPORT void GetFromGraph (const Interface_Graph& agraph);
186   
187   //! Gets items from another graph which have a specific Status
188   Standard_EXPORT void GetFromGraph (const Interface_Graph& agraph, const Standard_Integer stat);
189   
190   //! Returns True if <ent> or the list of entities shared by <ent>
191   //! (not redefined) contains items unknown from this Graph
192   //! Remark : apart from the status HasShareError, these items
193   //! are ignored
194   Standard_EXPORT Standard_Boolean HasShareErrors (const Handle(Standard_Transient)& ent) const;
195   
196   //! Returns the sequence of Entities Shared by an Entity
197   Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShareds (const Handle(Standard_Transient)& ent) const;
198   
199   //! Returns the list of Entities Shared by an Entity, as recorded
200   //! by the Graph. That is, by default Basic Shared List, else it
201   //! can be redefined by methods SetShare, SetNoShare ... see below
202   Standard_EXPORT Interface_EntityIterator Shareds (const Handle(Standard_Transient)& ent) const;
203   
204   //! Returns the list of Entities which Share an Entity, computed
205   //! from the Basic or Redefined Shared Lists
206   Standard_EXPORT Interface_EntityIterator Sharings (const Handle(Standard_Transient)& ent) const;
207   
208   //! Returns the sequence of Entities Sharings by an Entity
209   Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetSharings (const Handle(Standard_Transient)& ent) const;
210   
211   //! Returns the list of sharings entities, AT ANY LEVEL, which are
212   //! kind of a given type. A sharing entity kind of this type
213   //! ends the exploration of its branch
214   Standard_EXPORT Interface_EntityIterator TypedSharings (const Handle(Standard_Transient)& ent, const Handle(Standard_Type)& type) const;
215   
216   //! Returns the Entities which are not Shared (their Sharing List
217   //! is empty) in the Model
218   Standard_EXPORT Interface_EntityIterator RootEntities() const;
219   
220   //! Determines the name attached to an entity, by using the
221   //! general service Name in GeneralModule
222   //! Returns a null handle if no name could be computed or if
223   //! the entity is not in the model
224   Standard_EXPORT Handle(TCollection_HAsciiString) Name (const Handle(Standard_Transient)& ent) const;
225   
226   //! Returns the Table of Sharing lists. Used to Create
227   //! another Graph from <me>
228   Standard_EXPORT const Handle(TColStd_HArray1OfListOfInteger)& SharingTable() const;
229   
230   //! Returns mode resposible for computation of statuses;
231   Standard_EXPORT Standard_Boolean ModeStat() const;
232
233
234
235
236 protected:
237
238   
239   //! Initialize statuses and flags
240   Standard_EXPORT void InitStats();
241
242
243   Handle(Interface_InterfaceModel) themodel;
244   TCollection_AsciiString thepresents;
245   Handle(TColStd_HArray1OfInteger) thestats;
246   Handle(TColStd_HArray1OfListOfInteger) thesharings;
247
248
249 private:
250
251   
252   //! Performs the Evaluation of the Graph, from an initial Library,
253   //! either defined through a Protocol, or given dierctly
254   //! Called by the non-empty Constructors
255   //!
256   //! Normally, gtool suffices. But if a Graph is created from a
257   //! GeneralLib directly, it cannot be used
258   //! If <gtool> is defined, it has priority
259   Standard_EXPORT void Evaluate();
260
261
262   Interface_BitMap theflags;
263
264
265 };
266
267
268
269
270
271
272
273 #endif // _Interface_Graph_HeaderFile