Piece tableIn computing, a piece table is a data structure typically used to represent a text document while it is edited in a text editor. Initially a reference (or 'span') to the whole of the original file is created, which represents the as yet unchanged file. Subsequent inserts and deletes replace a span by combinations of one, two, or three references to sections of either the original document or to a buffer holding inserted text.[1] Typically the text of the original document is held in one immutable block, and the text of each subsequent insert is stored in new immutable blocks. Because even deleted text is still included in the piece table, this makes multi-level or unlimited undo easier to implement with a piece table than with alternative data structures such as a gap buffer. This data structure was invented by J Strother Moore.[2] DescriptionFor this description, we use buffer as the immutable block to hold the contents. A piece table consists of three columns:[1]
In addition to the table, two buffers are used to handle edits:
OperationsIndex
To retrieve the i-th character of the PTD, the appropriate entry in a piece table is read. ExampleGiven the following buffers and piece table:
A real implementation of a piece table will not include a The piece table's ordering of rows implicitly describes the ordering of characters to use from the available buffers. I.e., the first row of the piece table (e.g., <Add,0,6>) describes the first sequence of characters in the PTD (e.g., PTD Indices 0-5). The second row of the piece table (e.g., <Original,0,5>) describes the sequence of characters from a possibly different buffer that will immediately follow the characters chosen from the first sequence (e.g., PTD Indices 6-10). This continues to the end of the PTD. In the above example, the piece table indicates that the PTD will have 6+5+6+9 = 26 characters. To get the (character) value Buffer_IdxOfSoughtChar = PTD_SoughtIndex - PTD_StartIdxOfEntry + Buffer_StartIdxOfEntry 21 = 15 - 11 + 17 SoughtChar = Entry_NameOfBuffer[Buffer_IdxOfSoughtChar] 'o' = AddFileBuf[21] --------------------------- So, 'o' = Index(15) For the buffers and piece table given above, the following PTD is shown: "Lorem " (from piece table entry 1) +"ipsum" (from piece table entry 2) +" dolor" (from piece table entry 3) +" sit amet" (from piece table entry 4) -------------------------- Lorem ipsum dolor sit amet InsertInserting characters to the text consists of:
DeleteSingle character deletion can be one of two possible conditions:
UsageSeveral text editors use an in-RAM piece table internally, including Bravo,[1] Abiword,[3][4][5] Atom[6] and Visual Studio Code.[7] The "fast save" feature in some versions of Microsoft Word uses a piece table for the on-disk file format.[2] The on-disk representation of text files in the Oberon System uses a piece chain technique that allows pieces of one document to point to text stored in some other document, similar to transclusion. [8] See also
References
|