unit kwStringFactory; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "ScriptEngine" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Scripting::ScriptEngine::PrimitiveWords::TkwStringFactory // // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ! Полностью генерируется с модели. Править руками - нельзя. ! {$Include ..\ScriptEngine\seDefine.inc} interface {$If not defined(NoScripts)} uses l3Interfaces, kwString, kwStringList ; {$IfEnd} //not NoScripts {$If not defined(NoScripts)} type TkwStringFactory = class(TkwStringList) protected // overridden protected methods procedure InitFields; override; public // public methods function MakeKW(const aValue: Il3CString): TkwString; public // singleton factory method class function Instance: TkwStringFactory; {- возвращает экземпляр синглетона. } end;//TkwStringFactory {$IfEnd} //not NoScripts implementation {$If not defined(NoScripts)} uses l3Base {a}, SysUtils, l3String ; {$IfEnd} //not NoScripts {$If not defined(NoScripts)} // start class TkwStringFactory var g_TkwStringFactory : TkwStringFactory = nil; procedure TkwStringFactoryFree; begin l3Free(g_TkwStringFactory); end; class function TkwStringFactory.Instance: TkwStringFactory; begin if (g_TkwStringFactory = nil) then begin l3System.AddExitProc(TkwStringFactoryFree); g_TkwStringFactory := Create; end; Result := g_TkwStringFactory; end; function TkwStringFactory.MakeKW(const aValue: Il3CString): TkwString; //#UC START# *4F3E41C603BC_4F3E416701E8_var* const cLimit = 300; var l_Len : Integer; l_Index : Integer; l_KW : TkwString; //#UC END# *4F3E41C603BC_4F3E416701E8_var* begin //#UC START# *4F3E41C603BC_4F3E416701E8_impl* l_Len := l3Len(aValue); if (l_Len < cLimit) then begin if FindData(aValue, l_Index) then Result := Self.Items[l_Index].Use else begin l_KW := TkwString.Create(aValue); Result := l_KW; Self.DirectInsert(l_Index, l_KW); end;//FindData(aValue, l_Index) end//l_Len < cLimit else Result := TkwString.Create(aValue); //#UC END# *4F3E41C603BC_4F3E416701E8_impl* end;//TkwStringFactory.MakeKW procedure TkwStringFactory.InitFields; //#UC START# *47A042E100E2_4F3E416701E8_var* //#UC END# *47A042E100E2_4F3E416701E8_var* begin //#UC START# *47A042E100E2_4F3E416701E8_impl* inherited; Sorted := true; //#UC END# *47A042E100E2_4F3E416701E8_impl* end;//TkwStringFactory.InitFields {$IfEnd} //not NoScripts end. unit l3TwoByteCString; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "L3" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Low Level::L3::l3CoreObjects::Tl3TwoByteCString // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ! Полностью генерируется с модели. Править руками - нельзя. ! {$Include ..\L3\l3Define.inc} interface uses l3Interfaces, l3CProtoObject ; type Tl3TwoByteCString = class(Tl3CProtoObject, Il3CString) private // private fields f_Chars : Word; protected // realized methods function pm_GetAsWStr: Tl3WString; public // public methods constructor Create(aChars: Word); reintroduce; class function Make(aChars: Word): Il3CString; reintroduce; {* Сигнатура фабрики Tl3TwoByteCString.Make } end;//Tl3TwoByteCString implementation uses l3String, l3Chars ; // start class Tl3TwoByteCString constructor Tl3TwoByteCString.Create(aChars: Word); //#UC START# *4F5CBCAF00B4_4F5CBBE60070_var* //#UC END# *4F5CBCAF00B4_4F5CBBE60070_var* begin //#UC START# *4F5CBCAF00B4_4F5CBBE60070_impl* inherited Create; f_Chars := aChars; //#UC END# *4F5CBCAF00B4_4F5CBBE60070_impl* end;//Tl3TwoByteCString.Create class function Tl3TwoByteCString.Make(aChars: Word): Il3CString; var l_Inst : Tl3TwoByteCString; begin l_Inst := Create(aChars); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end; function Tl3TwoByteCString.pm_GetAsWStr: Tl3WString; //#UC START# *46780DEF03E5_4F5CBBE60070get_var* //#UC END# *46780DEF03E5_4F5CBBE60070get_var* begin //#UC START# *46780DEF03E5_4F5CBBE60070get_impl* Result.S := @f_Chars; Result.SLen := 2; Result.SCodePage := CP_ANSI; //#UC END# *46780DEF03E5_4F5CBBE60070get_impl* end;//Tl3TwoByteCString.pm_GetAsWStr end. function l3CStr(const aStr: Tl3WString): Il3CString; //overload; {-} var l_S : Tl3InterfacedString; begin if l3IsNil(aStr) then begin Result := Tl3CEmptyString.Instance; Exit; end;//l3IsNil(aStr) if l3IsAnsi(aStr.SCodePage) then begin if (aStr.SLen = 1) then begin Result := Tl3OneByteCString.Make(aStr.S^); Exit; end//aStr.SLen = 1 else if (aStr.SLen = 2) then begin Result := Tl3TwoByteCString.Make(PWord(aStr.S)^); Exit; end//aStr.SLen = 2 else if (aStr.SLen = 4) then begin Result := Tl3FourByteCString.Make(PLong(aStr.S)^); Exit; end;//aStr.SLen = 4 end;//l3IsAnsi(aStr.SCodePage) l_S := Tl3InterfacedString.Make(aStr); try Result := l_S; finally l3Free(l_S); end;//try..finally end; unit tfwCStringFactory; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Библиотека "ScriptEngine" // Родные Delphi интерфейсы (.pas) // Generated from UML model, root element: SimpleClass::Class Shared Delphi Scripting::ScriptEngine::CString::TtfwCStringFactory // // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ! Полностью генерируется с модели. Править руками - нельзя. ! {$Include ..\ScriptEngine\seDefine.inc} interface {$If not defined(NoScripts)} uses l3Interfaces, l3PrimString, tfwCStringList ; {$IfEnd} //not NoScripts {$If not defined(NoScripts)} type TtfwCStringFactory = class(TtfwCStringList) protected // overridden protected methods procedure InitFields; override; public // public methods class function C(const aString: AnsiString): Il3CString; overload; class function C(const aString: Tl3WString): Il3CString; overload; class function C(aString: Tl3PrimString): Il3CString; overload; class function C(aChar: AnsiChar): Il3CString; overload; public // singleton factory method class function Instance: TtfwCStringFactory; {- возвращает экземпляр синглетона. } end;//TtfwCStringFactory {$IfEnd} //not NoScripts implementation {$If not defined(NoScripts)} uses l3Base {a}, l3String, tfwCStringArraySing, tfwCStringArraySing2, l3Types ; {$IfEnd} //not NoScripts {$If not defined(NoScripts)} // start class TtfwCStringFactory var g_TtfwCStringFactory : TtfwCStringFactory = nil; procedure TtfwCStringFactoryFree; begin l3Free(g_TtfwCStringFactory); end; class function TtfwCStringFactory.Instance: TtfwCStringFactory; begin if (g_TtfwCStringFactory = nil) then begin l3System.AddExitProc(TtfwCStringFactoryFree); g_TtfwCStringFactory := Create; end; Result := g_TtfwCStringFactory; end; const { Local } cLimit = 200; // start class TtfwCStringFactory class function TtfwCStringFactory.C(const aString: AnsiString): Il3CString; //#UC START# *4F47405B02FD_4F473F9402D8_var* var i : Integer; l_Len : Integer; l_W : Word; //#UC END# *4F47405B02FD_4F473F9402D8_var* begin //#UC START# *4F47405B02FD_4F473F9402D8_impl* {.$IfNDef XE} l_Len := Length(aString); if (l_Len < cLimit) then begin if (l_Len = 1) then Result := C(aString[1]) else if (l_Len = 2) then begin l_W := PWord(@(aString[1]))^; Result := TtfwCStringArraySing2.Instance.Items[l_W]; if (Result = nil) then begin Result := l3CStr(aString); TtfwCStringArraySing2.Instance.Items[l_W] := Result; end;//Result = nil end//l_Len = 2 else with Instance do begin if FindData(l3PCharLen(aString), i, SortIndex) then Result := Items[i] else begin Result := l3CStr(aString); DirectInsert(i, Result); end;//FindData(l3PCharLen(aString), i) end;//with Instance end//Length(aString) < cLimit else {.$EndIf XE} Result := l3CStr(aString); //#UC END# *4F47405B02FD_4F473F9402D8_impl* end;//TtfwCStringFactory.C class function TtfwCStringFactory.C(const aString: Tl3WString): Il3CString; //#UC START# *4F47407D0052_4F473F9402D8_var* var i : Integer; l_W : Word; //#UC END# *4F47407D0052_4F473F9402D8_var* begin //#UC START# *4F47407D0052_4F473F9402D8_impl* {.$IfNDef XE} if (aString.SLen < cLimit) then begin if (aString.SLen = 1) AND l3IsANSI(aString.SCodePage) then begin Assert(aString.S <> nil); Result := C(aString.S[0]); end//aString.SLen = 1 else if (aString.SLen = 2) AND l3IsANSI(aString.SCodePage) then begin Assert(aString.S <> nil); l_W := PWord(aString.S)^; Result := TtfwCStringArraySing2.Instance.Items[l_W]; if (Result = nil) then begin Result := l3CStr(aString); TtfwCStringArraySing2.Instance.Items[l_W] := Result; end;//Result = nil end//aString.SLen = 2 else with Instance do begin if FindData(aString, i, SortIndex) then Result := Items[i] else begin Result := l3CStr(aString); DirectInsert(i, Result); end;//FindData(l3PCharLen(aString), i) end;//with Instance end//Length(aString) < cLimit else {.$EndIf XE} Result := l3CStr(aString); //#UC END# *4F47407D0052_4F473F9402D8_impl* end;//TtfwCStringFactory.C class function TtfwCStringFactory.C(aString: Tl3PrimString): Il3CString; //#UC START# *4F4740A802A8_4F473F9402D8_var* var l_S : Tl3WString; //#UC END# *4F4740A802A8_4F473F9402D8_var* begin //#UC START# *4F4740A802A8_4F473F9402D8_impl* if (aString = nil) then Result := l3CStr('') else begin l_S := aString.AsWStr; if (l_S.SLen < cLimit) then Result := C(l_S) else Result := l3CStr(aString); end;//aString = nil //#UC END# *4F4740A802A8_4F473F9402D8_impl* end;//TtfwCStringFactory.C class function TtfwCStringFactory.C(aChar: AnsiChar): Il3CString; //#UC START# *4F50782700AA_4F473F9402D8_var* //#UC END# *4F50782700AA_4F473F9402D8_var* begin //#UC START# *4F50782700AA_4F473F9402D8_impl* Result := TtfwCStringArraySing.Instance.Items[Ord(aChar)]; if (Result = nil) then begin Result := l3CStr(aChar); TtfwCStringArraySing.Instance.Items[Ord(aChar)] := Result; end;//Result = nil //#UC END# *4F50782700AA_4F473F9402D8_impl* end;//TtfwCStringFactory.C procedure TtfwCStringFactory.InitFields; //#UC START# *47A042E100E2_4F473F9402D8_var* //#UC END# *47A042E100E2_4F473F9402D8_var* begin //#UC START# *47A042E100E2_4F473F9402D8_impl* inherited; Sorted := true; //#UC END# *47A042E100E2_4F473F9402D8_impl* end;//TtfwCStringFactory.InitFields {$IfEnd} //not NoScripts end.
Блог человека, который 18-ть лет программирует на Delphi. И 25 лет программирует вообще. VCL, UML, MDA, тесты. Это не "учебник", это - "заметки на полях".
среда, 30 октября 2013 г.
"Голый код" про Immutable-строки и фабрику строк
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий