5#include "GaudiKernel/ObjectList.h"
6#include "GaudiKernel/SmartRef.h"
26 template <
class T1,
class T2>
class RelTable {
33 void init() { m_relations =
new ObjectList<Relation<T1, T2>>; }
92 unsigned long size()
const;
99 ObjectList<Relation<T1, T2>>* m_relations;
111 template <
class T1,
class T2>
122 bindRelationFirst( rel );
123 bindRelationSecond( rel );
124 m_relations->push_back( rel );
136 if ( bindRelationNoDup( rel ) )
138 bindRelationSecond( rel );
139 m_relations->push_back( rel );
145 template <
class T1,
class T2>
152 std::vector<Relation<T1, T2>*> rels;
153 if ( !m_relations->size() )
return rels;
154 SmartRef<Relation<T1, T2>> r = m_relations->front();
155 while ( pobj != r->getFirst() && r->m_first.getFirst() ) { r = r->m_first.getFirst(); }
157 if ( pobj == r->getFirst() )
160 while ( r->m_first.getSame() )
162 rels.push_back( r->m_first.getSame() );
163 r = r->m_first.getSame();
169 template <
class T1,
class T2>
175 std::vector<Relation<T1, T2>*> rels;
176 if ( !m_relations->size() )
return rels;
177 SmartRef<Relation<T1, T2>> r = m_relations->front();
178 while ( pobj != r->getSecond() && r->m_second.getFirst() ) { r = r->m_second.getFirst(); }
180 if ( pobj == r->getSecond() )
183 while ( r->m_second.getSame() )
185 rels.push_back( r->m_second.getSame() );
186 r = r->m_second.getSame();
198 m_relations->remove( rel );
202 template <
class T1,
class T2>
209 m_relations->remove( rel );
210 rel->setFirst( pobj );
214 template <
class T1,
class T2>
221 m_relations->remove( rel );
222 rel->setSecond( pobj );
229 return m_relations->size();
232 template <
class T1,
class T2>
238 template <
class T1,
class T2>
243 if ( m_relations->size() )
245 SmartRef<Relation<T1, T2>> r = m_relations->front();
246 while ( ( r->getFirst() != rel->
getFirst() ) )
248 if ( r->m_first.getFirst() ) { r = r->m_first.getFirst(); }
252 if ( r->getFirst() != rel->
getFirst() )
254 r->m_first.setFirst( rel );
261 if ( temp ) temp->m_first.
setPrev( rel );
262 r->m_first.setSame( rel );
268 template <
class T1,
class T2>
272 if ( m_relations->size() )
274 SmartRef<Relation<T1, T2>> r = m_relations->front();
276 while ( ( r->getSecond() != rel->getSecond() ) )
278 if ( r->m_second.getFirst() ) { r = r->m_second.getFirst(); }
282 if ( r->getSecond() != rel->getSecond() )
284 r->m_second.setFirst( rel );
285 rel->m_second.setPrev( r );
289 temp = r->m_second.getSame();
290 rel->m_second.setSame( temp );
291 if ( temp ) temp->m_second.setPrev( rel );
292 r->m_second.setSame( rel );
293 rel->m_second.setPrev( r );
298 template <
class T1,
class T2>
303 if ( rel1->getSecond() == rel2->getSecond() )
return rel1;
304 rel1 = rel1->m_first.getSame();
309 template <
class T1,
class T2>
314 if ( m_relations->size() )
316 SmartRef<Relation<T1, T2>> r = m_relations->front();
317 while ( ( r->getFirst() != rel->getFirst() ) )
319 if ( r->m_first.getFirst() ) { r = r->m_first.getFirst(); }
323 if ( r->getFirst() != rel->getFirst() )
325 r->m_first.setFirst( rel );
326 rel->m_first.setPrev( r );
331 temp = findDup( r, rel );
334 temp = r->m_first.getSame();
335 rel->m_first.setSame( temp );
336 if ( temp ) temp->m_first.setPrev( rel );
337 r->m_first.setSame( rel );
338 rel->m_first.setPrev( r );
343 std::copy( rel->m_infos.begin(), rel->m_infos.end(),
344 std::back_inserter( temp->m_infos ) );
352 template <
class T1,
class T2>
357 prev = rel->m_first.getPrev();
358 next = rel->m_first.getSame();
359 if ( next )
next->m_first.setPrev( prev );
362 if (
prev->m_first.getFirst() )
prev->m_first.setFirst( next );
363 else prev->m_first.setSame( next );
365 first = rel->m_first.getFirst();
366 if ( first )
first->m_first.setPrev( next );
367 rel->m_first.setPrev( 0 );
368 rel->m_first.setSame( 0 );
369 rel->m_first.setFirst( 0 );
372 template <
class T1,
class T2>
377 prev = rel->m_second.getPrev();
378 next = rel->m_second.getSame();
379 if ( next )
next->m_second.setPrev( prev );
382 if (
prev->m_second.getFirst() )
prev->m_second.setFirst( next );
383 else prev->m_second.setSame( next );
385 first = rel->m_second.getFirst();
386 if ( first )
first->m_second.setPrev( next );
387 rel->m_second.setPrev( 0 );
388 rel->m_second.setSame( 0 );
389 rel->m_second.setFirst( 0 );
Relation< T2, T3 > * getSame()
void setSame(Relation< T2, T3 > *rel)
void setPrev(Relation< T2, T3 > *rel)
void changeSecond(Relation< T1, T2 > *rel, T2 *pobj)
std::vector< Relation< T1, T2 > * > getRelBySecond(const T2 *pobj) const
void init()
Initialize the internal pointer to an ObjectList of relations.
ObjectList< Relation< T1, T2 > > * getAllRelations() const
Returns the pointer to the collection of relations.
unsigned long size() const
This method returns the number of relations in the table.
void erase(Relation< T1, T2 > *rel)
bool addRelation(Relation< T1, T2 > *rel)
RelTable(ObjectList< Relation< T1, T2 > > *rels)
std::vector< Relation< T1, T2 > * > getRelByFirst(const T1 *pobj) const
void changeFirst(Relation< T1, T2 > *rel, T1 *pobj)
void addDupRel(Relation< T1, T2 > *rel)
const T1 * getFirst() const
This class is used to wrap a collection of Relations.