2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 // $Header: r:/t2repos/thief2/src/object/traisrch.h,v 1.7 2000/02/22 20:00:47 toml Exp $
21 typedef cSimpleDList
<IObjectQuery
*> LinkQueryList
;
28 typedef cDynArray
<TYPE
> cArray
;
34 enum { kInitSize
= 16 };
37 cSimpleStack() :mArray(kInitSize
),top(0) { };
39 void Push(const TYPE
& q
)
41 int sz
= mArray
.Size();
43 mArray
.Grow(sz
); // double in size
73 // Returns nth from top, zero is top
74 BOOL
Nth(int n
, TYPE
* val
)
78 *val
= mArray
[top
-1 -n
];
85 // Dumb pointer class to interface with template
88 class QueryPtr
: public cIPtr
<IObjectQuery
>
90 typedef cIPtr
<IObjectQuery
> cParent
;
93 QueryPtr(IObjectQuery
* q
= NULL
) : cParent(q
) {};
94 QueryPtr(const QueryPtr
& q
) : cParent((IObjectQuery
*)q
) {};
96 IObjectQuery
* operator =(const QueryPtr
& q
) { return (IObjectQuery
*) (pUnknown
= q
.pUnknown
); };
99 class QueryStack
: public cSimpleStack
<QueryPtr
>
105 ////////////////////////////////////////////////////////////
106 // TRAIT SEARCH QUERY
108 // This one searches the entire inheritance graph upwards,
109 // in prioritized order.
111 // Takes the object to start the search from, and doesn't
115 class cDepthFirstObjectQuery
: public cBaseObjectQuery
121 // "close up" an object. Second arg is the parent
122 // third is whether it was "finished"
124 BOOL
Expand(); // search deeper
125 BOOL
Contract(); // unwind
128 // Generate the successors of a particular object
130 virtual IObjectQuery
* Successors(ObjID obj
) = 0;
133 cDepthFirstObjectQuery(ObjID obj
) : CurObj(obj
) {};
134 virtual ~cDepthFirstObjectQuery()
136 while(!!Queries
.Top())
138 Queries
.Pop()->Release();
143 STDMETHOD_(BOOL
,Done
)();
144 STDMETHOD_(ObjID
,Object
)();
149 ////////////////////////////////////////////////////////////
150 // Transitive Prioritized Link Query
153 class cTransitiveLinkObjQuery
: public cDepthFirstObjectQuery
157 IObjectQuery
* Successors(ObjID obj
)
159 ILinkQuery
* q
= Rel
->Query(obj
,LINKOBJ_WILDCARD
);
160 IObjectQuery
* out
= new cPriLinkDonorQuery(q
);
166 cTransitiveLinkObjQuery(ObjID obj
, IRelation
* rel
)
167 : cDepthFirstObjectQuery(obj
),Rel(rel
)
170 ~cTransitiveLinkObjQuery() { SafeRelease(Rel
);};
175 ////////////////////////////////////////////////////////////
176 // OBJECT QUERY FILTER
178 // Skips past things that are not intrinsic to the trait
181 class cFilterObjectQuery
: public cBaseObjectQuery
186 // overload this to filter differently
187 virtual BOOL
Filter(ObjID
) { return TRUE
;};
189 // call this in your constructor
192 for (; !Inner
->Done(); Inner
->Next())
193 if (Filter(Inner
->Object()))
198 cFilterObjectQuery(IObjectQuery
* inner
)
204 virtual ~cFilterObjectQuery()
209 STDMETHOD_(BOOL
,Done
)() { return Inner
->Done();};
210 STDMETHOD_(ObjID
,Object
)() { return Inner
->Object(); };
219 ////////////////////////////////////////////////////////////
220 // CONCRETENESS FILTER
223 class cConcretenessFilterQuery
: public cFilterObjectQuery
225 eObjConcreteness Which
;
230 cConcretenessFilterQuery(IObjectQuery
* q
, eObjConcreteness which
)
231 : cFilterObjectQuery(q
), Which(which
) { Skip();}
232 ~cConcretenessFilterQuery() {};
238 #endif // __TRAISRCH_H