[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevelop/plugins/teamwork
From:       David Nolden <david.nolden.kde () art-master ! de>
Date:       2007-05-31 22:59:08
Message-ID: 1180652348.032860.8058.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 670288 by zwabel:

Check in my last work on the document-transformation. I forgot checking it in. It \
probably makes the document-transformation makes it work a bit better, but is not \
ready yet. I don't quite remember whether this creates any problems in the \
file-collaboration, but I check it in now to make sure these changes are not lost

 M  +0 -1      collaborationmanager.cpp  
 M  +0 -5      documentwrapper.cpp  
 M  +19 -183   lib/dynamictext/dynamictext.cpp  
 M  +4 -2      lib/dynamictext/dynamictext.h  
 M  +6 -2      lib/dynamictext/dynamictexthelpers.h  
 M  +36 -1     lib/dynamictext/main.cpp  
 M  +1 -1      vectortimestampeditor.cpp  


--- trunk/KDE/kdevelop/plugins/teamwork/collaborationmanager.cpp #670287:670288
@@ -29,7 +29,6 @@
 #include <QStandardItemModel>
 
 Q_DECLARE_METATYPE( MessagePointer )
-
 using namespace std;
 typedef QPointer<FileCollaborationSession> QFileCollaborationSessionPointer;
 Q_DECLARE_METATYPE( QPersistentModelIndex )
--- trunk/KDE/kdevelop/plugins/teamwork/documentwrapper.cpp #670287:670288
@@ -57,11 +57,6 @@
 #define IFDEBUG( x ) /**/
 //#define IFDEBUG( x ) x
 
-std::ostream& operator << ( std::ostream& o, const SimpleReplacement& rhs ) {
-  o << "( at " << rhs.m_position << ": '" << rhs.m_oldText << "' -> '" << \
                rhs.m_newText << "' )";
-  return o;
-}
-
 struct DocumentWrapperTreeAction : public \
StandardCollaborationTreeAction<DocumentWrapper> {  DocumentWrapperTreeAction( \
DocumentWrapper* w ) : StandardCollaborationTreeAction<DocumentWrapper>( w ) {}  \
                virtual void doubleClicked() {
--- trunk/KDE/kdevelop/plugins/teamwork/lib/dynamictext/dynamictext.cpp \
#670287:670288 @@ -15,6 +15,7 @@
 #define NOCATCH
 
 #include "network/serialization.h"
+#include <ostream>
 #include "dynamictext.h"
 #include "verify.h"
 
@@ -24,6 +25,10 @@
 typedef DynamicTextErrorDummy CatchedDynamicTextError;
 #endif
 
+std::ostream& operator << ( std::ostream& o, const SimpleReplacement& rhs ) {
+  o << "( at " << rhs.m_position << ": '" << rhs.m_oldText << "' -> '" << \
rhs.m_newText << "' )"; +  return o;
+}
 
 CROSSMAP_KEY_EXTRACTOR( WeakReplacementPointer, WeakReplacementPointer, 0, value )
 CROSSMAP_KEY_EXTRACTOR( WeakReplacementPointer, VectorTimestamp, 0, \
value->vectorStamp() ) @@ -61,32 +66,33 @@
 
 
 template <class TextType>
-bool Replacement::apply( TextType& text, const OffsetMap& outerOffset, OffsetMap& \
contextOffset ) { +bool Replacement::apply( TextType& text, const OffsetMap& \
outerOffset, OffsetMap& staticOffset ) {  if ( m_enabled ) {
-    int pos = outerOffset( contextOffset( m_replacement.m_position ) );
+    std::cout << "applying replacement " << replacement() << "\noffset: " << \
outerOffset.print() << "\nstaticOffset: " << staticOffset.print() << endl; +    int \
pos = outerOffset( staticOffset( m_replacement.m_position ) );  \
DYN_VERIFY_SMALLERSAME( 0, pos );  DYN_VERIFY_SMALLERSAME( (int)pos, \
                (int)text.length() );
     DYN_VERIFY_SAME( text.substr( pos, m_replacement.m_oldText.length() ), \
m_replacement.m_oldText );  
     text.replace( pos, m_replacement.m_oldText.length(), m_replacement.m_newText );
   } else {
-    contextOffset %= ~offset( outerOffset );
+    staticOffset %= ~offset( outerOffset );
   }
 
   return true;
 }
 
 template <class TextType>
-bool Replacement::unApply( TextType& text, const OffsetMap& outerOffset, OffsetMap& \
contextOffset ) { +bool Replacement::unApply( TextType& text, const OffsetMap& \
outerOffset, OffsetMap& staticOffset ) {  if ( m_enabled ) {
-    int pos = outerOffset( contextOffset( m_replacement.m_position ) );
+    int pos = outerOffset( staticOffset( m_replacement.m_position ) );
     DYN_VERIFY_SMALLERSAME( 0, pos );
     DYN_VERIFY_SMALLERSAME( (int)pos, (int)text.length() );
     DYN_VERIFY_SAME( text.substr( pos, m_replacement.m_newText.length() ), \
m_replacement.m_newText );  
     text.replace( pos, m_replacement.m_newText.length(), m_replacement.m_oldText );
   } else {
-    contextOffset %= offset( outerOffset );
+    staticOffset %= offset( outerOffset );
   }
 
   return true;
@@ -378,164 +384,6 @@
   return true;
 }
 
-#ifdef OLDOFFSET
-OffsetMap DynamicText::offset( VectorTimestamp from, VectorTimestamp to ) {
-  if ( from == to )
-    return OffsetMap();
-
-  OffsetRequest request( from, to );
-
-  OffsetCache::iterator it = m_offsetCache.find( request );
-
-  if ( it != m_offsetCache.end() ) {
-    return ( *it ).second;
-  }
-
-  bool backwards = true;
-  if ( from.smallerOrSame( to ) ) {
-    backwards = false;
-    VectorTimestamp t = from;
-    from = to;
-    to = t;
-  }
-  DYN_VERIFY( to.smallerOrSame( from ) );
-
-  static int depth = 0;
-  depth++;
-
-  DYN_VERIFY_SMALLER( depth, 5000 );
-
-  if ( from == to )
-    return OffsetMap();
-
-  bool applied = true;
-
-  uint sz = m_applied.size();
-
-  DYN_VERIFY_SMALLERSAME( to.size(), sz );
-  DYN_VERIFY_SMALLERSAME( from.size(), sz );
-
-  std::vector<ReplacementPointer> chains( sz );
-  for ( uint a = 0; a < sz; a++ ) {
-    chains[ a ] = m_applied[ a ].last;
-    if ( !chains[ a ] )
-      chains[ a ] = m_unApplied[ a ].first;
-    if ( chains[ a ] )
-      DYN_VERIFY_SAME( chains[ a ] ->primaryIndex(), a );
-    //if( backwards ) {
-    while ( chains[ a ] && chains[ a ] ->primaryStamp() > from[ a ] )
-      chains[ a ] = chains[ a ] ->prev();
-    //} else {
-    while ( chains[ a ] && chains[ a ] ->primaryStamp() < from[ a ] )
-      chains[ a ] = chains[ a ] ->next();
-    //}
-    if ( chains[ a ] )
-      DYN_VERIFY_SAME( chains[ a ] ->primaryStamp(), from[ a ] );
-  }
-
-  OffsetMap offset;
-  VectorTimestamp currentState = from;
-
-  SafetyCounter s( 10000 );
-
-  bool waited = false;
-
-  while ( applied || waited ) {
-    DYN_VERIFY( s );
-
-    bool force = false;
-    if ( waited && !applied ) { ///If there is an inheritance-chain, break it by \
                just applying the first one.
-      force = true;
-      waited = false;
-    }
-    applied = false;
-    waited = false;
-
-    //Apply all replacements that can be applied to the current state, and need to \
                be applied.
-    for ( uint a = 0; a < chains.size(); a++ ) {
-      ReplacementPointer& r( chains[ a ] );
-      if ( !r )
-        continue;
-      DYN_VERIFY( r );
-      const VectorTimestamp& s( r->vectorStamp() );
-
-      if ( s.primaryStamp() > to[ s.primaryIndex() ] ) {
-
-        if ( !force ) {
-          ///Find out if there's another one that can be unapplied, and that should \
                be unapplied before this one. If there is one, wait.
-          bool wait = false;
-          for ( uint b = 0; b < chains.size(); b++ ) {
-            if ( b == a )
-              continue;
-
-            ReplacementPointer& r2( chains[ b ] );
-            if ( !r2 )
-              continue;
-            const VectorTimestamp& s2( r2->vectorStamp() );
-
-            if ( s2.primaryStamp() > to[ s2.primaryIndex() ] && currentState[ \
                s2.primaryIndex() ] >= s2.primaryStamp() ) {
-              ///The other replacement has to be unapplied
-              if ( s[ b ] < s2.primaryStamp() || s2[ a ] >= s.primaryStamp() ) {
-                ///The other replacement should be unapplied before this one
-                wait = true;
-                break;
-              }
-            }
-          }
-
-          if ( wait ) {
-            waited = true;
-            continue;
-          }
-        } else {
-          force = false;
-        }
-
-        OffsetMap selfOffset;
-
-        /*VectorTimestamp prev = currentState;
-        prev.setPrimaryIndex( a );
-        if ( prev.primaryStamp() != 0 ) {
-          prev.decrease();
-          VectorTimestamp selfPrev = s;
-          DYN_VERIFY( selfPrev.primaryStamp() != 0 );
-          selfPrev.decrease();
-          DYN_VERIFY( selfPrev.primaryStamp() >= 0 );
-
-          selfOffset = this->offset( prev, selfPrev );
-        }*/
-
-        if ( backwards ) {
-          offset = offset % ( chains[ a ] ->offset( selfOffset ) );
-        } else {
-          offset = offset % ( ~chains[ a ] ->offset( selfOffset ) );
-        }
-        /*if ( backwards ) {
-          offset = ( chains[ a ] ->offset( selfOffset ) ) % offset;
-        } else {
-          offset = ( ~chains[ a ] ->offset( selfOffset ) ) % offset;
-        }*/
-
-        r = r->prev();
-
-        currentState.setPrimaryIndex( s.primaryIndex() );
-        currentState.decrease();
-        DYN_VERIFY_SMALLERSAME( to[ s.primaryIndex() ], currentState.primaryStamp() \
                );
-
-        applied = true;
-      }
-    }
-  }
-
-  depth--;
-
-  DYN_VERIFY_SAME( currentState, to );
-  m_offsetCache.insert( OffsetCache::value_type( request, offset ) );
-
-  return offset;
-}
-#else
-
 OffsetMap DynamicText::offset( VectorTimestamp from, VectorTimestamp to, int \
position ) {  if ( from == to )
     return OffsetMap();
@@ -656,15 +504,15 @@
         if ( to[ a ] < from[ a ] ) {
           VectorTimestamp n = from;
           n.setPrimaryIndex( a );
-          n.decrease();
+          n.decrease(); ///n = the intermediate state we are stepping to
 
           VectorTimestamp prev = chains[a]->vectorStamp();
-          prev.decrease();
+          prev.decrease(); ///prev = the state the replacement in chains[a] was \
applied to  
-          ///The position-checking has to be done to avoid endless recursion
+          ///The position-checking needs to be done to avoid endless recursion
           OffsetMap innerOffset = ~offset( prev, n, \
chains[a]->replacement().m_position );  ret = offset( n, to );
-          if( position != -1 && position < innerOffset( \
chains[a]->replacement().m_position ) ) +          if( position != INVALID_POSITION \
&& position < innerOffset( chains[a]->replacement().m_position ) )  return ret;
           ret = chains[a]->offset( innerOffset ) % ret;
         } else {
@@ -675,7 +523,7 @@
           prev.decrease();
           OffsetMap innerOffset = ~offset( prev, from, \
next[a]->replacement().m_position );  ret = offset( n, to );
-          if( position != -1 && position < innerOffset( \
next[a]->replacement().m_position ) ) +          if( position != INVALID_POSITION && \
position < innerOffset( next[a]->replacement().m_position ) )  return ret;
           ret = ~next[a]->offset( innerOffset ) % ret;
         }
@@ -700,9 +548,7 @@
 
   DYN_VERIFY( 0 );
 }
-#endif
 
-
 bool DynamicText::rewindInternal( const VectorTimestamp& state ) {
   SafetyCounter s( 10000 );
 
@@ -775,16 +621,11 @@
 
         VectorTimestamp prev( s );
         //prev.decrease();
-        OffsetMap prevOffset;
         OffsetMap offset;
-        //if ( !prev.isZero() )
-        offset = prevOffset = this->offset( prevCurrent, prev );
+        offset = ~this->offset( prev, prevCurrent, r.first->replacement().m_position \
- 1 ); ///@todo -1 or not?  
         DYN_VERIFY( r.last->unApply( m_text, offset, m_currentOffset ) );
 
-        /*OffsetMap relOffset = ~( prevOffset % (~offset) );
-        m_currentOffset %= relOffset;*/
-
         m_state.setPrimaryIndex( s.primaryIndex() );
         m_state.decrease();
 
@@ -939,16 +780,11 @@
         //It can be applied now
         VectorTimestamp prev( s );
         prev.decrease();
-        OffsetMap prevOffset;
         OffsetMap offset;
-        if ( !prev.isZero() )
-          offset = prevOffset = this->offset( m_state, prev );
+        offset = ~this->offset( prev, m_state, r.first->replacement().m_position-1 \
);  
         DYN_VERIFY( r.first->apply( m_text, offset, m_currentOffset ) );
 
-        /*OffsetMap relOffset = ~( prevOffset % (~offset) );
-        m_currentOffset %= relOffset;*/
-
         m_state.setPrimaryIndex( s.primaryIndex() );
         m_state.increase();
 
--- trunk/KDE/kdevelop/plugins/teamwork/lib/dynamictext/dynamictext.h #670287:670288
@@ -30,6 +30,8 @@
 #include "flexibletext.h"
 using namespace Tree;
 
+#define INVALID_POSITION -1000000
+         
 struct OffsetRequest {
   VectorTimestamp from;
   VectorTimestamp to;
@@ -206,8 +208,8 @@
     void hashReplacement( const ReplacementPointer& rep );
     void unHashReplacement( const ReplacementPointer& rep );
 
-		///Returns the backwards-offset from the current position to the searched one(the \
searched must be legal, and smaller than current state). If position is set, offsets \
                that do not affect the given position in the from-space are not \
                included.
-		OffsetMap offset( VectorTimestamp from, VectorTimestamp to, int position = -1 );
+		///Returns the offset from the 'from' position to the 'to' one. If position is \
set, all replacements that are behind that position(given in from-space) will be \
excluded while computation. +		OffsetMap offset( VectorTimestamp from, \
VectorTimestamp to, int position = INVALID_POSITION );  
     ReplacementPointer m_dummy;
 
--- trunk/KDE/kdevelop/plugins/teamwork/lib/dynamictext/dynamictexthelpers.h \
#670287:670288 @@ -17,6 +17,8 @@
 #ifndef DYNAMICTEXT_HELPERS
 #define DYNAMICTEXT_HELPERS
 
+#include <iosfwd>
+
 #include "offsetutils.h"
 #include "verify.h"
 #include "network/sharedptr.h"
@@ -49,6 +51,8 @@
 	}
 };
 
+std::ostream& operator << ( std::ostream& o, const SimpleReplacement& rhs );
+
 class Replacement : public WeakShared {
 	public:
 
@@ -89,9 +93,9 @@
 		void setPrev( ReplacementPointer prev );
 
     template<class TextType>
-    bool apply( TextType& text, const OffsetMap& outerOffset, OffsetMap& \
contextOffset ); +    bool apply( TextType& text, const OffsetMap& offset, OffsetMap& \
staticOffset );  template<class TextType>
-    bool unApply( TextType& text, const OffsetMap& outerOffset, OffsetMap& \
contextOffset ); +    bool unApply( TextType& text, const OffsetMap& offset, \
OffsetMap& staticOffset );  
 #ifdef USE_LINKS
     ///Checks whether "link" should be put into the "links"-map. If it should
--- trunk/KDE/kdevelop/plugins/teamwork/lib/dynamictext/main.cpp #670287:670288
@@ -432,6 +432,41 @@
 
   try {
     DynamicText t;
+    cout << "test 0.1: \n";
+    VectorTimestamp a5 = t.insert( 0, SimpleReplacement( 0, "a", "" ) );
+    VectorTimestamp a1 = t.insert( 0, SimpleReplacement( 1, "a", "" ) );
+    VectorTimestamp b1 = t.insert( 1, SimpleReplacement( 2, "b", "" ) );
+    VectorTimestamp a2 = t.insert( 0, SimpleReplacement( 3, "a", "" ) );
+    
+    cout << t.state().print() << "text: " << t.text() << endl;
+    
+    VectorTimestamp v( t.state() );
+    v.setStamp( 0, 0 );
+    t.changeState( v );
+    cout << t.state().print() << v << " text: " << t.text() << endl;
+    DYN_VERIFY_SAME( t.text().text(), "b" );
+    
+    v.setStamp( 0, 1 );
+    t.changeState( v );
+    cout << t.state().print() << v << " text: " << t.text() << endl;
+    DYN_VERIFY_SAME( t.text().text(), "ab" );
+
+    v.setStamp( 0, 2 );
+    t.changeState( v );
+    cout << t.state().print() << v << " text: " << t.text() << endl;
+    DYN_VERIFY_SAME( t.text().text(), "aab" );
+
+    v.setStamp( 0, 3 );
+    t.changeState( v );
+    DYN_VERIFY_SAME( t.text().text(), "aaba" );
+
+  } catch ( DynamicTextError err ) {
+    cout << "error: " << err.what();
+    terminate();
+  }
+  
+  try {
+    DynamicText t;
     cout << "test 4: \n";
     VectorTimestamp a1 = t.insert( 0, SimpleReplacement( 0, "i", "" ) );
     VectorTimestamp b1 = t.insert( 1, SimpleReplacement( 0, "d", "" ) );
@@ -797,10 +832,10 @@
 
 
 int main( int /* argc */, char /**argv[]*/ ) {
+  verifyDynamicText();
   verifySumTree();
   verifyFlexibleText();
   verifyOffsets();
-  verifyDynamicText();
 
   //printf("testing\n");
   //  for( int q = 0; q < CYCLES; q++ ) {
--- trunk/KDE/kdevelop/plugins/teamwork/vectortimestampeditor.cpp #670287:670288
@@ -53,7 +53,7 @@
 
 bool TimestampEditor::trySeekTo( Timestamp s ) {
   VectorTimestamp state = m_parent->text()->state();
-  state.setStamp( m_index, s );
+  state.setStamp( m_index, s ); state.setPrimaryIndex( m_index );
   try {
   return m_parent->text()->changeState( state );
   } catch( const DynamicTextError& err ) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic