Предыдущая серия была тут - http://18delphi.blogspot.com/2013/07/blog-post_8789.html
И тут - http://18delphi.blogspot.com/2013/07/2.html
Теперь посмотрим как видоизменились конкретные контейнеры.
Модель:
Код:
StandardAtomicList.imp.pas:
IntegerList.pas:
Int64List.pas:
ByteList.pas:
IUnknownRefList.pas:
IUnknownPtrList.pas:
И тесты.
Модель:
Код:
ListTest.imp.pas:
AtomicListTest.imp.pas:
IUnknownRefListTest.pas:
И тут - http://18delphi.blogspot.com/2013/07/2.html
Теперь посмотрим как видоизменились конкретные контейнеры.
Модель:
Код:
StandardAtomicList.imp.pas:
{$IfNDef StandardAtomicList_imp} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "StandardAtomicList.imp.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: Impurity::Class Shared Delphi Sand Box::SandBox::FinalContainers::StandardAtomicList // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Define StandardAtomicList_imp} _AtomicList_Parent_ = TRefcounted; {$Include ..\SandBox\AtomicList.imp.pas} _StandardAtomicList_ = {mixin} class(_AtomicList_) end;//_StandardAtomicList_ {$Else StandardAtomicList_imp} {$Include ..\SandBox\AtomicList.imp.pas} {$EndIf StandardAtomicList_imp}
IntegerList.pas:
unit IntegerList; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "IntegerList.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Sand Box::SandBox::FinalContainers::TIntegerList // // Список Integer'ов // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbDefine.inc} interface uses Refcounted, Classes, l3PtrLoc ; type _ItemType_ = Integer; {$Include ..\SandBox\StandardAtomicList.imp.pas} TIntegerList = class(_StandardAtomicList_) {* Список Integer'ов } end;//TIntegerList implementation uses RTLConsts, l3MemorySizeUtils ; {$Include ..\SandBox\StandardAtomicList.imp.pas} end.
Int64List.pas:
unit Int64List; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "Int64List.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Sand Box::SandBox::FinalContainers::TInt64List // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbDefine.inc} interface uses Refcounted, Classes, l3PtrLoc ; type _ItemType_ = Int64; {$Include ..\SandBox\StandardAtomicList.imp.pas} TInt64List = class(_StandardAtomicList_) end;//TInt64List implementation uses RTLConsts, l3MemorySizeUtils ; {$Include ..\SandBox\StandardAtomicList.imp.pas} end.
ByteList.pas:
unit ByteList; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "ByteList.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Sand Box::SandBox::FinalContainers::TByteList // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbDefine.inc} interface uses Refcounted, Classes, l3PtrLoc ; type _ItemType_ = Byte; {$Include ..\SandBox\StandardAtomicList.imp.pas} TByteList = class(_StandardAtomicList_) end;//TByteList implementation uses RTLConsts, l3MemorySizeUtils ; {$Include ..\SandBox\StandardAtomicList.imp.pas} end.
IUnknownRefList.pas:
unit IUnknownRefList; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "IUnknownRefList.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Sand Box::SandBox::FinalContainers::TIUnknownRefList // // Список ССЫЛОК на IUnknown // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbDefine.inc} interface uses Refcounted, Classes, l3PtrLoc ; type _ItemType_ = IUnknown; _InterfaceRefList_Parent_ = TRefcounted; {$Include ..\SandBox\InterfaceRefList.imp.pas} TIUnknownRefList = class(_InterfaceRefList_) {* Список ССЫЛОК на IUnknown } end;//TIUnknownRefList implementation uses RTLConsts, l3MemorySizeUtils ; {$Include ..\SandBox\InterfaceRefList.imp.pas} end.
IUnknownPtrList.pas:
unit IUnknownPtrList; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBox" // Модуль: "IUnknownPtrList.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Sand Box::SandBox::FinalContainers::TIUnknownPtrList // // Список УКАЗАТЕЛЕЙ на IUnknown // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbDefine.inc} interface uses Refcounted, Classes, l3PtrLoc ; type _ItemType_ = IUnknown; _InterfacePtrList_Parent_ = TRefcounted; {$Include ..\SandBox\InterfacePtrList.imp.pas} TIUnknownPtrList = class(_InterfacePtrList_) {* Список УКАЗАТЕЛЕЙ на IUnknown } end;//TIUnknownPtrList implementation uses RTLConsts, l3MemorySizeUtils ; {$Include ..\SandBox\InterfacePtrList.imp.pas} end.
И тесты.
Модель:
Код:
ListTest.imp.pas:
{$IfNDef ListTest_imp} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBoxTest" // Модуль: "ListTest.imp.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: TestCaseMixIn::Class Shared Delphi Sand Box::SandBoxTest::FinalContainersTests::ListTest // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Define ListTest_imp} {$If defined(nsTest)} _ListTest_ = class(TTestCase) protected // protected methods function CreateList: _ListType_; {* Создаёт список для тестирования } end;//_ListTest_ {$IfEnd} //nsTest {$Else ListTest_imp} {$If defined(nsTest)} // start class _ListTest_ function _ListTest_.CreateList: _ListType_; //#UC START# *51E80E0D030D_51E80DD30125_var* //#UC END# *51E80E0D030D_51E80DD30125_var* begin //#UC START# *51E80E0D030D_51E80DD30125_impl* Result := _ListType_.Create; //#UC END# *51E80E0D030D_51E80DD30125_impl* end;//_ListTest_.CreateList {$IfEnd} //nsTest {$EndIf ListTest_imp}
AtomicListTest.imp.pas:
{$IfNDef AtomicListTest_imp} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBoxTest" // Модуль: "AtomicListTest.imp.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: TestCaseMixIn::Class Shared Delphi Sand Box::SandBoxTest::FinalContainersTests::AtomicListTest // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Define AtomicListTest_imp} {$If defined(nsTest)} {$Include ..\SandBox\ListTest.imp.pas} _AtomicListTest_ = class(_ListTest_) private // private methods function RandomItem: _ItemType_; published // published methods procedure DoIt; procedure TestTwoLists; procedure TestInsert; procedure TestInsertAt0; procedure DeleteTest; {* Тест удаления элемента } procedure AddTest; {* Тест добавления элемента } procedure RemoveTest; {* Тест удаления элемента по значению } end;//_AtomicListTest_ {$IfEnd} //nsTest {$Else AtomicListTest_imp} {$If defined(nsTest)} {$Include ..\SandBox\ListTest.imp.pas} // start class _AtomicListTest_ function _AtomicListTest_.RandomItem: _ItemType_; //#UC START# *51E6ADE0016E_51E03FC80111_var* var l_V : Cardinal; //#UC END# *51E6ADE0016E_51E03FC80111_var* begin //#UC START# *51E6ADE0016E_51E03FC80111_impl* l_V := Random(1000); if (l_V > High(_ItemType_)) then Result := High(_ItemType_) else Result := l_V; //#UC END# *51E6ADE0016E_51E03FC80111_impl* end;//_AtomicListTest_.RandomItem procedure _AtomicListTest_.DoIt; //#UC START# *51DEB319037C_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Count : IndexType; l_Index : IndexType; //#UC END# *51DEB319037C_51E03FC80111_var* begin //#UC START# *51DEB319037C_51E03FC80111_impl* l_List := CreateList; try l_List.Count := cCount; Check(l_List.Count = cCount); Check(l_List.Capacity >= cCount); for l_Index := 0 to l_List.Count - 1 do Check(l_List[l_Index] = 0); l_Count := Random(cCount); l_List.Count := l_Count; Check(l_List.Count = l_Count, Format('Выделяли %d элементов. Count = %d', [l_Count, l_List.Count])); Check(l_List.Capacity >= l_Count, Format('Выделяли %d элементов. Capacity = %d', [l_Count, l_List.Capacity])); for l_Index := 0 to l_List.Count - 1 do Check(l_List[l_Index] = 0); finally FreeAndNil(l_List); end;//try..finally //#UC END# *51DEB319037C_51E03FC80111_impl* end;//_AtomicListTest_.DoIt procedure _AtomicListTest_.TestTwoLists; //#UC START# *51DED6FC03C1_51E03FC80111_var* const cCount = 1000; var l_A : _ListType_; l_B : _ListType_; l_Index : IndexType; l_Value : _ItemType_; //#UC END# *51DED6FC03C1_51E03FC80111_var* begin //#UC START# *51DED6FC03C1_51E03FC80111_impl* l_A := CreateList; try l_B := CreateList; try l_A.Count := cCount; for l_Index := 0 to l_A.Count - 1 do begin l_Value := RandomItem; l_A[l_Index] := l_Value; Check(l_A[l_Index] = l_Value); end;//for l_Index l_B.Count := l_A.Count; for l_Index := 0 to l_A.Count - 1 do begin l_B[l_Index] := l_A[l_Index]; end;//for l_Index for l_Index := 0 to l_A.Count - 1 do begin Check(l_B[l_Index] = l_A[l_Index]); end;//for l_Index finally FreeAndNil(l_B); end;//try..finally finally FreeAndNil(l_A); end;//try..finally //#UC END# *51DED6FC03C1_51E03FC80111_impl* end;//_AtomicListTest_.TestTwoLists procedure _AtomicListTest_.TestInsert; //#UC START# *51E6AC74038B_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Value : _ItemType_; l_Index : IndexType; //#UC END# *51E6AC74038B_51E03FC80111_var* begin //#UC START# *51E6AC74038B_51E03FC80111_impl* l_List := CreateList; try for l_Index := 0 to cCount do begin l_Value := RandomItem; l_List.Insert(l_Index, l_Value); Check(l_List.Count = l_Index + 1); Check(l_List[l_Index] = l_Value); end;//for l_Index finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E6AC74038B_51E03FC80111_impl* end;//_AtomicListTest_.TestInsert procedure _AtomicListTest_.TestInsertAt0; //#UC START# *51E6B4260008_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Value : _ItemType_; l_Index : IndexType; //#UC END# *51E6B4260008_51E03FC80111_var* begin //#UC START# *51E6B4260008_51E03FC80111_impl* l_List := CreateList; try for l_Index := 0 to cCount do begin l_Value := RandomItem; l_List.Insert(0, l_Value); Check(l_List.Count = l_Index + 1); Check(l_List[0] = l_Value); end;//for l_Index finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E6B4260008_51E03FC80111_impl* end;//_AtomicListTest_.TestInsertAt0 procedure _AtomicListTest_.DeleteTest; //#UC START# *51E7F6EF0285_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Value : _ItemType_; l_Index : IndexType; l_Prev : _ItemType_; //#UC END# *51E7F6EF0285_51E03FC80111_var* begin //#UC START# *51E7F6EF0285_51E03FC80111_impl* l_List := CreateList; try for l_Index := 0 to cCount do begin l_Value := RandomItem; l_List.Insert(l_Index, l_Value); Check(l_List.Count = l_Index + 1); Check(l_List[l_Index] = l_Value); end;//for l_Index while not l_List.Empty do begin l_Index := Random(l_List.Count - 1); if (l_Index < l_List.Count - 1) then begin l_Prev := l_List[l_Index + 1]; l_List.Delete(l_Index); if l_List.Empty then break; Check(l_List[l_Index] = l_Prev); end//l_Index < l_List.Count - 1 else begin if (l_Index = 0) then l_List.Delete(l_Index) else begin l_Prev := l_List[l_Index - 1]; l_List.Delete(l_Index); if l_List.Empty then break; Check(l_List[l_Index - 1] = l_Prev); end;//l_Index = 0 end;//l_Index < l_List.Count - 1 end;//while l_List.Count finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E7F6EF0285_51E03FC80111_impl* end;//_AtomicListTest_.DeleteTest procedure _AtomicListTest_.AddTest; //#UC START# *51E80DC50154_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Value : _ItemType_; l_Index : IndexType; //#UC END# *51E80DC50154_51E03FC80111_var* begin //#UC START# *51E80DC50154_51E03FC80111_impl* l_List := CreateList; try for l_Index := 0 to cCount do begin l_Value := RandomItem; l_List.Add(l_Value); Check(l_List.Last = l_Value); end;//for l_Index finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E80DC50154_51E03FC80111_impl* end;//_AtomicListTest_.AddTest procedure _AtomicListTest_.RemoveTest; //#UC START# *51E8127802AF_51E03FC80111_var* const cCount = 1000; var l_List : _ListType_; l_Value : _ItemType_; l_Index : IndexType; //#UC END# *51E8127802AF_51E03FC80111_var* begin //#UC START# *51E8127802AF_51E03FC80111_impl* l_List := CreateList; try for l_Index := 0 to cCount do begin l_Value := RandomItem; l_List.Add(l_Value); Check(l_List.Last = l_Value); end;//for l_Index while not l_List.Empty do begin l_Value := RandomItem; l_List.Remove(l_Value); end;//while not finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E8127802AF_51E03FC80111_impl* end;//_AtomicListTest_.RemoveTest {$IfEnd} //nsTest {$EndIf AtomicListTest_imp}
IUnknownRefListTest.pas:
unit IUnknownRefListTest; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "SandBoxTest" // Модуль: "IUnknownRefListTest.pas" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: TestCase::Class Shared Delphi Sand Box::SandBoxTest::FinalContainersTests::IUnknownRefListTest // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$Include ..\SandBox\sbtDefine.inc} interface {$If defined(nsTest)} uses TestFrameWork, IUnknownRefList ; {$IfEnd} //nsTest {$If defined(nsTest)} type _ListType_ = TIUnknownRefList; {$Include ..\SandBox\ListTest.imp.pas} TIUnknownRefListTest = class(_ListTest_) published // published methods procedure DoIt; end;//TIUnknownRefListTest {$IfEnd} //nsTest implementation {$If defined(nsTest)} uses SysUtils ; {$IfEnd} //nsTest {$If defined(nsTest)} {$Include ..\SandBox\ListTest.imp.pas} // start class TIUnknownRefListTest procedure TIUnknownRefListTest.DoIt; //#UC START# *51E80B2F02CF_51E80B08039E_var* var l_List : _ListType_; //#UC END# *51E80B2F02CF_51E80B08039E_var* begin //#UC START# *51E80B2F02CF_51E80B08039E_impl* l_List := CreateList; try // - Пока больше ничего не делаем finally FreeAndNil(l_List); end;//try..finally //#UC END# *51E80B2F02CF_51E80B08039E_impl* end;//TIUnknownRefListTest.DoIt {$IfEnd} //nsTest initialization TestFramework.RegisterTest(TIUnknownRefListTest.Suite); end.
Тут надо кстати сделать рандомный тест Insert.
ОтветитьУдалить