From 081c936c5579d01381a5843c9d2a127baacd4b8f Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Date: Sun, 14 Oct 2007 17:31:08 +0200 Subject: [PATCH] Added UML diagram for Streams. --- doc/devel/UML/stream.violet | 491 ++++++++++++++++++++++++++++++++ doc/devel/UML/stream.violet.png | Bin 0 -> 21694 bytes 2 files changed, 491 insertions(+) create mode 100644 doc/devel/UML/stream.violet create mode 100644 doc/devel/UML/stream.violet.png diff --git a/doc/devel/UML/stream.violet b/doc/devel/UML/stream.violet new file mode 100644 index 0000000..a82f0c1 --- /dev/null +++ b/doc/devel/UML/stream.violet @@ -0,0 +1,491 @@ + + + + + + + + TransformStream + + + + + + 374.71280028618764 + 246.7337520453866 + + + + + + + + get_size() +read() +open() +close() +is_repeatable() + + + + + «interface» +Stream + + + + + + 576.3280239753375 + 43.34897573453627 + + + + + + + + FileStream + + + + + + 741.9465965652432 + 246.8166228690261 + + + + + + + + + + CompressionFilter + + + + + + + + + EncryptionFilter + + + + + + + + + ExtAppFilter + + + + + + + + + filter(in, out) + + + + + «interface» +Filter + + + + + + Filters + + + + + 270.0 + 480.0 + + + + + + + + A Stream to read data from an abstract +file represented by a SourceFile + + + + + + 781.6101730552666 + 137.2161620284267 + + + + + + + + A stream to get data from an arbitrary file +descritor. size must be know in advance. + + + + + + 580.8730162779191 + 392.3137084989848 + + + + + + + + fd : int +size : off_t + + + + + FdStream + + + + + + 565.61818228198 + 253.24264068711926 + + + + + + + + 281.2426406871193 + 620.6274169979695 + + + + + + + + 429.51546936508925 + 624.9910026589843 + + + + + + + + 568.2426406871186 + 624.6274169979695 + + + + + + + + A Filter do a tranformation on a stream of data. +The main difference with TransformSources is that +a Filter can be applied to several sources. +NOTES: +- filter() method still to define +- A filter_changes_size() method can be useful + + + + + + + 724.6274169979696 + 510.3015151901651 + + + + + + + + FilteredStream + + + + + + 439.0 + 357.0 + + + + + + + + size : off_t +lba: off_t + + + + + CutOutStream + + + + + + 321.0 + 358.0 + + + + + + + + This can be implemented as a Filter, but +it has no sense to have the same cut out +filter to several sources, so this is a better +place. + + + + + + 67.0 + 276.0 + + + + + + + + A stream that applies some transformation +to the contents of another stream. + + + + + + 122.0 + 183.0 + + + + + + + + 437.57046683437824 + 509.23933115391503 + + + + + + + + SourceFile + + + + + + 886.7119036079306 + 251.73001410241085 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/devel/UML/stream.violet.png b/doc/devel/UML/stream.violet.png new file mode 100644 index 0000000000000000000000000000000000000000..f5215a50ae42b31bb7da329d10df18921a868c7c GIT binary patch literal 21694 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