Gaudi Framework, version v20r2

Generated: 18 Jul 2008

PoolDbKeyedContainerCnv.cpp

Go to the documentation of this file.
00001 // $Id: PoolDbKeyedContainerCnv.cpp,v 1.8 2008/01/17 13:20:51 marcocle Exp $
00002 //====================================================================
00003 //      KeyedContainerCnv implementation
00004 //--------------------------------------------------------------------
00005 //
00006 //      Package    : System ( The LHCb Offline System)
00007 //
00008 //  Description: Generic Db data converter for container objects
00009 //
00010 //      Author     : M.Frank
00011 //====================================================================
00012 #include "GaudiKernel/ObjectList.h"
00013 #include "GaudiKernel/ObjectVector.h"
00014 #include "GaudiKernel/KeyedContainer.h"
00015 #include "GaudiKernel/IUpdateable.h"
00016 #include "GaudiPoolDb/PoolDbBaseCnv.h"
00017 #include "GaudiPoolDb/PoolDbKeyedContainerCnv.h"
00018 #include "GaudiKernel/CnvFactory.h"
00019 #include "StorageSvc/DbInstanceCount.h"
00020 
00021 
00022 namespace {
00023   union ObjectTypes {
00024     ObjectTypes(DataObject* p) { Object = p; }
00025     DataObject*                                             Object;
00026     ObjectContainerBase*                                    Base;
00027     ObjectList<ContainedObject>*                            List;
00028     ObjectVector<ContainedObject>*                          Vector;
00029     KeyedContainer<KeyedObject<long>, Containers::Map>*     KeyMap;
00030     KeyedContainer<KeyedObject<long>, Containers::HashMap>* KeyHashMap;
00031     KeyedContainer<KeyedObject<long>, Containers::Array>*   KeyArray;
00032     StatusCode update(int flag)  {
00033       IUpdateable* obj = dynamic_cast<IUpdateable*>(Object);
00034       if ( obj ) {
00035         return obj->update(flag);
00036       }
00037       return StatusCode::FAILURE;
00038     }
00039   };
00040 };
00041 
00043 PoolDbKeyedContainerCnv::PoolDbKeyedContainerCnv(long typ, const CLID& clid, ISvcLocator* svc)
00044 : PoolDbBaseCnv( typ, clid, svc )
00045 {
00046   pool::DbInstanceCount::increment(this);
00047 }
00048 
00050 PoolDbKeyedContainerCnv::~PoolDbKeyedContainerCnv()    {
00051   pool::DbInstanceCount::decrement(this);
00052 }
00053 
00055 StatusCode 
00056 PoolDbKeyedContainerCnv::updateObjRefs(IOpaqueAddress* pAddr, DataObject* pObj)
00057 {
00058   StatusCode sc = PoolDbBaseCnv::updateObjRefs(pAddr, pObj);
00059   if ( sc.isSuccess() )  {
00060     ObjectTypes obj(pObj);
00061     const CLID id = (m_objGuid.Data1&0xFFFF0000);
00062     switch(id) {
00063     case CLID_ObjectList:              /* ObjectList               */
00064       return StatusCode::SUCCESS;
00065     case CLID_ObjectVector:            /* ObjectVector             */
00066       return StatusCode::SUCCESS;
00067     case CLID_ObjectVector+0x0030000:  /* Keyed object map         */
00068       obj.KeyMap->configureDirectAccess();
00069       return StatusCode::SUCCESS;
00070     case CLID_ObjectVector+0x0040000:  /* Keyed object hashmap     */
00071       obj.KeyHashMap->configureDirectAccess();
00072       return StatusCode::SUCCESS;
00073     case CLID_ObjectVector+0x0050000:  /* Keyed indirection array  */
00074       obj.KeyArray->configureDirectAccess();
00075       return StatusCode::SUCCESS;
00076     case 0:                            /* Any other object         */
00077       return StatusCode::SUCCESS;
00078     default:
00079       return obj.update(0);
00080     }
00081     return StatusCode::FAILURE;
00082   }
00083   return sc;
00084 }
00085 
00086 PLUGINSVC_FACTORY_WITH_ID( PoolDbKeyedContainerCnv, 
00087                            ConverterID(POOL_StorageType,CLID_Any + CLID_ObjectVector+0x00030000),
00088                            IConverter*(long, CLID, ISvcLocator*) );
00089 PLUGINSVC_FACTORY_WITH_ID( PoolDbKeyedContainerCnv, 
00090                            ConverterID(POOL_StorageType,CLID_Any + CLID_ObjectVector+0x00040000),
00091                            IConverter*(long, CLID, ISvcLocator*) );
00092 PLUGINSVC_FACTORY_WITH_ID( PoolDbKeyedContainerCnv, 
00093                            ConverterID(POOL_StorageType,CLID_Any + CLID_ObjectVector+0x00050000),
00094                            IConverter*(long, CLID, ISvcLocator*) );
00095 PLUGINSVC_FACTORY_WITH_ID( PoolDbKeyedContainerCnv, 
00096                            ConverterID(POOL_StorageType,CLID_Any | (1<<31)),
00097                            IConverter*(long, CLID, ISvcLocator*) );

Generated at Fri Jul 18 11:59:23 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004