2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 // $Header: r:/t2repos/thief2/src/object/linkman_.h,v 1.10 2000/01/29 13:23:27 adurant Exp $
22 F_DECLARE_INTERFACE(ITagFile
);
24 typedef cScalarHashFunctions
<LinkID
> LinkHashFuncs
;
25 typedef cHashTable
<LinkID
,tQueryDate
,LinkHashFuncs
> LinkTimeTable
;
29 ILinkQueryDatabase
* db
;
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
*>
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
);
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
);
101 //------------------------------------------------------------
102 // Aggregate protocol
108 //------------------------------------------------------------
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
>
124 cRelationTable byName
;
126 cIDMap idMap
[kNumLinkPartitions
];
127 cNullRelation
* NullRel
;
128 LinkQDBList QueryDBs
[4];
129 tQueryDate QueryTime
;
130 tQueryDate LatestBirth
;
131 tQueryDate EarliestDeath
;
133 LinkTimeTable BirthDates
,DeathDates
;
138 #endif // __LINKMAN__H