convert line ends
[canaan.git] / prj / cam / src / object / propmix.cpp
blob608605660665cdc6c49ec94014e569f471012b79
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/src/object/propmix.cpp,v 1.7 1998/10/05 17:27:15 mahk Exp $
8 #include <propmix.h>
9 #include <propbase.h>
11 // Must be last header
12 #include <dbmem.h>
15 cMixedPropertyStore::cMixedPropertyStore(IPropertyStore* abstract, IPropertyStore* concrete)
17 abstract->AddRef();
18 concrete->AddRef();
19 mStores[kAbstract] = abstract;
20 mStores[kConcrete] = concrete;
21 IDataOps* ops = concrete->GetOps();
22 if (ops)
24 abstract->SetOps(ops);
25 SafeRelease(ops);
29 cMixedPropertyStore::~cMixedPropertyStore()
31 SafeRelease(mStores[kAbstract]);
32 SafeRelease(mStores[kConcrete]);
36 // METHODS
39 STDMETHODIMP_(const sPropertyStoreDesc*) cMixedPropertyStore::Describe() const
41 static sPropertyStoreDesc desc = { "Hybrid implementation" };
42 return &desc;
46 STDMETHODIMP cMixedPropertyStore::SetID(PropertyID id)
48 mStores[kAbstract]->SetID(id);
49 mStores[kConcrete]->SetID(id);
50 return S_OK;
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
81 sDatum dat;
82 if (Get(src,&dat))
83 Set(targ,dat);
84 return dat;
87 STDMETHODIMP cMixedPropertyStore::Reset()
89 mStores[kAbstract]->Reset();
90 mStores[kConcrete]->Reset();
91 return S_OK;
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);
101 return S_OK;
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))
109 return TRUE;
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);
120 return FALSE;
124 STDMETHODIMP cMixedPropertyStore::IterStop(sPropertyObjIter* iter) const
126 sPropertyObjIter* subiter = (sPropertyObjIter*) iter->state[0];
127 delete subiter;
128 iter->state[0] = NULL;
129 return S_OK;
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);
168 return S_OK;