1digraph SocketPools { 2 subgraph cluster_legend { 3 label="Legend"; 4 5 ## The following legend is an attempt to match UML notation, 6 ## except for template_class and Factory->object, which are 7 ## invented for this diagram. 8 BaseClass; 9 SubClass [label="Derived Class"]; 10 Whole; 11 Part; 12 A; 13 B; 14 Interface [label="Interface / ABC", style=dashed]; 15 template_class [shape=diamond]; # Link will name parameter(s) 16 17 SubClass -> BaseClass [arrowhead="empty"]; 18 SubClass -> Interface [arrowhead="empty", style=dashed]; 19 Part -> Whole [arrowhead="diamond", label="ownership"]; 20 Part -> Whole [arrowhead="odiamond", label="pointer"]; 21 RefCountedPart -> Whole [arrowhead="diamond", color=red, 22 label="partial\nownership"]; 23 A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", 24 label="association"]; 25 // Often a "subgraph { rank=same; .. }" is used to wrap the 26 // below to make the generative relationship distinctive 27 // from the other class relationships. 28 Factory -> object [arrowhead=veevee]; 29 }; 30 31 ClientSocketPoolBase [shape=diamond]; 32 ClientSocketPoolBaseHelper; 33 34 ClientSocketPoolBaseHelper_ConnectJobFactory 35 [style=dotted, label="ClientSocketPoolBaseHelper::\nConnectJobFactory"]; 36 ClientSocketPoolBase_ConnectJobFactory 37 [style=dotted, shape=diamond, 38 label="ClientSocketPoolBase::\nConnectJobFactory"]; 39 ClientSocketPoolBase_ConnectJobFactoryAdaptor 40 [shape=diamond, 41 label="ClientSocketPoolBase::\nConnectJobFactoryAdaptor"]; 42 43 HigherLayeredPool [style=dotted]; 44 LowerLayeredPool [style=dotted]; 45 ClientSocketPool [style=dotted]; 46 47 ConnectJob [style=dashed]; 48 ConnectJob_Delegate [style=dotted, label="ConnectJob::Delegate"]; 49 50 ClientSocketFactory [style=dotted]; 51 DefaultClientSocketFactory; 52 TCPClientSocket; 53 TransportClientSocket [style=dotted] 54 StreamSocket [style=dotted] 55 Socket; 56 57 TransportSocketParams; 58 TransportConnectJobHelper; 59 TransportConnectJobFactory; 60 TransportConnectJob; 61 62 TransportClientSocketPool -> ClientSocketPool [arrowhead=empty]; 63 ClientSocketPool -> LowerLayeredPool [arrowhead=empty]; 64 ClientSocketPoolBaseHelper -> ConnectJob_Delegate [arrowhead=empty]; 65 TransportConnectJobFactory -> ClientSocketPoolBase_ConnectJobFactory 66 [arrowhead=empty, label="TransportSocketParams"]; 67 ClientSocketPoolBase_ConnectJobFactoryAdaptor -> 68 ClientSocketPoolBaseHelper_ConnectJobFactory 69 [arrowhead=empty, arrowtail=none]; 70 TransportConnectJob -> ConnectJob [arrowhead=empty]; 71 DefaultClientSocketFactory -> ClientSocketFactory [arrowhead=empty]; 72 StreamSocket -> Socket [arrowhead=empty] 73 TCPClientSocket -> TransportClientSocket [arrowhead=empty] 74 TransportClientSocket -> StreamSocket [arrowhead=empty] 75 76 ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; 77 ClientSocketPoolBase -> TransportClientSocketPool 78 [arrowhead=diamond, label="TransportSocketParams"]; 79 ClientSocketPoolBase_ConnectJobFactory -> 80 ClientSocketPoolBase_ConnectJobFactoryAdaptor [arrowhead=diamond]; 81 ClientSocketPoolBaseHelper_ConnectJobFactory -> 82 ClientSocketPoolBaseHelper [arrowhead=diamond]; 83 TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; 84 TransportSocketParams -> TransportConnectJobHelper 85 [arrowhead=diamond, color=red]; 86 87 ConnectJob -> ConnectJob_Delegate 88 [dir=back, arrowhead=none, arrowtail=odiamond]; 89 HigherLayeredPool -> ClientSocketPoolBaseHelper 90 [arrowhead=odiamond, taillabel="*"]; 91 LowerLayeredPool -> ClientSocketPoolBaseHelper 92 [arrowhead=odiamond, taillabel="*"]; 93 ClientSocketFactory -> ClientSocketPoolBaseHelper [arrowhead=odiamond]; 94 95 subgraph { 96 rank=same; 97 ClientSocketPoolBaseHelper_ConnectJobFactory -> ConnectJob 98 [arrowhead=veevee]; 99 } 100 ClientSocketPoolBase_ConnectJobFactory -> ConnectJob [arrowhead=veevee]; 101 ClientSocketFactory -> TCPClientSocket [arrowhead=veevee] 102} 103 104