// File: TFunction_DriverTable.cxx // Created: Fri Jun 11 17:58:49 1999 // Author: Vladislav ROMASHKO // #include #include #include #include #include #include static Handle(TFunction_DriverTable) DT; //======================================================================= //function : Get //purpose : //======================================================================= Handle(TFunction_DriverTable) TFunction_DriverTable::Get() { if (DT.IsNull()) DT = new TFunction_DriverTable; return DT; } //======================================================================= //function : TFunction_DriverTable //purpose : Constructor //======================================================================= TFunction_DriverTable::TFunction_DriverTable() {} //======================================================================= //function : AddDriver //purpose : Adds a driver to the DriverTable //======================================================================= Standard_Boolean TFunction_DriverTable::AddDriver(const Standard_GUID& guid, const Handle(TFunction_Driver)& driver, const Standard_Integer thread) { if (thread == 0) return myDrivers.Bind(guid,driver); else if (thread > 0) { if (myThreadDrivers.IsNull()) { // Create a new table for thread-drivers. myThreadDrivers = new TFunction_HArray1OfDataMapOfGUIDDriver(1, thread); } else if (myThreadDrivers->Upper() < thread) { // Create a bigger table for thread-drivers. Handle(TFunction_HArray1OfDataMapOfGUIDDriver) new_dt = new TFunction_HArray1OfDataMapOfGUIDDriver(1, thread); // Copy old table to the expanded (new) one. Standard_Integer i = 1, old_upper = myThreadDrivers->Upper(); for (; i <= old_upper; i++) { const TFunction_DataMapOfGUIDDriver& t = myThreadDrivers->Value(i); TFunction_DataMapIteratorOfDataMapOfGUIDDriver itrt(t); for (; itrt.More(); itrt.Next()) { new_dt->ChangeValue(i).Bind(itrt.Key(), itrt.Value()); } }//for... myThreadDrivers = new_dt; }//else... return myThreadDrivers->ChangeValue(thread).Bind(guid, driver); } return Standard_False; } //======================================================================= //function : HasDriver //purpose : //======================================================================= Standard_Boolean TFunction_DriverTable::HasDriver(const Standard_GUID& guid, const Standard_Integer thread) const { if (thread == 0) return myDrivers.IsBound(guid); else if (thread > 0 && !myThreadDrivers.IsNull() && myThreadDrivers->Upper() >= thread) return myThreadDrivers->Value(thread).IsBound(guid); return Standard_False; } //======================================================================= //function : FindDriver //purpose : Returns the driver if find //======================================================================= Standard_Boolean TFunction_DriverTable::FindDriver(const Standard_GUID& guid, Handle(TFunction_Driver)& driver, const Standard_Integer thread) const { if (thread == 0) { if (myDrivers.IsBound(guid)) { driver = myDrivers.Find(guid); return Standard_True; } } else if (thread > 0 && !myThreadDrivers.IsNull() && myThreadDrivers->Upper() >= thread) { if (myThreadDrivers->Value(thread).IsBound(guid)) { driver = myThreadDrivers->Value(thread).Find(guid); return Standard_True; } } return Standard_False; } //======================================================================= //function : Dump //purpose : //======================================================================= Standard_OStream& TFunction_DriverTable::Dump(Standard_OStream& anOS) const { TFunction_DataMapIteratorOfDataMapOfGUIDDriver itr(myDrivers); for (; itr.More(); itr.Next()) { itr.Key().ShallowDump(anOS); anOS<<"\t"; TCollection_ExtendedString es; TDF::ProgIDFromGUID(itr.Key(), es); anOS< 0 && !myThreadDrivers.IsNull() && myThreadDrivers->Upper() >= thread) myThreadDrivers->ChangeValue(thread).UnBind(guid); return Standard_False; } //======================================================================= //function : Clear //purpose : Removes all drivers //======================================================================= void TFunction_DriverTable::Clear() { myDrivers.Clear(); if (!myThreadDrivers.IsNull()) myThreadDrivers.Nullify(); }