BitArray-Klasse aus dem .NET Framework | UDF

  • Schönen guten Abend! :)
    Ich habe heute wieder mit der AutoItObject UDF herumgespielt und hatte das Bedürfnis einfach mal ein Objekt aus dem .NET Framework zu programmieren. Bei dieser UDF handelt es sich lediglich um eine Kopie (ich greife nicht wirklich auf das .NET Framework zu) der BitArray-Klasse. Ich habe diese Klasse bewusst gewählt da Sie mir als Übung recht einfach erschien und eben noch nicht via ObjCreate() ansprechbar ist. Diese Klasse ist dafür gedacht mit Booleschen Werten zu arbeiten und einzelne Bits in einem Array ansprechen zu können. Zwar ist meine Implementierung der Klasse nicht so schnell wie die Bit-Funktionen, ist aber von der Syntax und der Handhabung anders. Alternativ verlinke ich einfach mal zu meiner Bit.au3 da diese auch ganz gut in die Thematik passt.

    Insgesamt werden folgende Funktionalitäten unterstützt:

    Was welches Attribut, Eigenschaft oder Methode bewirkt ist in der oberen verlinkten Referenz nachzulesen. Habe mich bemüht alles genau so umzusetzen wie es dort beschrieben ist. Als Zusatz gibt es das Attribut $oBitArray.Error welches euch anzeigt ob die letzte Funktion fehlerhafte Eingaben entgegen nahm. Dieses Attribut ist Objekt bezogen und wird solange nicht überschrieben bis einer der Methoden aufgerufen wird. Bei irgendwelche fehlerhaften Eingaben wird dieses Attribut auf 1 gesetzt.

    ToArray
    Hier muss weder Array noch Index (anders als wie in der Referenz) übergeben werden. Es wird lediglich ein Abbild des BitArray als normales Array zurückgegeben.

    ObjType
    Wird genau so verwendet wie in der Referenz angegeben. Einziger Unterschied ist jedoch, dass nicht „System.Collections.BitArray“ sondern „AutoItObject.Collections.BitArray“ zurückgegeben wird. Daher auch die veränderte Bezeichnung und die Umwandlung von einer Methode zu einem Attribut.

    Eigentlich dürfte die UDF soweit selbsterklärend sein. Mit der Referenz wird auch der Verwendungszweck schnell klar. Vielleicht kann diese ja jemand gebrauchen. Wenn nicht, auch nicht schlimm. ^^

    Falls Fragen oder Probleme auftauchen, ich stehe zur Stelle. Im Anhang findet ihr nochmals die oBitArray.au3 sowie die AutoItObject.au3 als ZIP Archiv. Falls jemand konkrete Wünsche hat dass ich mal ein paar .NET Framework Klassen als AutoIt Version übersetze, kann er / sie sich bei mir melden. Ansonsten viel Spaß! :)


    oBitArray.au3
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit] [autoit][/autoit] [autoit]

    #include-once
    #include "AutoItObject.au3"

    [/autoit] [autoit][/autoit] [autoit]

    _AutoItObject_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit] [autoit][/autoit] [autoit]

    Func _BitArray_Object($vValue, $bValue = Default)
    If IsObj($vValue) And $vValue.ObjType = 'AutoItObject.Collections.BitArray' Then
    Return $vValue.Clone()
    ElseIf IsArray($vValue) And UBound($vValue, 0) = 1 Then
    Local $bBool = True
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To UBound($vValue) -1
    $bBool = $bBool And IsBool($vValue[$iIndex])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $bBool Then
    Local $oBitArray = _BitArray_Object(UBound($vValue))

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oBitArray.Count -1
    $oBitArray.Set($iIndex, $vValue[$iIndex])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndIf
    ElseIf IsInt($vValue) And $vValue > 0 Then
    Local $oBitArray = _BitArray_Class().Object

    [/autoit] [autoit][/autoit] [autoit]

    $oBitArray.Length = $vValue
    $oBitArray.SetAll(IsBool($bValue) ? $bValue : False)

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError(1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BitArray_Class()
    Local $oBitArray = _AutoItObject_Class()
    Local $aArray[1]

    [/autoit] [autoit][/autoit] [autoit]

    With $oBitArray
    ; Private Scope
    .AddProperty('_BitArray_', $ELSCOPE_PRIVATE, $aArray)
    ; Attributes
    .AddProperty('Count', $ELSCOPE_READONLY)
    .AddMethod('Item', '__oBitArray_Item')
    .AddMethod('Length', '__oBitArray_Length')
    .AddProperty('ObjType', $ELSCOPE_READONLY, 'AutoItObject.Collections.BitArray')
    ; Methods
    .AddMethod('And', '__oBitArray_And')
    .AddMethod('Clone', '__oBitArray_Clone')
    .AddMethod('Equals', '__oBitArray_Equals')
    .AddMethod('Get', '__oBitArray_Get')
    .AddMethod('Not', '__oBitArray_Not')
    .AddMethod('Or', '__oBitArray_Or')
    .AddMethod('Set', '__oBitArray_Set')
    .AddMethod('SetAll', '__oBitArray_SetAll')
    .AddMethod('ToArray', '__oBitArray_ToArray')
    .AddMethod('Xor', '__oBitArray_Xor')
    ; Special
    .AddProperty('Error', $ELSCOPE_READONLY)
    .AddMethod('SetError', '__oBitArray_SetError', $ELSCOPE_PRIVATE)
    .AddMethod('__default__', '__oBitArray_Default')
    .AddEnum('__oBitArray_EnumNext', '__oBitArray_EnumReset')
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Item($oSelf, $iIndex, $bValue = Default)
    $oSelf.SetError(0)
    If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Then Return $oSelf.SetError(1)
    If Not IsKeyword($bValue) Then $oSelf._BitArray_(($iIndex)) = $bValue Or False
    Return $oSelf._BitArray_[$iIndex]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Length($oSelf, $iValue = Default)
    $oSelf.SetError(0)
    If Not IsKeyword($iValue) Then
    If Not IsInt($iValue) Or $iValue < 1 Then Return $oSelf.SetError(1)
    Local $aBitArray = $oSelf._BitArray_
    Local $iFrom = $oSelf.Count
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    ReDim $aBitArray[$iValue]
    $oSelf._BitArray_ = $aBitArray
    $oSelf.Count = $iValue

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = $iFrom To $iValue -1
    $oSelf.Set($iIndex, False)
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $oSelf.Count
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_And($oSelf, $oValue)
    $oSelf.SetError(0)
    If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
    Local $oBitArray = _BitArray_Object($oSelf.Count)
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    $oBitArray.Set($iIndex, $oSelf.Get($iIndex) And $oValue.Get($iIndex))
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Clone($oSelf)
    $oSelf.SetError(0)
    Return _AutoItObject_Create($oSelf)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Equals($oSelf, $oObj)
    $oSelf.SetError(0)
    If Not IsObj($oObj) Then Return $oSelf.SetError(1)
    If $oSelf.ObjType <> $oObj.ObjType Or $oSelf.Count <> $oObj.Count Then Return False
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    If $oSelf.Get($iIndex) <> $oObj.Get($iIndex) Then Return False
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Get($oSelf, $iIndex)
    $oSelf.SetError(0)
    If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Then Return $oSelf.SetError(1)
    Return $oSelf._BitArray_[$iIndex]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Not($oSelf)
    $oSelf.SetError(0)
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    $oSelf.Set($iIndex, Not $oSelf.Get($iIndex))
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Or($oSelf, $oValue)
    $oSelf.SetError(0)
    If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
    Local $oBitArray = _BitArray_Object($oSelf.Count)
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    $oBitArray.Set($iIndex, $oSelf.Get($iIndex) Or $oValue.Get($iIndex))
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Set($oSelf, $iIndex, $bValue)
    $oSelf.SetError(0)
    If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Or Not IsBool($bValue) Then Return $oSelf.SetError(1)
    $oSelf._BitArray_(($iIndex)) = $bValue
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_SetAll($oSelf, $bValue)
    $oSelf.SetError(0)
    If Not IsBool($bValue) Then Return $oSelf.SetError(1)
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    $oSelf.Set($iIndex, $bValue)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_ToArray($oSelf)
    $oSelf.SetError(0)
    Return $oSelf._BitArray_
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Xor($oSelf, $oValue)
    $oSelf.SetError(0)
    If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
    Local $oBitArray = _BitArray_Object($oSelf.Count)
    Local $iIndex

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To $oSelf.Count -1
    $oBitArray.Set($iIndex, (Not $oSelf.Get($iIndex) And $oValue.Get($iIndex)) Or ($oSelf.Get($iIndex) And Not $oValue.Get($iIndex)))
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $oBitArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_SetError($oSelf, $iError)
    $oSelf.Error = $iError
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_Default($oSelf, $iIndex, $bValue = Default)
    $oSelf.SetError(0)
    If IsKeyword($bValue) Then Return $oSelf.Get($iIndex)
    $oSelf.Set($iIndex, $bValue)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_EnumNext($oSelf, ByRef $iCounter)
    If $iCounter = $oSelf.Count Then Return SetError(1)
    Local $bRet = $oSelf.Get(($iCounter))

    [/autoit] [autoit][/autoit] [autoit]

    $iCounter += 1

    [/autoit] [autoit][/autoit] [autoit]

    Return $bRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __oBitArray_EnumReset($oSelf, ByRef $iCounter)
    $iCounter = 0
    Return True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]


    PS: Beispiele schreibe ich noch irgendwann. :S

    Einmal editiert, zuletzt von Yjuq (4. Februar 2015 um 22:20)

  • [autoit]

    $AList = ObjCreate("System.Collections.BitArray")

    [/autoit]


    Bzgl. Bitarray hatte ich vor beinahe 5 Jahren AspirinJunkie angesprochen, welcher einen tollen Thread bzgl. Listen statt Arrays hatte.
    Leider bekamen wir beide damals eine Fehlermeldung.