aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Document/ILineTracker.cs
blob: c16128d63fa914ffef078aa13a3481030f4b106a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;

namespace Tango.Scripting.Editors.Document
{
	/// <summary>
	/// Allows for low-level line tracking.
	/// </summary>
	/// <remarks>
	/// The methods on this interface are called by the TextDocument's LineManager immediately after the document
	/// has changed, *while* the DocumentLineTree is updating.
	/// Thus, the DocumentLineTree may be in an invalid state when these methods are called.
	/// This interface should only be used to update per-line data structures like the HeightTree.
	/// Line trackers must not cause any events to be raised during an update to prevent other code from seeing
	/// the invalid state.
	/// Line trackers may be called while the TextDocument has taken a lock.
	/// You must be careful not to dead-lock inside ILineTracker callbacks.
	/// </remarks>
	public interface ILineTracker
	{
		/// <summary>
		/// Is called immediately before a document line is removed.
		/// </summary>
		void BeforeRemoveLine(DocumentLine line);
		
//		/// <summary>
//		/// Is called immediately after a document line is removed.
//		/// </summary>
//		void AfterRemoveLine(DocumentLine line);
		
		/// <summary>
		/// Is called immediately before a document line changes length.
		/// This method will be called whenever the line is changed, even when the length stays as it is.
		/// The method might be called multiple times for a single line because
		/// a replacement is internally handled as removal followed by insertion.
		/// </summary>
		void SetLineLength(DocumentLine line, int newTotalLength);
		
		/// <summary>
		/// Is called immediately after a line was inserted.
		/// </summary>
		/// <param name="newLine">The new line</param>
		/// <param name="insertionPos">The existing line before the new line</param>
		void LineInserted(DocumentLine insertionPos, DocumentLine newLine);
		
		/// <summary>
		/// Indicates that there were changes to the document that the line tracker was not notified of.
		/// The document is in a consistent state (but the line trackers aren't), and line trackers should
		/// throw away their data and rebuild the document.
		/// </summary>
		void RebuildDocument();
	}
}
/span>countdown--; if(countdown<=0) throw my_exception(); return ScalarWithExceptions(*v+*other.v); } ScalarWithExceptions operator-(const ScalarWithExceptions& other) const { return ScalarWithExceptions(*v-*other.v); } ScalarWithExceptions operator*(const ScalarWithExceptions& other) const { return ScalarWithExceptions((*v)*(*other.v)); } ScalarWithExceptions& operator+=(const ScalarWithExceptions& other) { *v+=*other.v; return *this; } ScalarWithExceptions& operator-=(const ScalarWithExceptions& other) { *v-=*other.v; return *this; } ScalarWithExceptions& operator=(const ScalarWithExceptions& other) { *v = *(other.v); return *this; } bool operator==(const ScalarWithExceptions& other) const { return *v==*other.v; } bool operator!=(const ScalarWithExceptions& other) const { return *v!=*other.v; } float* v; static int instances; static int countdown; }; ScalarWithExceptions real(const ScalarWithExceptions &x) { return x; } ScalarWithExceptions imag(const ScalarWithExceptions & ) { return 0; } ScalarWithExceptions conj(const ScalarWithExceptions &x) { return x; } int ScalarWithExceptions::instances = 0; int ScalarWithExceptions::countdown = 0; #define CHECK_MEMLEAK(OP) { \ ScalarWithExceptions::countdown = 100; \ int before = ScalarWithExceptions::instances; \ bool exception_thrown = false; \ try { OP; } \ catch (my_exception) { \ exception_thrown = true; \ VERIFY(ScalarWithExceptions::instances==before && "memory leak detected in " && EIGEN_MAKESTRING(OP)); \ } \ VERIFY(exception_thrown && " no exception thrown in " && EIGEN_MAKESTRING(OP)); \ } void memoryleak() { typedef Eigen::Matrix<ScalarWithExceptions,Dynamic,1> VectorType; typedef Eigen::Matrix<ScalarWithExceptions,Dynamic,Dynamic> MatrixType; { int n = 50; VectorType v0(n), v1(n); MatrixType m0(n,n), m1(n,n), m2(n,n); v0.setOnes(); v1.setOnes(); m0.setOnes(); m1.setOnes(); m2.setOnes(); CHECK_MEMLEAK(v0 = m0 * m1 * v1); CHECK_MEMLEAK(m2 = m0 * m1 * m2); CHECK_MEMLEAK((v0+v1).dot(v0+v1)); } VERIFY(ScalarWithExceptions::instances==0 && "global memory leak detected in " && EIGEN_MAKESTRING(OP)); \ } void test_exceptions() { CALL_SUBTEST( memoryleak() ); }