digraph SocketPools { subgraph cluster_legend { label="Legend"; ## The following legend is an attempt to match UML notation, ## except for template_class and Factory->object, which are ## invented for this diagram. BaseClass; SubClass [label="Derived Class"]; Whole; Part; A; B; Interface [label="Interface / ABC", style=dashed]; template_class [shape=diamond]; # Link will name parameter(s) SubClass -> BaseClass [arrowhead="empty"]; SubClass -> Interface [arrowhead="empty", style=dashed]; Part -> Whole [arrowhead="diamond", label="ownership"]; Part -> Whole [arrowhead="odiamond", label="pointer"]; RefCountedPart -> Whole [arrowhead="diamond", color=red, label="partial\nownership"]; A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", label="association"]; // Often a "subgraph { rank=same; .. }" is used to wrap the // below to make the generative relationship distinctive // from the other class relationships. Factory -> object [arrowhead=veevee]; }; ClientSocketPoolBase [shape=diamond]; ClientSocketPoolBaseHelper; ClientSocketPoolBaseHelper_ConnectJobFactory [style=dotted, label="ClientSocketPoolBaseHelper::\nConnectJobFactory"]; ClientSocketPoolBase_ConnectJobFactory [style=dotted, shape=diamond, label="ClientSocketPoolBase::\nConnectJobFactory"]; ClientSocketPoolBase_ConnectJobFactoryAdaptor [shape=diamond, label="ClientSocketPoolBase::\nConnectJobFactoryAdaptor"]; HigherLayeredPool [style=dotted]; LowerLayeredPool [style=dotted]; ClientSocketPool [style=dotted]; ConnectJob [style=dashed]; ConnectJob_Delegate [style=dotted, label="ConnectJob::Delegate"]; ClientSocketFactory [style=dotted]; DefaultClientSocketFactory; TCPClientSocket; TransportClientSocket [style=dotted] StreamSocket [style=dotted] Socket; TransportSocketParams; TransportConnectJobHelper; TransportConnectJobFactory; TransportConnectJob; TransportClientSocketPool -> ClientSocketPool [arrowhead=empty]; ClientSocketPool -> LowerLayeredPool [arrowhead=empty]; ClientSocketPoolBaseHelper -> ConnectJob_Delegate [arrowhead=empty]; TransportConnectJobFactory -> ClientSocketPoolBase_ConnectJobFactory [arrowhead=empty, label="TransportSocketParams"]; ClientSocketPoolBase_ConnectJobFactoryAdaptor -> ClientSocketPoolBaseHelper_ConnectJobFactory [arrowhead=empty, arrowtail=none]; TransportConnectJob -> ConnectJob [arrowhead=empty]; DefaultClientSocketFactory -> ClientSocketFactory [arrowhead=empty]; StreamSocket -> Socket [arrowhead=empty] TCPClientSocket -> TransportClientSocket [arrowhead=empty] TransportClientSocket -> StreamSocket [arrowhead=empty] ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; ClientSocketPoolBase -> TransportClientSocketPool [arrowhead=diamond, label="TransportSocketParams"]; ClientSocketPoolBase_ConnectJobFactory -> ClientSocketPoolBase_ConnectJobFactoryAdaptor [arrowhead=diamond]; ClientSocketPoolBaseHelper_ConnectJobFactory -> ClientSocketPoolBaseHelper [arrowhead=diamond]; TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; TransportSocketParams -> TransportConnectJobHelper [arrowhead=diamond, color=red]; ConnectJob -> ConnectJob_Delegate [dir=back, arrowhead=none, arrowtail=odiamond]; HigherLayeredPool -> ClientSocketPoolBaseHelper [arrowhead=odiamond, taillabel="*"]; LowerLayeredPool -> ClientSocketPoolBaseHelper [arrowhead=odiamond, taillabel="*"]; ClientSocketFactory -> ClientSocketPoolBaseHelper [arrowhead=odiamond]; subgraph { rank=same; ClientSocketPoolBaseHelper_ConnectJobFactory -> ConnectJob [arrowhead=veevee]; } ClientSocketPoolBase_ConnectJobFactory -> ConnectJob [arrowhead=veevee]; ClientSocketFactory -> TCPClientSocket [arrowhead=veevee] }