From eabeee3b7b77af2b58f8a1f58c2b84ef45b0d670 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 23 Oct 2015 00:40:02 +0200 Subject: [PATCH] decide on the implementation approach for tree diff application this boils down to the two alternatives - manipulate the target data structure - build an altered copy since our goal is to handle large tree structures efficiently, the decision was cast in favour of data manipulation --- src/lib/diff/diff-language.hpp | 1 + src/lib/diff/list-diff-application.hpp | 3 + src/lib/diff/record.hpp | 5 + src/lib/diff/tree-diff-application.hpp | 7 + wiki/thinkPad.ichthyo.mm | 272 ++++++++++++++++++++++++- 5 files changed, 283 insertions(+), 5 deletions(-) diff --git a/src/lib/diff/diff-language.hpp b/src/lib/diff/diff-language.hpp index 471ab6234..ee31a026a 100644 --- a/src/lib/diff/diff-language.hpp +++ b/src/lib/diff/diff-language.hpp @@ -296,6 +296,7 @@ namespace diff{ { for ( ; diff; ++diff ) diff->applyTo(target_); + target_.finalise(); } }; diff --git a/src/lib/diff/list-diff-application.hpp b/src/lib/diff/list-diff-application.hpp index 5f24ae0f6..35a6b8449 100644 --- a/src/lib/diff/list-diff-application.hpp +++ b/src/lib/diff/list-diff-application.hpp @@ -167,6 +167,9 @@ namespace diff{ swap (seq_, orig_); // pos_ still refers to original input sequence, which has been moved to orig_ seq_.reserve (targetVector.size() * 120 / 100); // heuristics for storage pre-allocation } + + /** clean-up and make changes effective within target */ + void finalise() { /* NOP for this implementation */ } }; diff --git a/src/lib/diff/record.hpp b/src/lib/diff/record.hpp index 92cd77f0b..fbeaf0eef 100644 --- a/src/lib/diff/record.hpp +++ b/src/lib/diff/record.hpp @@ -449,6 +449,11 @@ namespace diff{ return *this; } + /* === low-level access (e.g. for diff application === */ + + Storage& attribs() { return record_.attribs_; } + Storage& children() { return record_.children_; } + /* === extension point for building specific value types === */ /* diff --git a/src/lib/diff/tree-diff-application.hpp b/src/lib/diff/tree-diff-application.hpp index 16b58620b..2e66f42ac 100644 --- a/src/lib/diff/tree-diff-application.hpp +++ b/src/lib/diff/tree-diff-application.hpp @@ -117,6 +117,13 @@ namespace diff{ { UNIMPLEMENTED(); } + + /** clean-up and make changes effective within target */ + void + finalise() + { + UNIMPLEMENTED("push rebuilt Record into target"); + } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 958addd9f..da1bd08e7 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -1161,8 +1161,7 @@ pick(Ref::CHILD)

- - + @@ -1182,8 +1181,7 @@ weil er zu Zweideutigekeigen führt und daher Struktur oder Konsistenzfehler überspielt

- - +
@@ -1612,13 +1610,277 @@ - + + + + + + + + + + + + +

+ List-Diff +

+

+ als Spezialfall +

+ +
+ + + + + + + + + + + + +

+ kann auch nicht +

+

+ wegen dem Interpreter +

+ +
+ + + + + + + + + + + + +

+ leicht auf generischen Container +

+

+ zu verallgemeinern +

+ +
+ +
+ + + + + + +

+ Erkennung hat die Sprache als Parameter, +

+

+ und verwendet sie zur Token-Generierung +

+ +
+
+ + + + + + +

+ man kann auch dem List-Detector +

+

+ eine Tree-Diff-Language geben +

+ +
+ +
+
+
+
+ + + + + + + +

+ Frage: in-Place? +

+ +
+ + + + + + + + + + + + + + + + + +

+ entscheidende Frage: wie addressieren? +

+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +

+ und wird durch die Diff-Anwendung konsumiert +

+ +
+
+
+ + + + + + + + + + + + + + + +

+ Immutablility erzwingt +

+
    +
  • + persistente Datenstrukturen +
  • +
  • + garbage-collector +
  • +
+ + +
+
+
+ + + + + + + + + + + + + +

+ Innereien des alten Record verbrauchen +

+ + +
+
+ + + + + + + + +

+ Problem: Konstruktion nach Diff +

+ + +
+ + + + + + + + + + + + + + + + +

+ d.h. es gibt eine Methode applyChanges. +

+

+ Die generische Implementierung verwendet diese nach Aufspielen des Diff +

+ + +
+
+
+
+
+
+ + + + + + +