convert line ends
[canaan.git] / prj / cam / src / object / linkman_.h
blob00d0a9ba9fe3653734d5502916e4c38e54402174
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/src/object/linkman_.h,v 1.10 2000/01/29 13:23:27 adurant Exp $
7 #pragma once
9 #ifndef __LINKMAN__H
10 #define __LINKMAN__H
11 #include <linkman.h>
12 #include <aggmemb.h>
13 #include <linkqdb_.h>
14 #include <hashset.h>
15 #include <dynarray.h>
16 #include <relnull.h>
17 #include <hashpp.h>
18 #include <linkknow.h>
19 #include <linkint.h>
20 #include <linkbase.h>
22 F_DECLARE_INTERFACE(ITagFile);
24 typedef cScalarHashFunctions<LinkID> LinkHashFuncs;
25 typedef cHashTable<LinkID,tQueryDate,LinkHashFuncs> LinkTimeTable;
27 struct LinkQDBEntry
29 ILinkQueryDatabase* db;
30 int count;
32 LinkQDBEntry(ILinkQueryDatabase* db_, int cnt = 0) :db(db_),count(cnt) {};
35 typedef cDynArray<LinkQDBEntry> LinkQDBList;
37 ////////////////////////////////////////////////////////////
38 // LINK MANAGER INTERNALS
41 class cLinkManager : public ILinkManagerInternal, public cLinkManagerKnower
44 // Hash table mapping strings to Properties
45 class cRelationTable : public cStrIHashSet <IRelation *>
47 public:
48 cRelationTable () {};
49 tHashSetKey GetKey (tHashSetNode node) const
51 return (tHashSetKey) (((IRelation *) (node))->Describe()->name);
55 // We're going to be an aggregate member when we grow up
56 DECLARE_AGGREGATION(cLinkManager);
58 public:
59 cLinkManager(IUnknown* outer);
60 virtual ~cLinkManager();
63 // ILinkManager methods
66 STDMETHOD_(IRelation*,GetRelation)(RelationID id);
67 STDMETHOD_(IRelation*,GetRelationNamed)(const char* name);
68 STDMETHOD(Notify)(eRelationNotifyMsg msg, RelationNotifyData data);
69 STDMETHOD(IterStart)(sRelationIter* iter) ;
70 STDMETHOD_(BOOL,IterNext)(sRelationIter* iter, RelationID* rel);
71 STDMETHOD(IterStop)(sRelationIter* iter);
72 STDMETHOD_(LinkID, Add)(ObjID source, ObjID dest, RelationID id);
73 STDMETHOD_(LinkID, AddFull)(ObjID source, ObjID desc, RelationID id, void* data);
74 STDMETHOD(Remove)(LinkID id);
75 STDMETHOD_(BOOL,Get)(LinkID id, sLink* out) const;
76 STDMETHOD(SetData)(LinkID id, void* data);
77 STDMETHOD_(void*,GetData)(LinkID id);
78 STDMETHOD_(ILinkQuery*,Query)(ObjID source, ObjID dest, RelationID flavor);
80 STDMETHOD_(LinkID, GetSingleLink)(RelationID id, ObjID source, ObjID dest);
81 STDMETHOD_(BOOL, AnyLinks)(RelationID id, ObjID source, ObjID dest);
83 //------------------------------------------------------------
84 // ILinkManagerInternal methods
87 STDMETHOD_(RelationID,AddRelation)(IRelation* relation);
88 STDMETHOD(RemoveRelation)(RelationID relid);
89 STDMETHOD(ReplaceRelation)(RelationID relid, IRelation* relation);
90 STDMETHOD(AddQueryDB)(ILinkQueryDatabase* db,RelationQueryCaseSet cases);
91 STDMETHOD(RemoveQueryDB)(ILinkQueryDatabase* db,RelationQueryCaseSet cases);
92 STDMETHOD_(tQueryDate,Lock)();
93 STDMETHOD(Unlock)(tQueryDate lockdate);
94 STDMETHOD_(long,GetLockCount)();
95 STDMETHOD_(BOOL,LinkValid)(LinkID link, tQueryDate age);
96 STDMETHOD(LinkBirth)(LinkID id);
97 STDMETHOD_(BOOL,LinkDeath)(LinkID id);
98 STDMETHOD_(LinkID,RemapOnLoad)(LinkID id);
100 protected:
101 //------------------------------------------------------------
102 // Aggregate protocol
105 HRESULT Init();
106 HRESULT End();
108 //------------------------------------------------------------
109 // Helpers
111 void save_relation_ids(ITagFile* file, ulong filetype);
112 void load_relation_ids(ITagFile* file, ulong filetype);
114 class cByID : public cDynArray<IRelation*>
118 class cIDMap : public cDynArray<RelationID>
122 protected:
124 cRelationTable byName;
125 cByID byID;
126 cIDMap idMap[kNumLinkPartitions];
127 cNullRelation* NullRel;
128 LinkQDBList QueryDBs[4];
129 tQueryDate QueryTime;
130 tQueryDate LatestBirth;
131 tQueryDate EarliestDeath;
132 ulong LockCount;
133 LinkTimeTable BirthDates,DeathDates;
134 BOOL MidPurge;
138 #endif // __LINKMAN__H