| 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] |
| } |
| |