File indexing completed on 2025-02-21 10:00:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef GAUDIKERNEL_LINKMANAGER_H
0012 #define GAUDIKERNEL_LINKMANAGER_H
0013
0014
0015 #include <memory>
0016 #include <string>
0017 #include <vector>
0018
0019 #include "GaudiKernel/Kernel.h"
0020
0021 class DataObject;
0022 class IOpaqueAddress;
0023
0024
0025
0026
0027
0028
0029
0030
0031 class GAUDI_API LinkManager final {
0032
0033 public:
0034
0035 enum DirLinkType { INVALID, VALID };
0036
0037
0038
0039
0040
0041 class Link final {
0042
0043 std::string m_path;
0044
0045 DataObject* m_pObject = nullptr;
0046
0047 long m_id = INVALID;
0048
0049 public:
0050
0051 Link( long id, std::string path, DataObject* pObject = nullptr )
0052 : m_path( std::move( path ) ), m_pObject( pObject ), m_id( id ) {}
0053
0054 Link() = default;
0055
0056 bool operator==( const Link& link ) const { return link.m_path == m_path; }
0057
0058 void setObject( const DataObject* pObject ) { m_pObject = const_cast<DataObject*>( pObject ); }
0059
0060 const DataObject* object() const { return m_pObject; }
0061 DataObject* object() { return m_pObject; }
0062
0063 const std::string& path() const { return m_path; }
0064
0065 long ID() const { return m_id; }
0066
0067 IOpaqueAddress* address();
0068 };
0069
0070 private:
0071
0072
0073
0074
0075
0076
0077
0078
0079 std::vector<Link*> m_linkVector;
0080
0081 public:
0082
0083 LinkManager() = default;
0084 LinkManager( LinkManager&& ) = default;
0085 LinkManager& operator=( LinkManager&& ) = default;
0086 LinkManager( LinkManager const& ) = delete;
0087 LinkManager& operator=( LinkManager const& ) = delete;
0088
0089 ~LinkManager();
0090
0091 long size() const { return m_linkVector.size(); }
0092 bool empty() const { return m_linkVector.empty(); }
0093
0094 const Link* link( long id ) const;
0095 Link* link( long id );
0096
0097 const Link* link( const DataObject* pObject ) const;
0098 Link* link( const DataObject* pObject );
0099
0100 const Link* link( std::string_view path ) const;
0101 Link* link( std::string_view path );
0102
0103 long addLink( const std::string& path, const DataObject* pObject );
0104
0105 struct Sentinel {};
0106 Sentinel end() const { return {}; }
0107 auto begin() const {
0108 class Iterator {
0109 int i;
0110 LinkManager const* parent;
0111
0112 public:
0113 Iterator( LinkManager const* p, int i ) : i{ i }, parent{ p } {}
0114 bool operator==( Sentinel ) const { return i == parent->size(); }
0115 bool operator!=( Sentinel ) const { return !( *this == Sentinel{} ); }
0116 Iterator& operator++() {
0117 ++i;
0118 return *this;
0119 }
0120 const Link& operator*() const { return *parent->link( i ); }
0121 };
0122 return Iterator{ this, 0 };
0123 }
0124 };
0125 #endif