% Metapost figure compiled offline to create the class diagram for modular fold/reduce % need MetaUML (https://github.com/ogheorghies/MetaUML) to compile this file % to create pdf figure: mptopdf class_diagram.mp input metauml; beginfig(1); iClass.foreColor := (.9, .9, .8); % global color for all classes %------------------------------------------------------ % classes in 1st column Class.A("DynamicStruct") () ("+DynamicStruct()", "#copy()", "#setSize()"); ClassTemplate.TA("Container")(A); Class.B("Accumulator") () ("+Accumulator()", "+operator<<()", "+operator=()", "#bind()"); ClassTemplate.TB("Container")(B); Class.C("HandleMap") () (); ClassTemplate.TC("EigenType,", "Handle")(C); topToBottom(35)(A, B, C); drawObjects(A, TA, B, TB, C, TC); %------------------------------------------------------ % classes in 2nd column Class.D("DynamicStructContainer") () ("+rootContainer()", "+storage()", "+byteStream()"); D.nw = (120, 90); classStereotypes.D("<>"); Class.E("Rebindable") () ("+rebind()"); classStereotypes.E("<>"); Class.F("Ref") () ("+operator T&()", "+ptr()"); ClassTemplate.TF("T")(F); Note.EB("Member variables", "need to be", "Rebindable"); EB.s = E.n + (40, 30); EB.info.foreColor := (.7, .7, .7); EB.info.iName.iFont.scale := 0.5; leftToRight(60)(B, E); topToBottom(30)(E, F); drawObjects(D, E, F, TF, EB); %------------------------------------------------------ % classes in 3rd column Class.G("DynamicStructRootContainer") ()(); G.nw = (250, 30); ClassTemplate.TG("Storage")(G); Class.H("ByteStream") () ("+seek()", "+rdstate()", "+size()", "+tell()", "+eof()", "+read()"); ClassTemplate.TH("StreamBuf")(H); Class.I("ByteStreamHandleBuf") ("#pos") ("+seek()", "+size()", "+tell()", "+resize()"); ClassTemplate.TI("Storage")(I); Class.J("ContiguousDataHandle") () ("+ptr()"); classStereotypes.J("<>"); topToBottom(35)(G, H, I, J); drawObjects(G, TG, H, TH, I, TI, J); %------------------------------------------------------ % links in 1st column link(inheritance)(pathManhattanY(A.n, D.w)); link(inheritance)(B.n -- A.s); link(compositionUni)(E.w -- B.e); clink(dashedLink)(B, EB); link(inheritance)(C.n -- E.sw); % links in 2nd column link(association)(pathManhattanY(D.s, A.e)); item(iAssoc)("1")(obj.nw = D.s); item(iAssoc)("container")(obj.ne = D.s); link(inheritance)(F.n -- E.s); % links in 3rd column link(inheritance)(pathManhattanY(G.n, D.e)); link(association)(G.s -- H.n); item(iAssoc)("1")(obj.sw = H.n); item(iAssoc)("byteStream")(obj.se = H.n); link(association)(H.s -- I.n); item(iAssoc)("1")(obj.sw = I.n); item(iAssoc)("streamBuf")(obj.se = I.n); link(association)(I.s -- J.n); item(iAssoc)("1")(obj.sw = J.n); item(iAssoc)("storage")(obj.se = J.n); endfig; end