The Gaudi Framework  v30r3 (a5ef0a68)
LinkManager.cpp
Go to the documentation of this file.
1 // Experiment specific include files
5 
6 static LinkManager* ( *s_newInstance )() = nullptr;
7 
10 {
11  for ( auto& i : m_linkVector ) delete i;
12 }
13 
16 {
17  if ( m_pObject ) {
18  IRegistry* pReg = m_pObject->registry();
19  if ( pReg ) return pReg->address();
20  }
21  return nullptr;
22 }
23 
26 
28 LinkManager* LinkManager::newInstance() { return s_newInstance ? ( *s_newInstance )() : new LinkManager(); }
29 
32 {
33  return ( 0 <= id && (unsigned)id < m_linkVector.size() ) ? m_linkVector[id] : nullptr;
34 }
35 
38 {
39  if ( pObject ) {
40  for ( auto& i : m_linkVector ) {
41  if ( i->object() == pObject ) return i;
42  }
43  }
44  return nullptr;
45 }
46 
49 {
50  if ( 0 != path.length() ) {
51  for ( auto& i : m_linkVector ) {
52  if ( i->path() == path ) return i;
53  }
54  }
55  return nullptr;
56 }
57 
59 long LinkManager::addLink( const std::string& path, const DataObject* pObject ) const
60 {
61  long n = 0;
62  for ( auto& lnk : m_linkVector ) {
63  const DataObject* pO = lnk->object();
64  if ( pO && pO == pObject ) return n;
65  if ( lnk->path() == path ) {
66  if ( pObject && pObject != pO ) {
67  lnk->setObject( const_cast<DataObject*>( pObject ) );
68  }
69  return n;
70  }
71  ++n;
72  }
73  // Link is completely unknown
74  m_linkVector.emplace_back( new Link( m_linkVector.size(), path, const_cast<DataObject*>( pObject ) ) );
75  return m_linkVector.back()->ID();
76 }
77 
78 // Remove a link by object reference
79 long LinkManager::removeLink( const DataObject* pObject ) const
80 {
81  long n = 0;
82  for ( auto i = m_linkVector.begin(); i != m_linkVector.end(); i++ ) {
83  if ( ( *i )->object() == pObject ) {
84  delete *i;
85  m_linkVector.erase( i );
86  return n;
87  }
88  ++n;
89  }
90  return INVALID;
91 }
92 
93 // Remove a link by object reference
95 {
96  long n = 0;
97  for ( auto i = m_linkVector.begin(); i != m_linkVector.end(); i++ ) {
98  if ( ( *i )->path() == path ) {
99  delete *i;
100  m_linkVector.erase( i );
101  return n;
102  }
103  n++;
104  }
105  return INVALID;
106 }
107 
108 // Remove a link by object reference
109 long LinkManager::removeLink( long id ) const
110 {
111  auto i = std::next( m_linkVector.begin(), id );
112  delete *i;
113  m_linkVector.erase( i );
114  return id;
115 }
116 
119 {
120  for ( auto& i : m_linkVector ) delete i;
121  m_linkVector.clear();
122 }
STL class.
T next(T...args)
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
T length(T...args)
Opaque address interface definition.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30