| @@ -9,10 +9,6 @@ | |||
| <Title Value="tests"/> | |||
| <ResourceType Value="res"/> | |||
| <UseXPManifest Value="True"/> | |||
| <XPManifest> | |||
| <TextName Value="CompanyName.ProductName.AppName"/> | |||
| <TextDesc Value="Your application description."/> | |||
| </XPManifest> | |||
| <Icon Value="0"/> | |||
| </General> | |||
| <BuildModes Count="1"> | |||
| @@ -4,20 +4,21 @@ | |||
| <PathDelim Value="\"/> | |||
| <Version Value="10"/> | |||
| <BuildModes Active="Default"/> | |||
| <Units Count="66"> | |||
| <Units Count="68"> | |||
| <Unit0> | |||
| <Filename Value="tests.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="54" Y="12"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit0> | |||
| <Unit1> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <TopLine Value="173"/> | |||
| <CursorPos X="30" Y="188"/> | |||
| <UsageCount Value="79"/> | |||
| <EditorIndex Value="7"/> | |||
| <TopLine Value="1003"/> | |||
| <CursorPos Y="1021"/> | |||
| <UsageCount Value="81"/> | |||
| <Loaded Value="True"/> | |||
| </Unit1> | |||
| <Unit2> | |||
| @@ -25,7 +26,7 @@ | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="11" Y="13"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit2> | |||
| <Unit3> | |||
| <Filename Value="..\uutlCommon.pas"/> | |||
| @@ -33,25 +34,24 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="206"/> | |||
| <CursorPos X="10" Y="225"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit3> | |||
| <Unit4> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="1"/> | |||
| <TopLine Value="79"/> | |||
| <CursorPos X="8" Y="100"/> | |||
| <UsageCount Value="79"/> | |||
| <TopLine Value="100"/> | |||
| <CursorPos X="72" Y="113"/> | |||
| <UsageCount Value="81"/> | |||
| <Loaded Value="True"/> | |||
| </Unit4> | |||
| <Unit5> | |||
| <Filename Value="uutlListTest.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <WindowIndex Value="1"/> | |||
| <TopLine Value="357"/> | |||
| <CursorPos X="7" Y="376"/> | |||
| <UsageCount Value="79"/> | |||
| <EditorIndex Value="3"/> | |||
| <TopLine Value="573"/> | |||
| <CursorPos Y="588"/> | |||
| <UsageCount Value="81"/> | |||
| <Loaded Value="True"/> | |||
| </Unit5> | |||
| <Unit6> | |||
| <Filename Value="uutlQueueTests.pas"/> | |||
| @@ -59,7 +59,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="250"/> | |||
| <CursorPos X="49" Y="260"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit6> | |||
| <Unit7> | |||
| <Filename Value="uutlStackTests.pas"/> | |||
| @@ -67,21 +67,22 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="246"/> | |||
| <CursorPos X="24" Y="263"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit7> | |||
| <Unit8> | |||
| <Filename Value="uTestHelper.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <EditorIndex Value="4"/> | |||
| <CursorPos X="3" Y="12"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| <Loaded Value="True"/> | |||
| </Unit8> | |||
| <Unit9> | |||
| <Filename Value="..\uutlComparer.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="90" Y="6"/> | |||
| <UsageCount Value="69"/> | |||
| <UsageCount Value="71"/> | |||
| </Unit9> | |||
| <Unit10> | |||
| <Filename Value="..\uutlAlgorithm.pas"/> | |||
| @@ -89,23 +90,22 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="138"/> | |||
| <CursorPos Y="153"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit10> | |||
| <Unit11> | |||
| <Filename Value="uutlHashSetTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="32" Y="13"/> | |||
| <UsageCount Value="79"/> | |||
| <UsageCount Value="81"/> | |||
| </Unit11> | |||
| <Unit12> | |||
| <Filename Value="uutlAlgorithmTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="8"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="72"/> | |||
| <CursorPos X="43" Y="87"/> | |||
| <UsageCount Value="78"/> | |||
| <Loaded Value="True"/> | |||
| <UsageCount Value="80"/> | |||
| </Unit12> | |||
| <Unit13> | |||
| <Filename Value="uutlMapTests.pas"/> | |||
| @@ -113,26 +113,24 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="206"/> | |||
| <CursorPos X="66" Y="221"/> | |||
| <UsageCount Value="77"/> | |||
| <UsageCount Value="79"/> | |||
| </Unit13> | |||
| <Unit14> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="6"/> | |||
| <TopLine Value="324"/> | |||
| <CursorPos X="42" Y="340"/> | |||
| <UsageCount Value="76"/> | |||
| <EditorIndex Value="1"/> | |||
| <TopLine Value="90"/> | |||
| <CursorPos X="5" Y="105"/> | |||
| <UsageCount Value="78"/> | |||
| <Loaded Value="True"/> | |||
| </Unit14> | |||
| <Unit15> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <IsVisibleTab Value="True"/> | |||
| <EditorIndex Value="7"/> | |||
| <TopLine Value="617"/> | |||
| <CursorPos X="74" Y="634"/> | |||
| <UsageCount Value="76"/> | |||
| <Loaded Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="615"/> | |||
| <CursorPos X="34" Y="631"/> | |||
| <UsageCount Value="78"/> | |||
| </Unit15> | |||
| <Unit16> | |||
| <Filename Value="..\uutlFilter.pas"/> | |||
| @@ -140,40 +138,38 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="17"/> | |||
| <CursorPos X="13" Y="159"/> | |||
| <UsageCount Value="72"/> | |||
| <UsageCount Value="74"/> | |||
| </Unit16> | |||
| <Unit17> | |||
| <Filename Value="..\uutlInterfaces.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="5"/> | |||
| <TopLine Value="31"/> | |||
| <CursorPos X="70" Y="47"/> | |||
| <UsageCount Value="72"/> | |||
| <EditorIndex Value="2"/> | |||
| <TopLine Value="34"/> | |||
| <CursorPos X="5" Y="40"/> | |||
| <UsageCount Value="74"/> | |||
| <Loaded Value="True"/> | |||
| </Unit17> | |||
| <Unit18> | |||
| <Filename Value="..\uutlLinq.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="3"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="391"/> | |||
| <CursorPos X="31" Y="417"/> | |||
| <UsageCount Value="63"/> | |||
| <Loaded Value="True"/> | |||
| <UsageCount Value="65"/> | |||
| </Unit18> | |||
| <Unit19> | |||
| <Filename Value="uutlLinqTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="4"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="622"/> | |||
| <CursorPos X="23" Y="650"/> | |||
| <UsageCount Value="63"/> | |||
| <Loaded Value="True"/> | |||
| <UsageCount Value="65"/> | |||
| </Unit19> | |||
| <Unit20> | |||
| <Filename Value="..\uutlTypes.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <UsageCount Value="63"/> | |||
| <UsageCount Value="65"/> | |||
| </Unit20> | |||
| <Unit21> | |||
| <Filename Value="..\uutlSyncObjs.pas"/> | |||
| @@ -181,7 +177,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="241"/> | |||
| <CursorPos X="20" Y="263"/> | |||
| <UsageCount Value="57"/> | |||
| <UsageCount Value="59"/> | |||
| </Unit21> | |||
| <Unit22> | |||
| <Filename Value="..\uutlLogger.pas"/> | |||
| @@ -189,7 +185,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="419"/> | |||
| <CursorPos X="55" Y="434"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit22> | |||
| <Unit23> | |||
| <Filename Value="..\uutlXmlHelper.pas"/> | |||
| @@ -197,7 +193,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="188"/> | |||
| <CursorPos X="26" Y="203"/> | |||
| <UsageCount Value="56"/> | |||
| <UsageCount Value="58"/> | |||
| </Unit23> | |||
| <Unit24> | |||
| <Filename Value="..\uutlStreamHelper.pas"/> | |||
| @@ -205,7 +201,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="216"/> | |||
| <CursorPos X="10" Y="241"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit24> | |||
| <Unit25> | |||
| <Filename Value="..\uutlCompression.pas"/> | |||
| @@ -214,7 +210,7 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit25> | |||
| <Unit26> | |||
| <Filename Value="..\uutlEmbeddedProfiler.pas"/> | |||
| @@ -223,7 +219,7 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit26> | |||
| <Unit27> | |||
| <Filename Value="..\uutlKeyCodes.pas"/> | |||
| @@ -232,7 +228,7 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit27> | |||
| <Unit28> | |||
| <Filename Value="..\uutlMCF.pas"/> | |||
| @@ -241,7 +237,7 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit28> | |||
| <Unit29> | |||
| <Filename Value="..\uutlSScanf.pas"/> | |||
| @@ -250,7 +246,7 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit29> | |||
| <Unit30> | |||
| <Filename Value="..\uutlThreads.pas"/> | |||
| @@ -259,14 +255,14 @@ | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="-1"/> | |||
| <CursorPos X="-1" Y="-1"/> | |||
| <UsageCount Value="55"/> | |||
| <UsageCount Value="57"/> | |||
| </Unit30> | |||
| <Unit31> | |||
| <Filename Value="..\uutlEvent.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="11" Y="35"/> | |||
| <UsageCount Value="54"/> | |||
| <UsageCount Value="56"/> | |||
| </Unit31> | |||
| <Unit32> | |||
| <Filename Value="..\uutlEventManager.pas"/> | |||
| @@ -274,7 +270,7 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="246"/> | |||
| <CursorPos X="39" Y="264"/> | |||
| <UsageCount Value="54"/> | |||
| <UsageCount Value="56"/> | |||
| </Unit32> | |||
| <Unit33> | |||
| <Filename Value="..\uutlObservable.pas"/> | |||
| @@ -282,41 +278,39 @@ | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="556"/> | |||
| <CursorPos X="45" Y="572"/> | |||
| <UsageCount Value="54"/> | |||
| <UsageCount Value="56"/> | |||
| </Unit33> | |||
| <Unit34> | |||
| <Filename Value="uutlObservableListTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <WindowIndex Value="1"/> | |||
| <TopLine Value="49"/> | |||
| <CursorPos Y="65"/> | |||
| <UsageCount Value="46"/> | |||
| <TopLine Value="36"/> | |||
| <CursorPos X="53" Y="52"/> | |||
| <UsageCount Value="48"/> | |||
| </Unit34> | |||
| <Unit35> | |||
| <Filename Value="uutlObservableHashSetTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <WindowIndex Value="-1"/> | |||
| <TopLine Value="129"/> | |||
| <CursorPos Y="146"/> | |||
| <UsageCount Value="26"/> | |||
| <TopLine Value="46"/> | |||
| <CursorPos X="25" Y="62"/> | |||
| <UsageCount Value="28"/> | |||
| </Unit35> | |||
| <Unit36> | |||
| <Filename Value="uutlObservableMapTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="-1"/> | |||
| <CursorPos X="3" Y="13"/> | |||
| <UsageCount Value="25"/> | |||
| <TopLine Value="46"/> | |||
| <CursorPos X="22" Y="51"/> | |||
| <UsageCount Value="27"/> | |||
| </Unit36> | |||
| <Unit37> | |||
| <Filename Value="uutlSetHelperTests.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <EditorIndex Value="2"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="44"/> | |||
| <CursorPos X="64" Y="54"/> | |||
| <UsageCount Value="22"/> | |||
| <Loaded Value="True"/> | |||
| <UsageCount Value="24"/> | |||
| </Unit37> | |||
| <Unit38> | |||
| <Filename Value="..\uutlExceptions.pas"/> | |||
| @@ -512,11 +506,29 @@ | |||
| </Unit64> | |||
| <Unit65> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\FPCUnitCompatibleInterface.inc"/> | |||
| <EditorIndex Value="-1"/> | |||
| <TopLine Value="53"/> | |||
| <CursorPos X="104" Y="75"/> | |||
| <UsageCount Value="10"/> | |||
| <EditorIndex Value="5"/> | |||
| <TopLine Value="158"/> | |||
| <CursorPos Y="185"/> | |||
| <UsageCount Value="11"/> | |||
| <Loaded Value="True"/> | |||
| </Unit65> | |||
| <Unit66> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <IsVisibleTab Value="True"/> | |||
| <EditorIndex Value="8"/> | |||
| <TopLine Value="3311"/> | |||
| <CursorPos X="30" Y="3325"/> | |||
| <UsageCount Value="11"/> | |||
| <Loaded Value="True"/> | |||
| </Unit66> | |||
| <Unit67> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFrameworkIfaces.pas"/> | |||
| <EditorIndex Value="6"/> | |||
| <TopLine Value="35"/> | |||
| <CursorPos X="3" Y="51"/> | |||
| <UsageCount Value="10"/> | |||
| <Loaded Value="True"/> | |||
| </Unit67> | |||
| </Units> | |||
| <OtherDefines Count="3"> | |||
| <Define0 Value="UTL_ADVANCED_ENUMERATORS"/> | |||
| @@ -525,124 +537,124 @@ | |||
| </OtherDefines> | |||
| <JumpHistory Count="30" HistoryIndex="29"> | |||
| <Position1> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="561" Column="7" TopLine="554"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="139" TopLine="119"/> | |||
| </Position1> | |||
| <Position2> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="545" Column="16" TopLine="531"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="143" TopLine="119"/> | |||
| </Position2> | |||
| <Position3> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="540" Column="13" TopLine="524"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="135" Column="35" TopLine="119"/> | |||
| </Position3> | |||
| <Position4> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="31" Column="17" TopLine="15"/> | |||
| <Filename Value="uutlListTest.pas"/> | |||
| <Caret Line="612" Column="42" TopLine="594"/> | |||
| </Position4> | |||
| <Position5> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="109" Column="5" TopLine="90"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="105" TopLine="89"/> | |||
| </Position5> | |||
| <Position6> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="748" Column="16" TopLine="745"/> | |||
| <Filename Value="uutlListTest.pas"/> | |||
| <Caret Line="625" TopLine="610"/> | |||
| </Position6> | |||
| <Position7> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="105" Column="17" TopLine="89"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\FPCUnitCompatibleInterface.inc"/> | |||
| <Caret Line="184" TopLine="158"/> | |||
| </Position7> | |||
| <Position8> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="55" Column="65" TopLine="35"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3327" TopLine="3306"/> | |||
| </Position8> | |||
| <Position9> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="34" Column="14" TopLine="10"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3329" TopLine="3306"/> | |||
| </Position9> | |||
| <Position10> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="97" Column="54" TopLine="86"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3332" TopLine="3306"/> | |||
| </Position10> | |||
| <Position11> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="182" Column="40" TopLine="164"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3333" TopLine="3307"/> | |||
| </Position11> | |||
| <Position12> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="109" Column="49" TopLine="95"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3335" TopLine="3309"/> | |||
| </Position12> | |||
| <Position13> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="22" Column="36" TopLine="14"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\TestFramework.pas"/> | |||
| <Caret Line="3337" TopLine="3311"/> | |||
| </Position13> | |||
| <Position14> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="60" Column="41" TopLine="37"/> | |||
| <Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\FPCUnitCompatibleInterface.inc"/> | |||
| <Caret Line="185" TopLine="158"/> | |||
| </Position14> | |||
| <Position15> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="64" Column="13" TopLine="37"/> | |||
| <Filename Value="uutlListTest.pas"/> | |||
| <Caret Line="626" TopLine="610"/> | |||
| </Position15> | |||
| <Position16> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="77" TopLine="73"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="396" TopLine="380"/> | |||
| </Position16> | |||
| <Position17> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="69" Column="34" TopLine="48"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="397" TopLine="380"/> | |||
| </Position17> | |||
| <Position18> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="543" Column="26" TopLine="522"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="398" TopLine="380"/> | |||
| </Position18> | |||
| <Position19> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="544" Column="42" TopLine="522"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="402" TopLine="380"/> | |||
| </Position19> | |||
| <Position20> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="538" Column="23" TopLine="520"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="403" TopLine="380"/> | |||
| </Position20> | |||
| <Position21> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="33" Column="5" TopLine="15"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="405" TopLine="380"/> | |||
| </Position21> | |||
| <Position22> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="100" Column="8" TopLine="79"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="407" TopLine="381"/> | |||
| </Position22> | |||
| <Position23> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="557" Column="8" TopLine="536"/> | |||
| <Filename Value="uutlListTest.pas"/> | |||
| <Caret Line="627" TopLine="610"/> | |||
| </Position23> | |||
| <Position24> | |||
| <Filename Value="..\uutlGenerics.pas"/> | |||
| <Caret Line="753" Column="8" TopLine="732"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="103" TopLine="89"/> | |||
| </Position24> | |||
| <Position25> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="82" Column="18" TopLine="57"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="104" TopLine="89"/> | |||
| </Position25> | |||
| <Position26> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="97" TopLine="97"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="400" Column="28" TopLine="381"/> | |||
| </Position26> | |||
| <Position27> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="90" Column="27" TopLine="67"/> | |||
| <Filename Value="..\uutlEnumerator.pas"/> | |||
| <Caret Line="105" Column="24" TopLine="89"/> | |||
| </Position27> | |||
| <Position28> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="96" Column="21" TopLine="70"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="110" Column="29" TopLine="100"/> | |||
| </Position28> | |||
| <Position29> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="110" TopLine="107"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="106" TopLine="100"/> | |||
| </Position29> | |||
| <Position30> | |||
| <Filename Value="uutlEnumeratorTests.pas"/> | |||
| <Caret Line="640" Column="4" TopLine="616"/> | |||
| <Filename Value="..\uutlListBase.pas"/> | |||
| <Caret Line="113" Column="72" TopLine="100"/> | |||
| </Position30> | |||
| </JumpHistory> | |||
| </ProjectSession> | |||
| @@ -653,13 +665,10 @@ | |||
| <InitialEnabled Value="False"/> | |||
| </Item1> | |||
| </BreakPointGroups> | |||
| <Watches Count="2"> | |||
| <Watches Count="1"> | |||
| <Item1> | |||
| <Expression Value="p+i"/> | |||
| <Expression Value="fCurrent"/> | |||
| </Item1> | |||
| <Item2> | |||
| <Expression Value="p + j"/> | |||
| </Item2> | |||
| </Watches> | |||
| </Debugging> | |||
| </CONFIG> | |||
| @@ -20,6 +20,9 @@ type | |||
| fIntfList: TIntfList; | |||
| fObjList: TObjList; | |||
| fEnumerator: TIntList.IutlEnumerator; | |||
| procedure AccessCurrentEnueratorItem; | |||
| protected | |||
| procedure SetUp; override; | |||
| procedure TearDown; override; | |||
| @@ -48,12 +51,22 @@ type | |||
| procedure AddRemoveInterfaces; | |||
| procedure AddRemoveObject_OwnedByList; | |||
| procedure AddRemoveObject_NotOwnedByList; | |||
| procedure AddItemWithinEnumeration; | |||
| procedure DeleteItemWithinEnumeration; | |||
| end; | |||
| implementation | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlListTest////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListTest.AccessCurrentEnueratorItem; | |||
| var | |||
| i: Integer; | |||
| begin | |||
| i := fEnumerator.Current; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListTest.SetUp; | |||
| begin | |||
| @@ -423,6 +436,256 @@ begin | |||
| AssertEquals(0, IntfObjCounter); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListTest.AddItemWithinEnumeration; | |||
| procedure InitList; | |||
| var i: Integer; | |||
| begin | |||
| fIntList.Clear; | |||
| for i := 0 to 4 do | |||
| fIntList.Add(i); | |||
| end; | |||
| var | |||
| e: TIntList.IutlEnumerator; | |||
| begin | |||
| e := fIntList.GetUtlEnumerator; | |||
| // forward - insert behind current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| fIntList.Insert(2, 999); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(999, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // forward - insert before current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| fIntList.Insert(1, 999); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // forward - insert current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| fIntList.Insert(1, 999); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| {$IFDEF UTL_ENUMERATORS} | |||
| e := e.Reverse; | |||
| // reverse - add after current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| fIntList.Insert(3, 999); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // reverse - insert before current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| fIntList.Insert(2, 999); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(999, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // reverse - insert current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| fIntList.Insert(3, 999); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(999, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| {$ENDIF} | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListTest.DeleteItemWithinEnumeration; | |||
| procedure InitList; | |||
| var i: Integer; | |||
| begin | |||
| fIntList.Clear; | |||
| for i := 0 to 4 do | |||
| fIntList.Add(i); | |||
| end; | |||
| var | |||
| e: TIntList.IutlEnumerator; | |||
| begin | |||
| e := fIntList.GetUtlEnumerator; | |||
| // forward - delete behind current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| fIntList.Delete(2); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // forward - delete before current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| fIntList.Remove(1); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // forward - delete current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| fIntList.Remove(1); | |||
| fEnumerator := e; | |||
| AssertException('Current does not raise exception after deleting current', EInvalidOperation, @AccessCurrentEnueratorItem); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| {$IFDEF UTL_ENUMERATORS} | |||
| e := e.Reverse; | |||
| // reverse - delete after current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| fIntList.Remove(4); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // reverse - delete before current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| fIntList.Remove(2); | |||
| AssertEquals(3, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| // reverse - delete current | |||
| InitList; | |||
| e.Reset; | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(4, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(3, e.Current); | |||
| fIntList.Remove(3); | |||
| fEnumerator := e; | |||
| AssertException('Current does not raise exception after deleting current', EInvalidOperation, @AccessCurrentEnueratorItem); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(2, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(1, e.Current); | |||
| AssertTrue (e.MoveNext); | |||
| AssertEquals(0, e.Current); | |||
| AssertFalse (e.MoveNext); | |||
| {$ENDIF} | |||
| end; | |||
| initialization | |||
| RegisterTest(TutlListTest.Suite); | |||
| @@ -17,6 +17,7 @@ type | |||
| fCaptureEvents: Boolean; | |||
| fSet: TObservableIntSet; | |||
| fEventArgs: TEventArgList; | |||
| fEventListener: IutlEventListener; | |||
| procedure EventHandler(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| @@ -48,8 +49,9 @@ begin | |||
| inherited SetUp; | |||
| fCaptureEvents := false; | |||
| fEventArgs := TEventArgList.Create(true); | |||
| fEventListener := TutlEventListenerCallback.Create(@EventHandler); | |||
| fSet := TObservableIntSet.Create(true); | |||
| fSet.RegisterEventHandler(@EventHandler); | |||
| fSet.RegisterEventListener(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -57,6 +59,7 @@ procedure TutlObservableHashSetTests.TearDown; | |||
| begin | |||
| FreeAndNil(fSet); | |||
| FreeAndNil(fEventArgs); | |||
| fEventListener := nil; | |||
| inherited TearDown; | |||
| end; | |||
| @@ -17,6 +17,7 @@ type | |||
| fCaptureEvents: Boolean; | |||
| fList: TObservableIntList; | |||
| fEventArgs: TEventArgList; | |||
| fEventListener: IutlEventListener; | |||
| procedure EventHandler(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| @@ -48,8 +49,9 @@ begin | |||
| inherited SetUp; | |||
| fCaptureEvents := false; | |||
| fEventArgs := TEventArgList.Create(true); | |||
| fEventListener := TutlEventListenerCallback.Create(@EventHandler); | |||
| fList := TObservableIntList.Create(true); | |||
| fList.RegisterEventHandler(@EventHandler); | |||
| fList.RegisterEventListener(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -57,6 +59,7 @@ procedure TutlObservableListTests.TearDown; | |||
| begin | |||
| FreeAndNil(fList); | |||
| FreeAndNil(fEventArgs); | |||
| fEventListener := nil; | |||
| inherited TearDown; | |||
| end; | |||
| @@ -17,6 +17,7 @@ type | |||
| fCaptureEvents: Boolean; | |||
| fMap: TObservableIntStringMap; | |||
| fEventArgs: TEventArgList; | |||
| fEventListener: IutlEventListener; | |||
| procedure EventHandler(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| @@ -48,8 +49,9 @@ begin | |||
| inherited SetUp; | |||
| fCaptureEvents := false; | |||
| fEventArgs := TEventArgList.Create(true); | |||
| fEventListener := TutlEventListenerCallback.Create(@EventHandler); | |||
| fMap := TObservableIntStringMap.Create(true, true); | |||
| fMap.RegisterEventHandler(@EventHandler); | |||
| fMap.RegisterEventListener(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -57,6 +59,7 @@ procedure TutlObservableMapTests.TearDown; | |||
| begin | |||
| FreeAndNil(fMap); | |||
| FreeAndNil(fEventArgs); | |||
| fEventListener := nil; | |||
| inherited TearDown; | |||
| end; | |||
| @@ -10,18 +10,23 @@ uses | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlInterfaceNoRefCount = class(TObject, IUnknown) | |||
| TutlInterfacedObject = class(TObject, IUnknown) | |||
| protected | |||
| fRefCount: longint; | |||
| fRefCount: longint; | |||
| fAutoFree: Boolean; | |||
| { implement methods of IUnknown } | |||
| function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| function _AddRef: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; | |||
| function _Release: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; | |||
| { implement methods of IUnknown } | |||
| function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| function _AddRef: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; | |||
| function _Release: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; | |||
| public | |||
| property AutoFree: Boolean read fAutoFree write fAutoFree; | |||
| property RefCount: LongInt read fRefCount; | |||
| constructor Create; | |||
| end; | |||
| TutlInterfaceNoRefCount = TutlInterfacedObject; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlCSVList = class(TStringList) | |||
| @@ -295,9 +300,9 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlInterfaceNoRefCount/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlInterfacedObject/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlInterfaceNoRefCount.QueryInterface(constref iid: tguid; out obj): longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| function TutlInterfacedObject.QueryInterface(constref iid: tguid; out obj): longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| begin | |||
| if getinterface(iid,obj) then | |||
| result:=S_OK | |||
| @@ -306,15 +311,25 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlInterfaceNoRefCount._AddRef: longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| function TutlInterfacedObject._AddRef: longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| begin | |||
| result := InterLockedIncrement(fRefCount); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlInterfaceNoRefCount._Release: longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| function TutlInterfacedObject._Release: longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| begin | |||
| result := InterLockedDecrement(fRefCount); | |||
| if (result = 0) and fAutoFree then | |||
| Destroy; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlInterfacedObject.Create; | |||
| begin | |||
| inherited Create; | |||
| fAutoFree := false; | |||
| fRefCount := 0; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -28,7 +28,7 @@ type | |||
| generic TutlEqualityCompareEventN<T> = function(constref i1, i2: T): Boolean is nested; | |||
| {$ENDIF} | |||
| generic TutlCalbackEqualityComparer<T> = class( | |||
| generic TutlCallbackEqualityComparer<T> = class( | |||
| TInterfacedObject, | |||
| specialize IutlEqualityComparer<T>) | |||
| @@ -140,9 +140,9 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlCalbackEqualityComparer/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlCallbackEqualityComparer/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlCalbackEqualityComparer.EqualityCompare(constref i1, i2: T): Boolean; | |||
| function TutlCallbackEqualityComparer.EqualityCompare(constref i1, i2: T): Boolean; | |||
| begin | |||
| result := false; | |||
| case fType of | |||
| @@ -157,7 +157,7 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlCalbackEqualityComparer.Create(const aEvent: TCompareEvent); | |||
| constructor TutlCallbackEqualityComparer.Create(const aEvent: TCompareEvent); | |||
| begin | |||
| inherited Create; | |||
| fType := eetNormal; | |||
| @@ -165,7 +165,7 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlCalbackEqualityComparer.Create(const aEvent: TCompareEventO); | |||
| constructor TutlCallbackEqualityComparer.Create(const aEvent: TCompareEventO); | |||
| begin | |||
| inherited Create; | |||
| fType := eetObject; | |||
| @@ -174,7 +174,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| {$IFDEF UTL_NESTED_PROCVARS} | |||
| constructor TutlCalbackEqualityComparer.Create(const aEvent: TCompareEventN); | |||
| constructor TutlCallbackEqualityComparer.Create(const aEvent: TCompareEventN); | |||
| begin | |||
| inherited Create; | |||
| fType := eetNested; | |||
| @@ -97,6 +97,7 @@ type | |||
| protected | |||
| property Memory: PT read fMemory write fMemory; | |||
| property Reversed: Boolean read fReversed write fReversed; | |||
| property Current: Integer read fCurrent write fCurrent; | |||
| property First: Integer read fFirst write fFirst; | |||
| property Last: Integer read fLast write fLast; | |||
| @@ -17,18 +17,18 @@ type | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| IutlEventListener = interface(IUnknown) | |||
| ['{BC45E26B-96F7-4151-87F1-C330C8C668E5}'] | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlEventHandler = procedure (constref aSender: TObject; constref aEvent: IutlEventArgs) of object; | |||
| TutlEventHandler = procedure (constref aSender: TObject; constref aEventArgs: IutlEventArgs) of object; | |||
| TutlEventArgs = class(TInterfacedObject, IutlEventArgs); | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| generic IutlObservable<T> = interface(specialize {$IFDEF UTL_ADVANCED_ENUMERATORS}IutlEnumerable{$ELSE}IEnumerable{$ENDIF}<T>) | |||
| IutlObservable = interface(IUnknown) | |||
| ['{C54BD844-8273-4ACF-90C5-05DACF4359AF}'] | |||
| procedure RegisterEventHandler (const aHandler: TutlEventHandler); | |||
| procedure UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure RegisterEventListener (const aListener: IutlEventListener); | |||
| procedure UnregisterEventListener(const aListener: IutlEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -45,6 +45,18 @@ type | |||
| end; | |||
| TutlNotifyEventList = specialize TutlEventList<TNotifyEvent>; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlEventHandlerList = class( | |||
| specialize TutlEventList<TutlEventHandler> | |||
| , IutlEventListener) | |||
| public { IutlEventListener } | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| public | |||
| constructor Create; | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlEventListenerSet = class( | |||
| specialize TutlCustomHashSet<IutlEventListener> | |||
| @@ -58,7 +70,7 @@ type | |||
| end; | |||
| public { IutlEventListener } | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| public | |||
| constructor Create; reintroduce; | |||
| @@ -73,7 +85,7 @@ type | |||
| fHandler: TutlEventHandler; | |||
| public { IEventListener } | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| public | |||
| constructor Create(const aHandler: TutlEventHandler); | |||
| @@ -100,7 +112,7 @@ type | |||
| function PopEventPair(out aPair: TEventPair): Boolean; | |||
| public { IEventListener } | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| public | |||
| function RegisterListener (const aListener: IutlEventListener): Boolean; | |||
| @@ -109,7 +121,7 @@ type | |||
| procedure DispatchEvents; | |||
| constructor Create; | |||
| destructor Destroy; override; | |||
| destructor Destroy; override; | |||
| end; | |||
| implementation | |||
| @@ -148,6 +160,24 @@ begin | |||
| inherited Create(TComparer.Create, true); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlEventHandlerList/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlEventHandlerList.DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| var | |||
| e: TutlEventHandler; | |||
| begin | |||
| for e in self do | |||
| e(aSender, aEventArgs); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlEventHandlerList.Create; | |||
| begin | |||
| inherited Create; | |||
| AutoFree := true; | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlEventListenerSet/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -170,12 +200,12 @@ end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlEventListenerSet/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlEventListenerSet.DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure TutlEventListenerSet.DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| var | |||
| l: IutlEventListener; | |||
| e: IutlEventListener; | |||
| begin | |||
| for l in self do | |||
| l.DispatchEvent(aSender, aEvent); | |||
| for e in self do | |||
| e.DispatchEvent(aSender, aEventArgs); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -187,9 +217,9 @@ end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlEventListenerCallback////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlEventListenerCallback.DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure TutlEventListenerCallback.DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| begin | |||
| fHandler(aSender, aEvent); | |||
| fHandler(aSender, aEventArgs); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -228,12 +258,12 @@ begin | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlEventListenerAsync.DispatchEvent(constref aSender: TObject; constref aEvent: IutlEventArgs); | |||
| procedure TutlEventListenerAsync.DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs); | |||
| var | |||
| p: TEventPair; | |||
| begin | |||
| p.first := aSender; | |||
| p.second := aEvent; | |||
| p.second := aEventArgs; | |||
| fEventLock.Enter; | |||
| try | |||
| fEvents.Add(p); | |||
| @@ -20,14 +20,25 @@ type | |||
| IutlEnumerator = specialize IutlEnumerator<T>; | |||
| private type | |||
| TEnumeratorAction = ( | |||
| eaAdded, | |||
| eaRemoved, | |||
| eaReallocated | |||
| ); | |||
| TEnumerator = class( | |||
| specialize TutlMemoryEnumerator<T> | |||
| , IEnumerator | |||
| , IutlEnumerator) | |||
| private | |||
| fOwner: TutlListBase; | |||
| fCurrentIsInvalid: Boolean; | |||
| fNext: TEnumerator; | |||
| fPrev: TEnumerator; | |||
| protected { IEnumerator } | |||
| function GetCurrent: T; override; | |||
| function InternalMoveNext: Boolean; override; | |||
| procedure InternalReset; override; | |||
| {$IFDEF UTL_ENUMERATORS} | |||
| @@ -36,11 +47,18 @@ type | |||
| {$ENDIF} | |||
| public | |||
| procedure Update(const aIndex: Integer; const aAction: TEnumeratorAction); | |||
| constructor Create(const aOwner: TutlListBase; const aReversed: Boolean); reintroduce; | |||
| destructor Destroy; override; | |||
| end; | |||
| strict private | |||
| fCount: Integer; | |||
| fFirstEnumerator: TEnumerator; | |||
| fLastEnumerator: TEnumerator; | |||
| procedure UpdateEnumerator(const aIndex: Integer; const aAction: TEnumeratorAction); | |||
| protected | |||
| function GetCount: Integer; override; | |||
| @@ -48,6 +66,7 @@ type | |||
| function GetItem (const aIndex: Integer): T; virtual; | |||
| procedure SetItem (const aIndex: Integer; aValue: T); virtual; | |||
| procedure SetCapacity (const aValue: integer); override; | |||
| procedure InsertIntern(const aIndex: Integer; constref aValue: T); virtual; | |||
| procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); virtual; | |||
| @@ -80,6 +99,21 @@ uses | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlListBase.TEnumerator////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlListBase.TEnumerator.GetCurrent: T; | |||
| begin | |||
| if fCurrentIsInvalid then | |||
| raise EInvalidOperation.Create('current item was deleted, move on with ''MoveNext'' before accessing ''Current'''); | |||
| result := inherited GetCurrent; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlListBase.TEnumerator.InternalMoveNext: Boolean; | |||
| begin | |||
| result := inherited InternalMoveNext; | |||
| fCurrentIsInvalid := false; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListBase.TEnumerator.InternalReset; | |||
| begin | |||
| @@ -99,17 +133,82 @@ begin | |||
| end; | |||
| {$ENDIF} | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListBase.TEnumerator.Update(const aIndex: Integer; const aAction: TEnumeratorAction); | |||
| begin | |||
| case aAction of | |||
| eaAdded: begin | |||
| if (aIndex <= Current) then | |||
| Current := Current + 1; | |||
| Last := Last + 1; | |||
| end; | |||
| eaRemoved: begin | |||
| fCurrentIsInvalid := (aIndex = Current); | |||
| if (aIndex < Current) | |||
| or ( (aIndex = Current) | |||
| and not Reversed) | |||
| then | |||
| Current := Current - 1; | |||
| Last := Last - 1; | |||
| end; | |||
| eaReallocated: begin | |||
| if (fOwner.Count > 0) | |||
| then Memory := fOwner.GetInternalItem(0) | |||
| else Memory := nil; | |||
| end; | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlListBase.TEnumerator.Create(const aOwner: TutlListBase; const aReversed: Boolean); | |||
| begin | |||
| if not Assigned(aOwner) then | |||
| raise EArgumentNilException.Create('aOwner'); | |||
| fOwner := aOwner; | |||
| if not Assigned(fOwner.fLastEnumerator) then begin | |||
| fPrev := nil; | |||
| fNext := nil; | |||
| fOwner.fFirstEnumerator := self; | |||
| fOwner.fLastEnumerator := self; | |||
| end else begin | |||
| fPrev := fOwner.fLastEnumerator; | |||
| fNext := nil; | |||
| fOwner.fLastEnumerator.fNext := self; | |||
| fOwner.fLastEnumerator := self; | |||
| end; | |||
| inherited Create(nil, aReversed, 0, -1); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| destructor TutlListBase.TEnumerator.Destroy; | |||
| begin | |||
| if (fOwner.fFirstEnumerator = self) then | |||
| fOwner.fFirstEnumerator := fNext; | |||
| if (fOwner.fLastEnumerator = self) then | |||
| fOwner.fLastEnumerator := fPrev; | |||
| if Assigned(fPrev) then | |||
| fPrev.fNext := fNext; | |||
| if Assigned(fNext) then | |||
| fNext.fPrev := fPrev; | |||
| inherited Destroy; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TutlListBase////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListBase.UpdateEnumerator(const aIndex: Integer; const aAction: TEnumeratorAction); | |||
| var | |||
| e: TEnumerator; | |||
| begin | |||
| e := fFirstEnumerator; | |||
| while Assigned(e) do begin | |||
| e.Update(aIndex, aAction); | |||
| e := e.fNext; | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlListBase.GetCount: Integer; | |||
| begin | |||
| @@ -144,6 +243,12 @@ begin | |||
| p^ := aValue; | |||
| end; | |||
| procedure TutlListBase.SetCapacity(const aValue: integer); | |||
| begin | |||
| inherited SetCapacity(aValue); | |||
| UpdateEnumerator(0, eaReallocated); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlListBase.InsertIntern(const aIndex: Integer; constref aValue: T); | |||
| var | |||
| @@ -158,6 +263,7 @@ begin | |||
| System.Move(p^, (p+1)^, (fCount - aIndex) * SizeOf(T)); | |||
| p^ := aValue; | |||
| inc(fCount); | |||
| UpdateEnumerator(aIndex, eaAdded); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -174,6 +280,7 @@ begin | |||
| if CanShrink and (Capacity > 128) and (fCount < Capacity shr 2) then // only 25% used | |||
| SetCapacity(Capacity shr 1); // set to 50% Capacity | |||
| FillByte(GetInternalItem(fCount)^, (Capacity-fCount) * SizeOf(T), 0); | |||
| UpdateEnumerator(aIndex, eaRemoved); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -183,7 +290,7 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TutlListBase.GetUtlEnumerator: specialize IutlEnumerator<T>; | |||
| function TutlListBase.GetUtlEnumerator: IutlEnumerator; | |||
| begin | |||
| result := TEnumerator.Create(self, false); | |||
| end; | |||
| @@ -85,12 +85,12 @@ type | |||
| private | |||
| fStream: TFileStream; | |||
| fAutoFlush: Boolean; | |||
| fAutoFree: Boolean; | |||
| procedure SetAutoFree(aValue: Boolean); | |||
| protected | |||
| function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; override; | |||
| protected | |||
| procedure WriteLog(const aLogger: TutlLogger; const aTime: TDateTime; const aLevel: TutlLogLevel; const aSender: string; const aMessage: String); | |||
| public | |||
| constructor Create(const aFilename: String; const aMode: TutlFileLoggerMode; const aAutoFree: Boolean = false); | |||
| destructor Destroy; override; | |||
| @@ -98,7 +98,6 @@ type | |||
| procedure Flush(); overload; | |||
| published | |||
| property AutoFlush: Boolean read fAutoFlush write fAutoFlush; | |||
| property AutoFree: Boolean read fAutoFree write SetAutoFree; | |||
| end; | |||
| { TutlConsoleLogger } | |||
| @@ -186,13 +185,6 @@ begin | |||
| Free; | |||
| end; | |||
| function TutlFileLogger._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; | |||
| begin | |||
| result := inherited _Release; | |||
| if (Result <= 0) and fAutoFree then | |||
| Free; | |||
| end; | |||
| procedure TutlFileLogger.WriteLog(const aLogger: TutlLogger; const aTime: TDateTime; | |||
| const aLevel: TutlLogLevel; const aSender: string; const aMessage: String); | |||
| var | |||
| @@ -54,10 +54,7 @@ type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| generic TutlObservableCustomList<T> = class( | |||
| specialize TutlCustomList<T> | |||
| , specialize IutlObservable<T>) | |||
| private type | |||
| TEventHandlerList = specialize TutlEventList<TutlEventHandler>; | |||
| , IutlObservable) | |||
| public type | |||
| TItemEventArgs = class(specialize TutlObservableItemEventArgs<T>) | |||
| @@ -77,7 +74,7 @@ type | |||
| end; | |||
| private | |||
| fEventHandler: TEventHandlerList; | |||
| fEventListener: TutlEventListenerSet; | |||
| protected | |||
| procedure InsertIntern(const aIndex: Integer; constref aValue: T); override; | |||
| @@ -89,8 +86,8 @@ type | |||
| procedure DoClear (); virtual; | |||
| public { IutlObservable } | |||
| procedure RegisterEventHandler (const aHandler: TutlEventHandler); | |||
| procedure UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure RegisterEventListener(const aListener: IutlEventListener); | |||
| procedure UnregisterEventListener(const aListener: IutlEventListener); | |||
| protected | |||
| procedure SetItem(const aIndex: Integer; aValue: T); override; | |||
| @@ -114,9 +111,9 @@ type | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| generic TutlObservableCustomHashSet<T> = class(specialize TutlCustomHashSet<T>) | |||
| private type | |||
| TEventHandlerList = specialize TutlEventList<TutlEventHandler>; | |||
| generic TutlObservableCustomHashSet<T> = class( | |||
| specialize TutlCustomHashSet<T> | |||
| , IutlObservable) | |||
| public type | |||
| TItemEventArgs = class(specialize TutlObservableItemEventArgs<T>) | |||
| @@ -136,7 +133,7 @@ type | |||
| end; | |||
| private | |||
| fEventHandler: TEventHandlerList; | |||
| fEventListener: TutlEventListenerSet; | |||
| protected | |||
| procedure InsertIntern(const aIndex: Integer; constref aValue: T); override; | |||
| @@ -149,8 +146,8 @@ type | |||
| procedure DoClear (); virtual; | |||
| public { IutlObservable } | |||
| procedure RegisterEventHandler (const aHandler: TutlEventHandler); | |||
| procedure UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure RegisterEventListener(const aListener: IutlEventListener); | |||
| procedure UnregisterEventListener(const aListener: IutlEventListener); | |||
| public | |||
| procedure Clear; override; | |||
| @@ -166,9 +163,9 @@ type | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| generic TutlObservableCustomMap<TKey, TValue> = class(specialize TutlCustomMap<TKey, TValue>) | |||
| private type | |||
| TEventHandlerList = specialize TutlEventList<TutlEventHandler>; | |||
| generic TutlObservableCustomMap<TKey, TValue> = class( | |||
| specialize TutlCustomMap<TKey, TValue> | |||
| , IutlObservable) | |||
| public type | |||
| TObservableHashSet = class(THashSet) | |||
| @@ -207,7 +204,7 @@ type | |||
| end; | |||
| private | |||
| fEventHandler: TEventHandlerList; | |||
| fEventListener: TutlEventListenerSet; | |||
| protected | |||
| procedure DoAddItem (const aIndex: Integer; constref aKey: TKey; constref aItem: TValue); virtual; | |||
| @@ -216,8 +213,8 @@ type | |||
| procedure DoClear (); virtual; | |||
| public { IutlObservable } | |||
| procedure RegisterEventHandler (const aHandler: TutlEventHandler); | |||
| procedure UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure RegisterEventListener(const aListener: IutlEventListener); | |||
| procedure UnregisterEventListener(const aListener: IutlEventListener); | |||
| public | |||
| constructor Create(const aHashSet: TObservableHashSet; const aOwnsKeys: Boolean; const aOwnsValues: Boolean); reintroduce; | |||
| @@ -310,66 +307,42 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.DoAddItem(const aIndex: Integer; constref aItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetAdd, aIndex, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetAdd, aIndex, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.DoRemoveItem(const aIndex: Integer; constref aItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetRemove, aIndex, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetRemove, aIndex, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.DoChangeItem(const aIndex: Integer; constref aOldItem: T; constref aNewItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TReplaceEventArgs.Create(oetReplace, aIndex, aOldItem, aNewItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TReplaceEventArgs.Create(oetReplace, aIndex, aOldItem, aNewItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.DoClear; | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TutlObservableEventArgs.Create(oetClear); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TutlObservableEventArgs.Create(oetClear)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.RegisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomList.RegisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Add(aHandler); | |||
| fEventListener.Add(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomList.UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomList.UnregisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Remove(aHandler); | |||
| fEventListener.Remove(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -389,7 +362,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlObservableCustomList.Create(aEqualityComparer: IEqualityComparer; aOwnsObjects: Boolean); | |||
| begin | |||
| fEventHandler := TEventHandlerList.Create; | |||
| fEventListener := TutlEventListenerSet.Create; | |||
| inherited Create(aEqualityComparer, aOwnsObjects); | |||
| end; | |||
| @@ -397,7 +370,7 @@ end; | |||
| destructor TutlObservableCustomList.Destroy; | |||
| begin | |||
| inherited Destroy; | |||
| FreeAndNil(fEventHandler); | |||
| FreeAndNil(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -458,66 +431,42 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.DoAddItem(const aIndex: Integer; constref aItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetAdd, aIndex, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetAdd, aIndex, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.DoRemoveItem(const aIndex: Integer; constref aItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetRemove, aIndex, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetRemove, aIndex, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.DoChangeItem(const aIndex: Integer; constref aOldItem: T; constref aNewItem: T); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TReplaceEventArgs.Create(oetReplace, aIndex, aOldItem, aNewItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TReplaceEventArgs.Create(oetReplace, aIndex, aOldItem, aNewItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.DoClear; | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TutlObservableEventArgs.Create(oetClear); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TutlObservableEventArgs.Create(oetClear)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.RegisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomHashSet.RegisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Add(aHandler); | |||
| fEventListener.Add(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomHashSet.UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomHashSet.UnregisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Remove(aHandler); | |||
| fEventListener.Remove(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -530,7 +479,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TutlObservableCustomHashSet.Create(const aComparer: IComparer; const aOwnsItems: Boolean); | |||
| begin | |||
| fEventHandler := TEventHandlerList.Create; | |||
| fEventListener := TutlEventListenerSet.Create; | |||
| inherited Create(aComparer, aOwnsItems); | |||
| end; | |||
| @@ -538,7 +487,7 @@ end; | |||
| destructor TutlObservableCustomHashSet.Destroy; | |||
| begin | |||
| inherited Destroy; | |||
| FreeAndNil(fEventHandler); | |||
| FreeAndNil(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -627,15 +576,9 @@ procedure TutlObservableCustomMap.DoAddItem( | |||
| const aIndex: Integer; | |||
| constref aKey: TKey; | |||
| constref aItem: TValue); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetAdd, aIndex, aKey, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetAdd, aIndex, aKey, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -643,15 +586,9 @@ procedure TutlObservableCustomMap.DoRemoveItem( | |||
| const aIndex: Integer; | |||
| constref aKey: TKey; | |||
| constref aItem: TValue); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TItemEventArgs.Create(oetRemove, aIndex, aKey, aItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TItemEventArgs.Create(oetRemove, aIndex, aKey, aItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -660,40 +597,28 @@ procedure TutlObservableCustomMap.DoChangeItem( | |||
| constref aKey: TKey; | |||
| constref aOldItem: TValue; | |||
| constref aNewItem: TValue); | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TReplaceEventArgs.Create(oetReplace, aIndex, aKey, aOldItem, aNewItem); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TReplaceEventArgs.Create(oetReplace, aIndex, aKey, aOldItem, aNewItem)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomMap.DoClear; | |||
| var | |||
| args: IutlEventArgs; | |||
| e: TutlEventHandler; | |||
| begin | |||
| if not Assigned(fEventHandler) or fEventHandler.IsEmpty then | |||
| exit; | |||
| args := TutlObservableEventArgs.Create(oetClear); | |||
| for e in fEventHandler do | |||
| e(self, args); | |||
| if Assigned(fEventListener) and not fEventListener.IsEmpty then | |||
| fEventListener.DispatchEvent(self, TutlObservableEventArgs.Create(oetClear)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomMap.RegisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomMap.RegisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Add(aHandler); | |||
| fEventListener.Add(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TutlObservableCustomMap.UnregisterEventHandler(const aHandler: TutlEventHandler); | |||
| procedure TutlObservableCustomMap.UnregisterEventListener(const aListener: IutlEventListener); | |||
| begin | |||
| fEventHandler.Remove(aHandler); | |||
| fEventListener.Remove(aListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -702,7 +627,7 @@ constructor TutlObservableCustomMap.Create( | |||
| const aOwnsKeys: Boolean; | |||
| const aOwnsValues: Boolean); | |||
| begin | |||
| fEventHandler := TEventHandlerList.Create; | |||
| fEventListener := TutlEventListenerSet.Create; | |||
| inherited Create(aHashSet, aOwnsKeys, aOwnsValues); | |||
| end; | |||
| @@ -710,7 +635,7 @@ end; | |||
| destructor TutlObservableCustomMap.Destroy; | |||
| begin | |||
| inherited Destroy; | |||
| FreeAndNil(fEventHandler); | |||
| FreeAndNil(fEventListener); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -9,6 +9,13 @@ uses | |||
| uutlGenerics; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| IutlLockable = interface(IUnknown) | |||
| ['{CF01F747-D6A9-405B-8A8D-AC148FA9DABB}'] | |||
| procedure Lock; | |||
| procedure Unlock; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TutlCheckSynchronizeEvent = class(TObject) | |||
| private | |||
| @@ -85,7 +92,7 @@ type | |||
| function LockedObject: T; inline; | |||
| constructor Create(const aLock: TCriticalSection; const aObject: T); | |||
| destructor Destroy; override; | |||
| destructor Destroy; override; | |||
| end; | |||
| implementation | |||