2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 // $Header: r:/t2repos/thief2/src/object/propmix.cpp,v 1.7 1998/10/05 17:27:15 mahk Exp $
11 // Must be last header
15 cMixedPropertyStore::cMixedPropertyStore(IPropertyStore
* abstract
, IPropertyStore
* concrete
)
19 mStores
[kAbstract
] = abstract
;
20 mStores
[kConcrete
] = concrete
;
21 IDataOps
* ops
= concrete
->GetOps();
24 abstract
->SetOps(ops
);
29 cMixedPropertyStore::~cMixedPropertyStore()
31 SafeRelease(mStores
[kAbstract
]);
32 SafeRelease(mStores
[kConcrete
]);
39 STDMETHODIMP_(const sPropertyStoreDesc
*) cMixedPropertyStore::Describe() const
41 static sPropertyStoreDesc desc
= { "Hybrid implementation" };
46 STDMETHODIMP
cMixedPropertyStore::SetID(PropertyID id
)
48 mStores
[kAbstract
]->SetID(id
);
49 mStores
[kConcrete
]->SetID(id
);
53 STDMETHODIMP_(sDatum
) cMixedPropertyStore::Create(ObjID obj
)
55 return Store(obj
)->Create(obj
);
58 STDMETHODIMP
cMixedPropertyStore::Delete(ObjID obj
)
60 return Store(obj
)->Delete(obj
);
63 STDMETHODIMP_(BOOL
) cMixedPropertyStore::Relevant(ObjID obj
) const
65 return Store(obj
)->Relevant(obj
);
68 STDMETHODIMP_(BOOL
) cMixedPropertyStore::Get(ObjID obj
, sDatum
* pdat
) const
70 return Store(obj
)->Get(obj
,pdat
);
73 STDMETHODIMP
cMixedPropertyStore::Set(ObjID obj
, sDatum val
)
75 return Store(obj
)->Set(obj
,val
);
78 STDMETHODIMP_(sDatum
) cMixedPropertyStore::Copy(ObjID targ
, ObjID src
)
80 // could copy across stores, so have to do it stupidly
87 STDMETHODIMP
cMixedPropertyStore::Reset()
89 mStores
[kAbstract
]->Reset();
90 mStores
[kConcrete
]->Reset();
94 STDMETHODIMP
cMixedPropertyStore::IterStart(sPropertyObjIter
* iter
) const
96 // Start doing the abstract ones
97 iter
->next
= kConcrete
;
98 sPropertyObjIter
* subiter
= new sPropertyObjIter
;
99 iter
->state
[0] = subiter
;
100 mStores
[iter
->next
]->IterStart(subiter
);
104 STDMETHODIMP_(BOOL
) cMixedPropertyStore::IterNext(sPropertyObjIter
* iter
,
105 ObjID
* obj
, sDatum
* value
) const
107 sPropertyObjIter
* subiter
= (sPropertyObjIter
*) iter
->state
[0];
108 if (mStores
[iter
->next
]->IterNext(subiter
,obj
,value
))
111 // if we finished the concretes, start on the abstracts
112 if (iter
->next
== kConcrete
)
114 iter
->next
= kAbstract
;
115 mStores
[kConcrete
]->IterStop(subiter
);
116 mStores
[kAbstract
]->IterStart(subiter
);
117 return mStores
[kAbstract
]->IterNext(subiter
,obj
,value
);
124 STDMETHODIMP
cMixedPropertyStore::IterStop(sPropertyObjIter
* iter
) const
126 sPropertyObjIter
* subiter
= (sPropertyObjIter
*) iter
->state
[0];
128 iter
->state
[0] = NULL
;
132 STDMETHODIMP_(BOOL
) cMixedPropertyStore::GetCopy(ObjID obj
, sDatum
* val
)
134 return Store(obj
)->GetCopy(obj
,val
);
137 STDMETHODIMP
cMixedPropertyStore::ReleaseCopy(ObjID obj
, sDatum val
)
139 return Store(obj
)->ReleaseCopy(obj
,val
);
143 STDMETHODIMP_(int) cMixedPropertyStore::WriteVersion()
145 // Really your data ops shouldn't be out of sync
146 return mStores
[kConcrete
]->WriteVersion();
149 STDMETHODIMP
cMixedPropertyStore::WriteObj(ObjID obj
, IDataOpsFile
* file
)
151 return Store(obj
)->WriteObj(obj
,file
);
154 STDMETHODIMP
cMixedPropertyStore::ReadObj (ObjID obj
, IDataOpsFile
* file
, int version
)
156 return Store(obj
)->ReadObj(obj
,file
,version
);
159 STDMETHODIMP_(IDataOps
*) cMixedPropertyStore::GetOps()
161 return mStores
[kConcrete
]->GetOps();
164 STDMETHODIMP
cMixedPropertyStore::SetOps(IDataOps
* ops
)
166 mStores
[kAbstract
]->SetOps(ops
);
167 mStores
[kConcrete
]->SetOps(ops
);