00001
00002 #ifndef ATHCONTAINERS_USERDATASTORE_H
00003 #define ATHCONTAINERS_USERDATASTORE_H
00004
00005 #ifdef XAOD_STANDALONE
00006
00020 class UserDataStore {
00021
00022 public:
00024 UserDataStore() {}
00025
00026 };
00027
00028 #else
00029
00030 #include "GaudiKernel/StatusCode.h"
00031 #include "AthenaKernel/IAthenaBarCode.h"
00032 #include "GaudiKernel/MsgStream.h"
00033 #include <string>
00034 #include <map>
00035
00036
00037
00038
00039
00040 #include "AthContainers/tools/UDSLabelHashTable.h"
00041 #include "SGTools/CLASS_DEF.h"
00042
00043 #include "boost/any.hpp"
00044
00049 class UserDataStore {
00050
00051 friend class UserDataStoreCnv_p1;
00052
00053 public:
00054
00056 UserDataStore();
00057
00064 template<typename T>
00065 StatusCode record(const IAthenaBarCode& obj, const std::string& label, const T& value);
00066
00067
00074 template<typename T>
00075 StatusCode retrieve(const IAthenaBarCode& obj, const std::string& label, T& value) const;
00076
00077
00084 bool contains(const IAthenaBarCode& obj, const std::string& label) const;
00085
00086
00092 std::vector<const std::string*> getLabels(const AthenaBarCode_t& barcode) const;
00093
00094
00095
00102 StatusCode recordAny(const IAthenaBarCode& obj, const std::string& label, const boost::any& value);
00103
00104
00111 StatusCode retrieveAny(const IAthenaBarCode& obj, const std::string& label, const boost::any*& value) const;
00112
00113
00118 void setEventABC(const AthenaBarCode_t& eventABC);
00119
00120
00121
00126 AthenaBarCode_t getEventABC() const { return m_eventABC; }
00127
00128
00129 enum NotFoundTypes {
00130 ALLGOOD=0,
00131 BARCODE,
00132 LABEL
00133 };
00134
00135 private:
00136
00137
00138
00139
00140
00141
00142
00143 typedef boost::any payload_t;
00144
00145 typedef UDSLabelHashTable::hash_t index_t;
00146
00147 typedef std::map<AthenaBarCode_t,std::map<index_t, payload_t > > mapmap_t;
00148
00149
00150
00151 typedef std::map<index_t, payload_t >::iterator iterator;
00152 typedef std::map<index_t, payload_t >::const_iterator const_iterator;
00153
00154 mapmap_t m_data;
00155
00156
00157 const_iterator find(const AthenaBarCode_t& barcode, const std::string& label) const;
00158
00159
00160
00161
00162 const_iterator m_notFoundIt;
00163 const std::map<index_t, payload_t > m_defaultEntry;
00164
00165 UDSLabelHashTable m_labelTable;
00166
00168 mutable mapmap_t::const_iterator m_lastIt;
00169
00171 mutable mapmap_t::iterator m_lastIt_nc;
00172
00174 AthenaBarCode_t m_eventABC;
00175
00177 mutable MsgStream m_msg;
00178
00179 mutable NotFoundTypes m_whyNotFound;
00180
00181 };
00182
00183 CLASS_DEF( UserDataStore , 51567825 , 1 )
00184
00185 template<typename T>
00186 StatusCode UserDataStore::retrieve(const IAthenaBarCode& obj, const std::string& label, T& value) const {
00187 const boost::any* aValue=0;
00188 StatusCode sc=this->retrieveAny(obj,label, aValue);
00189 if (sc.isFailure()) return sc;
00190 if (typeid(T) != aValue->type()) {
00191 m_msg << MSG::ERROR << "Typeid mismatch while retrieving user data with label " << label << endreq;
00192 return StatusCode::FAILURE;
00193 }
00194 const T* decoPtr=boost::any_cast<T>(aValue);
00195 value=*decoPtr;
00196 return StatusCode::SUCCESS;
00197 }
00198
00199
00200 template<typename T>
00201 StatusCode UserDataStore::record(const IAthenaBarCode& obj, const std::string& label, const T& value) {
00202 boost::any aValue(value);
00203 return this->recordAny(obj,label, aValue);
00204 }
00205
00206 #endif // not XAOD_STANDALONE
00207
00208
00209 #endif // not ATHCONTAINERS_USERDATASTORE_H