Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Copyright Notice
3 : : //
4 : : // Copyright (c) 1996
5 : : // by Malcolm J. Panthaki, DBA, and the University of New Mexico.
6 : : //-------------------------------------------------------------------------
7 : : //
8 : : //-------------------------------------------------------------------------
9 : : // Filename : ModelQueryEngine.hpp
10 : : //
11 : : // Purpose : This class provides the interface to query the model.
12 : : //
13 : : // Special Notes : This is a singleton class.
14 : : //
15 : : // The primary objects that this class deals with, at the
16 : : // interface, are TopologyEntity's. These are entities
17 : : // that are represented as nodes in the DAG. Each node of
18 : : // the DAG contains a pointer to a TopologyEntity.
19 : : //
20 : : // All of the query functions rely on the "type" of
21 : : // objects. Some of them rely on the relationships
22 : : // between different "type"s of objects. Currently all
23 : : // such relationships, i.e. the entity relation diagram
24 : : // (ERD) of the different TopologyEntity classes is maintained
25 : : // by a class called ModelERD.
26 : : //
27 : : // Creator : Xuechen Liu
28 : : //
29 : : // Creation Date : 06/08/96
30 : : //
31 : : // Owner : Malcolm J. Panthaki
32 : : //-------------------------------------------------------------------------
33 : :
34 : : #ifndef MODEL_QUERY_ENGINE_HPP
35 : : #define MODEL_QUERY_ENGINE_HPP
36 : :
37 : :
38 : : // ********** BEGIN STANDARD INCLUDES **********
39 : : // ********** END STANDARD INCLUDES **********
40 : :
41 : : // ********** BEGIN MOTIF INCLUDES **********
42 : : // ********** END MOTIF INCLUDES **********
43 : :
44 : : // ********** BEGIN OPEN INVENTOR INCLUDES **********
45 : : // ********** END OPEN INVENTOR INCLUDES **********
46 : :
47 : : // ********** BEGIN CUBIT INCLUDES **********
48 : :
49 : : #include "CubitDefines.h"
50 : : #include "TopologyEntity.hpp"
51 : : #include "DLIList.hpp"
52 : :
53 : : // ********** END CUBIT INCLUDES **********
54 : :
55 : : // ********** BEGIN MACROS DEFINITIONS **********
56 : : // ********** END MACROS DEFINITIONS **********
57 : :
58 : : // ********** BEGIN FORWARD DECLARATIONS **********
59 : :
60 : : class TopologyEntity;
61 : :
62 : : // ********** END FORWARD DECLARATIONS **********
63 : :
64 : : // ********** BEGIN ENUM DEFINITIONS **********
65 : :
66 : : enum CubitSearchDirection
67 : : {
68 : : CUBIT_SEARCH_NO_DIRECTION = -1,
69 : : CUBIT_SEARCH_PARENT = 0,
70 : : CUBIT_SEARCH_CHILD = 1
71 : : };
72 : : // ********** END ENUM DEFINITIONS **********
73 : :
74 : :
75 : : class CUBIT_GEOM_EXPORT ModelQueryEngine
76 : : {
77 : : public:
78 : :
79 : : static ModelQueryEngine* instance();
80 : : //R ModelQueryEngine*
81 : : //R- A pointer to the only instance of this class.
82 : : //- This function controls access and creation of the sole instance
83 : : //- of this class. It ensures that only one instance can ever get
84 : : //- created. It returns a pointer to the only instance of the class.
85 : :
86 : : ~ModelQueryEngine() ;
87 : : //- Destructor
88 : :
89 : 322 : static void delete_instance()
90 : : {
91 [ + + ]: 322 : if(instance_)
92 [ + - ]: 181 : delete instance_;
93 : 322 : instance_ = NULL;
94 : 322 : }
95 : :
96 : : //HEADER- Query functions on single source objects
97 : :
98 : : CubitStatus query_model( TopologyEntity & source_object,
99 : : DagType target_type,
100 : : DLIList<TopologyEntity*>& result_set );
101 : :
102 : : CubitStatus query_model_and_append( TopologyEntity& source_object,
103 : : DagType target_type,
104 : : DLIList<TopologyEntity*>& result_set );
105 : : //R CubitStatus
106 : : //R- CUBIT_SUCCESS/FAILURE
107 : : //I sourceObject
108 : : //I- A reference to the ModEnt on which query is to be done.
109 : : //I targetType
110 : : //I- The type of the ModEnts to query.
111 : : //I- It can be any kind of data type: root base type, intermediate
112 : : //I- base type, or leaf type.
113 : : //O resultModEntSet
114 : : //O- Reference to a set of ModEnts where output of the query will be
115 : : //O- put/appended.
116 : : //- This function queries the given object, "sourceObject", for all
117 : : //- the ModEnts of the given type, "targetType" that it is related to and
118 : : //- puts/apppends the result of the query in "resultModEntSet".
119 : : //- The return value is CUBIT_SUCCESS if the source object has either
120 : : //- a parent-child or child-parent relationship with objects of the
121 : : //- given type, CUBIT_FAILURE otherwise.
122 : :
123 : :
124 : :
125 : :
126 : : //HEADER- Query functions on sets of source objects
127 : :
128 : : CubitStatus query_model( DLIList<TopologyEntity*>& source_set,
129 : : DagType target_type,
130 : : DLIList<TopologyEntity*>& result_set );
131 : :
132 : : CubitStatus query_model_and_append( DLIList<TopologyEntity*>& source_set,
133 : : DagType target_type,
134 : : DLIList<TopologyEntity*>& result_set );
135 : : //R CubitStatus
136 : : //R- CUBIT_SUCCESS/FAILURE
137 : : //I sourceObjectSet
138 : : //I- A reference to a set of ModEnts on which query is to be done.
139 : : //I targetType
140 : : //I- The type of the ModEnts to query.
141 : : //I- It can be any kind of data type: root base type, intermediate
142 : : //I- base type, or leaf type.
143 : : //O resultModEntSet
144 : : //O- Reference to a set of ModEnts where output of the query will be
145 : : //O- put/appended.
146 : : //- This function queries the given objects, "sourceObjectSet", for all
147 : : //- the ModEnts of the given type, "targetType" that they are related to and
148 : : //- puts/apppends the result of the query in "resultModEntSet".
149 : : //- The return value is CUBIT_SUCCESS if each of the source objects
150 : : //- has either a parent-child or child-parent relationship with
151 : : //- objects of the given type, CUBIT_FAILURE otherwise.
152 : :
153 : :
154 : : bool encountered( TopologyEntity* );
155 : : //- Mark node as encountered if it was not already encountered.
156 : : //- Return the previous value of the encountered flag.
157 : :
158 : : class BeginQuery {
159 : : public:
160 : 965724 : inline BeginQuery()
161 : 965724 : { ModelQueryEngine::instance()->inc_query_call_stack(); }
162 : 965724 : inline ~BeginQuery()
163 : 965724 : { ModelQueryEngine::instance()->dec_query_call_stack(); }
164 : : inline void* operator new(size_t /*size*/) throw()
165 : : { assert(0); return (void*)0; }
166 : : };
167 : :
168 : : protected:
169 : :
170 : : CubitStatus query_append_children ( TopologyEntity& source_object,
171 : : DagType child_type,
172 : : DLIList<TopologyEntity*>& result_set );
173 : : CubitStatus query_append_parents ( TopologyEntity& source_object,
174 : : DagType parent_type,
175 : : DLIList<TopologyEntity*>& result_set );
176 : :
177 : :
178 : :
179 : : friend class ModelQueryEngine::BeginQuery;
180 : :
181 : : void inc_query_call_stack();
182 : : void dec_query_call_stack();
183 : :
184 : : int queryCallStackDepth;
185 : :
186 : : DLIList<TopologyEntity*> encounteredSet;
187 : : // A set of marked ModelEntities.
188 : :
189 : : DLIList<TopologyEntity*> intermediateNodeSets[2];
190 : :
191 : : private:
192 : :
193 : : ModelQueryEngine() ;
194 : : //- Constructor. (Not callable by user code. Class is constructed
195 : : //- by the "instance()" member function.
196 : :
197 : : static ModelQueryEngine* instance_;
198 : : //- The static pointer to unique instance of this class.
199 : : };
200 : :
201 : : // ********** BEGIN HELPER CLASSES **********
202 : : // ********** END HELPER CLASSES **********
203 : :
204 : : // ********** BEGIN INLINE FUNCTIONS **********
205 : :
206 : : // ********** END INLINE FUNCTIONS **********
207 : :
208 : : // ********** BEGIN FRIEND FUNCTIONS **********
209 : : // ********** END FRIEND FUNCTIONS **********
210 : :
211 : : // ********** BEGIN EXTERN FUNCTIONS **********
212 : : // ********** END EXTERN FUNCTIONS **********
213 : :
214 : : #endif
215 : :
|