Extends Zstring は、
typename を宣言して、
Zstring のプロパティと動作を、継承します。
目的は、ユーザーが、既存の fbc コンパイラの組み込みに、うまく統合できる、カスタム文字列型を作成(つまり、動的メモリ管理を使う)できるようにすることです。(fbc の
Zstring 型との良好な相互運用性)
このような適切な
Cast 演算子を使った UDT の宣言は、UDTを
Zstring に変換するように、コンパイラーに指示します。
(さらに、
Let,
[] (Pointer index),
Len, ...などの、他の適切な演算子も宣言できます)
Zstring の動作は、直接や間接に、あるいは単独で、ベース型から継承できます。
Zstring の動作は、
base_typename を拡張する UDT によっても継承できます。(疑似多重継承の一種)
(直接、間接を問わず)型を
Extends Zstring として宣言することにより(加えて適切な
Cast 演算子だけを定義することで)、
Strptr/
Sadd,
Lset/
Rset, および
Select Case を使っても、完全に
Zstring 型と互換性があります。
Type myZstring Extends ZString
Public:
Declare Constructor (ByRef z As Const ZString = "")
Declare Operator Cast () ByRef As Const ZString
Declare Operator Let (ByRef z As Const ZString)
Private:
Dim As String s
End Type
Constructor myZstring (ByRef z As Const ZString = "")
This.s = z
End Constructor
Operator myZstring.Cast () ByRef As Const ZString
Return *StrPtr(This.s)
End Operator
Operator myZstring.Let (ByRef z As Const ZString)
This.s = z
End Operator
Dim As myZstring z = "FreeBASIC"
Print "'" & z & "'"
z &= " compiler"
Print "'" & z & "'"
Sleep
Type vZstring Extends ZString
Public:
Declare Constructor (ByVal pz As Const ZString Ptr = 0)
Declare Operator Cast () ByRef As ZString
Declare Operator Let (ByVal pz As Const ZString Ptr)
Declare Operator [] (ByVal index As Integer) ByRef As UByte
Declare Destructor ()
Private:
Dim As ZString Ptr p
Dim As UInteger l
End Type
Constructor vZstring (ByVal pz As Const ZString Ptr = 0)
This.l = Len(*pz)
This.p = CAllocate(This.l + 1, SizeOf(ZString))
*This.p = *pz
End Constructor
Operator vZstring.Cast () ByRef As ZString
Return *This.p
End Operator
Operator vZstring.Let (ByVal pz As Const ZString Ptr)
If This.l < Len(*pz) Then
Deallocate(This.p)
This.l = Len(*pz)
This.p = CAllocate(This.l + 1, SizeOf(ZString))
End If
*This.p = *pz
End Operator
Operator vZstring.[] (ByVal index As Integer) ByRef As UByte
Return This.p[index]
End Operator
Destructor vZstring ()
Deallocate(This.p)
End Destructor
Operator Len (ByRef v As vZstring) As Integer
Return Len(Type<String>(v)) '' found nothing better than this
End Operator '' (or: 'Return Len(Str(v))')
Dim As vZstring v = "FreeBASIC"
Print "'" & v & "'", Len(v)
Dim As ZString * 256 z
z = *StrPtr(v) '' 'error 24: Invalid data types' without 'Extends Zstring'
Print "'" & z & "'", Len(z)
v &= Space(2)
Print "'" & v & "'", Len(v)
RSet v, "FreeBASIC" '' 'error 24: Invalid data types' without 'Extends Zstring'
Print "'" & v & "'", Len(v) '' ('Cast' must return a modifiable reference)
Select Case v '' 'error 24: Invalid data types' without 'Extends Zstring'
Case Type<vZstring>(Trim(v) & " ")
Print "Left justified"
Case Type<vZstring>(" " & Trim(v))
Print "Right justified"
End Select
v[0] = Asc("-")
Print "'" & v & "'", Len(v)
'Print "'" & Right(v, 5) & "'" '' fbc 1.09.0 〜「Right」は「ExtendsZstring」型をサポートします!
Print "'" & Right(Str(v), 5) & "'" '' fbc 1.09.0 より前は、この回避策を使ってください(または: 'Right(Type<String>(v), 5)')
Sleep