PFMatch::DistanceProvider< TrackPositionType, ClusterPositionType > Node1 PFMatch::DistanceProvider < TrackPositionType, ClusterPosition Type > + DistanceProvider() + ~DistanceProvider() + distanceBetween() Node2 PFMatch::IDistanceProvider + ~IDistanceProvider() + distanceBetween() # IDistanceProvider() Node2->Node1 Node3 std::unique_ptr< PFMatch ::DistanceCalculator< TrackPosition Type, ClusterPositionType > > + ptr + operator->() Node3->Node1 -m_distanceCalculator Node4 std::unique_ptr< PFMatch ::TrackPositionProvider < TrackPositionType > > + operator->() Node4->Node1 -m_trackPosition Node5 PFMatch::TrackPositionProvider < TrackPositionType > Node5->Node4 +ptr Node6 PFMatch::PositionProvider < ITrack, TrackPositionType > + ~PositionProvider() + getPosition() # PositionProvider() Node6->Node5 Node7 PFMatch::IPositionProvider + ~IPositionProvider() # IPositionProvider() Node7->Node6 Node10 PFMatch::PositionProvider < ICluster, ClusterPositionType > + ~PositionProvider() + getPosition() # PositionProvider() Node7->Node10 Node8 std::unique_ptr< PFMatch ::ClusterPositionProvider < ClusterPositionType > > + operator->() Node8->Node1 -m_clusterPosition Node9 PFMatch::ClusterPosition Provider< ClusterPositionType > Node9->Node8 +ptr Node10->Node9