PureBasic
https://www.purebasic.fr/french/

StringBuilder
https://www.purebasic.fr/french/viewtopic.php?f=1&t=15490
Page 3 sur 3

Auteur:  Shadow [ Sam 09/Fév/2019 21:02 ]
Sujet du message:  Re: StringBuilder

Hello,

Je r'ouvre mon sujet, oui Brayane s'était moi, tous le monde le savais à la fin.
J'ai créer deux autre code, mais pour moi le dernier est le meilleurs:

Code:
Structure MyStringBuilder
 
  *MyStringBuilderMemoryiD
  MyStringBuilderSize.q
  MyStringBuilderRemaining.q
  MyStringBuilderPosition.q
 
EndStructure

Global Dim MyStringBuilder.MyStringBuilder(0)

Procedure.b initialiseStringBuilder(Taille.q)
 
  If Taille.q <= 0
    Taille.q = 1
  EndIf
 
  If ArraySize(MyStringBuilder(), 1) = -1
    ProcedureReturn 0
  EndIf
 
  If MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD = 0
   
    *MyStringBuilderMemoryiD = AllocateMemory(StringByteLength(Space(Taille.q), #PB_Unicode) + 2)
   
    If *MyStringBuilderMemoryiD
     
      MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
      MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD) / 2
      MemorySize.q - 1
     
      MyStringBuilder.MyStringBuilder(0)\MyStringBuilderRemaining = MemorySize.q
      MyStringBuilder.MyStringBuilder(0)\MyStringBuilderSize = MemorySize.q
      MyStringBuilder.MyStringBuilder(0)\MyStringBuilderPosition = 0
     
      ProcedureReturn 1
     
    Else
      ProcedureReturn 0
     
    EndIf
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.b isStringBuilder(ElementiD.i)
 
  ArraySize.i = ArraySize(MyStringBuilder(), 1)
 
  If ArraySize.i = -1 Or ElementiD.i < 0 Or ElementiD.i > ArraySize.i
    ProcedureReturn 0
  EndIf
 
  If MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD <> 0
    ProcedureReturn  1
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.b StringBuilderAddElement(Taille.q)
 
  ArraySize.i = ArraySize(MyStringBuilder(), 1)
 
  If ArraySize.i = -1
    ProcedureReturn 0
  EndIf
 
  ReDim MyStringBuilder.MyStringBuilder(ArraySize.i + 1)
 
  *MyStringBuilderMemoryiD = AllocateMemory(StringByteLength(Space(Taille.q), #PB_Unicode) + 2)
 
  If *MyStringBuilderMemoryiD
   
    MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
    MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD) / 2
    MemorySize.q - 1
   
    MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderRemaining = MemorySize.q
    MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = MemorySize.q
    MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderPosition = 0
   
    ProcedureReturn 1
   
  Else
    ProcedureReturn 0
   
  EndIf
 
  ProcedureReturn ElementiD.i + 1
 
EndProcedure
Procedure.b StringBuilderClearString(ElementiD.i)
 
  If Not isStringBuilder(ElementiD.i)
    ProcedureReturn 0
  EndIf
 
  MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD) / 2
  MemorySize.q - 1
 
  FillMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize, #Null , #PB_Unicode)
 
  MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q
  MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
  MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition = 0
 
  ProcedureReturn 1
 
EndProcedure
Procedure.b StringBuilderReAllocate(ElementiD.i, Taille.q)
 
  If Taille.q <= 0
    Taille.q = 1
  EndIf
 
  If Not isStringBuilder(ElementiD.i)
    ProcedureReturn 0
  EndIf
 
  *MyStringBuilderMemoryiD = ReAllocateMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, Taille.q)
 
  If *MyStringBuilderMemoryiD
   
    MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
    MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
    MemorySize.q - 1
   
    TailleActuel.q = MemorySize.q
    NouvelleTaille.q = Taille.q
    Restant.q = MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
   
    If TailleActuel.q > NouvelleTaille.q
     
      Difference.q = TailleActuel.q - NouvelleTaille.q
      Restant.q - Difference.q
     
      If Restant.q < 0
        MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Restant.q
        Restant.q = 0
      EndIf
     
      MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = Restant.q
      MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = Taille.q
     
    ElseIf NouvelleTaille.q > TailleActuel.q
     
      Difference.q = NouvelleTaille.q - TailleActuel.q
      Restant.q + Difference.q
     
      MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining  = Restant.q
      MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = Taille.q
     
    EndIf
   
    ProcedureReturn 1
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.b StringBuilderAddString(ElementiD.i, String.s)
 
  If Not String.s > ""
    ProcedureReturn 0
  EndIf
 
  If isStringBuilder(ElementiD.i)
   
    If Len(String.s) > MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
     
      *MyStringBuilderMemoryiD = ReAllocateMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) + (StringByteLength(String.s) * 10))
     
      If *MyStringBuilderMemoryiD
       
        MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
       
        MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
        MemorySize.q - 1
       
        If PokeS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD + (MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition * 2), String.s, -1, #PB_Unicode)
         
          MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q - MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition - Len(String.s)
          MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
          MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Len(String.s)
         
          ProcedureReturn 1
         
        Else
          ProcedureReturn 0
         
        EndIf
       
      Else
        ProcedureReturn 0
       
      EndIf
     
    Else
     
      MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
      MemorySize.q - 1
     
      If PokeS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD + (MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition * 2), String.s, -1, #PB_Unicode)
       
        MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q - MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition - Len(String.s)
        MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
        MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Len(String.s)
       
        ProcedureReturn 1
       
      Else
        ProcedureReturn 0
       
      EndIf
     
    EndIf
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.S StringBuilderGetString(ElementiD.i)
 
  If isStringBuilder(ElementiD.i)
    ProcedureReturn PeekS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, -1, #PB_Unicode)
   
  Else
    ProcedureReturn ""
   
  EndIf
 
EndProcedure
Procedure.i StringBuilderGetMemoryiD(ElementiD.i)
 
  If isStringBuilder(ElementiD.i)
    ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.i StringBuilderGetMemorySize(ElementiD.i)
 
  If isStringBuilder(ElementiD.i)
    ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.i StringBuilderGetMemoryRemaining(ElementiD.i)
 
  If isStringBuilder(ElementiD.i)
    ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
Procedure.i StringBuilderGetMemoryPosition(ElementiD.i)
 
  If isStringBuilder(ElementiD.i)
    ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure
;
; Procedure.i StringBuilderDeletteElement()
;   
;   
;   
; EndProcedure
;
; Procedure.i StringBuilderCopyElement()
;   
;   
;   
; EndProcedure

Abc$ = "Abcdefghijklmnopqrstuvwxyz"

If initialiseStringBuilder(0)
 
  For MonStringBuilder1.i = 0 To 5
   
    If isStringBuilder(MonStringBuilder1.i)
     
      MessageRequester("StringBuilder initialisation...", "StringBuilderID = " + Str(MonStringBuilder1.i) + Chr(13) + Chr(10) +
                                                          "StringBuilder MemoryiD = " + Str(StringBuilderGetMemoryiD(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                          "StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                          "StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                          "StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition(MonStringBuilder1.i)))
     
      Time1 = ElapsedMilliseconds()
     
      For i = 1 To 255
       
        Write.b = StringBuilderAddString(MonStringBuilder1.i, Abc$)
        MemoryiD.q = StringBuilderGetMemoryiD(MonStringBuilder1.i)
        MemorySize.q = StringBuilderGetMemorySize(MonStringBuilder1.i)
        MemoryRemaining.q = StringBuilderGetMemoryRemaining(MonStringBuilder1.i)
        MemoryPosition.q = StringBuilderGetMemoryPosition(MonStringBuilder1.i)
        ;     
        ;     Debug "MemoryiD: " + Str(MemoryiD.q)
        ;     Debug "MemorySize: " + Str(MemorySize.q)
        ;     Debug "MemoryRemaining: " + Str(MemoryRemaining.q)
        ;     Debug "MemoryPosition: " + Str(MemoryPosition.q)
        ;     Debug "Write: " + Str(Write.b)
        ;     Debug "---------------------------"
        ;     
      Next
     
      Time2 = ElapsedMilliseconds()
     
      MessageRequester("StringBuilder Résultat...", "StringBuilderID = " + Str(MonStringBuilder1.i) + Chr(13) + Chr(10) +
                                                    "StringBuilder MemoryiD = " + Str(StringBuilderGetMemoryiD(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                    "StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                    "StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                    "StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
                                                    "Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
     
      If StringBuilderAddElement(1)
       
      Else
        Debug 0
       
      EndIf
     
    Else
      MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n°" + Str(MonStringBuilder1.i) + ", n'a pas put être initialisé !", 16)
     
    EndIf
   
  Next
 
Else
  MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
 
EndIf

For i = 0 To 5
  Debug StringBuilderGetString(I)
  Debug "----------"
Next

Auteur:  Shadow [ Sam 09/Fév/2019 21:03 ]
Sujet du message:  Re: StringBuilder

Code:
Structure StructureMyStringBuilder
 
  *MyStringBuilderMemoryID
  MyStringBuilderSize.q
  MyStringBuilderRemaining.q
  MyStringBuilderPosition.q
 
EndStructure

Global NewMap MapMyStringBuilder.StructureMyStringBuilder()

; Crée un nouveau StringBuilder avec comme Nom: Nom$ et Taille (En caractères): Taille.q.
; Il est conseillé de mèttre une taille assez grande pour pouvoir ajouter par la suite la ou les nouvelles Chaines de sorte à se que le programme ne sois pas obligé
; de réalouer automatiquement une taille plus grande pour pouvoir y ajouter la nouvelle Chaine, puisque ceci ralentie beaucoup le programme.
; Si le Nom est vide ou que celui-ci existe déjà alors la fonction échoura.
; Si la Taille est inférieur ou égale à 0 alors Taille vaudra 1.
; La Taille du StringBuilder est toujours en caractères.
; Renvoie 1 si le StringBuilder a été créer ou sinon 0.
Procedure.b CreateAndInitialiseMyStringBuilder(Nom$, Taille.q = 1)
 
  If Nom$ = "" Or FindMapElement(MapMyStringBuilder(), Nom$)
    ProcedureReturn 0
  EndIf
 
  If Taille.q <= 0
    Taille.q = 1
  EndIf
 
  If MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID = 0
   
    *MyStringBuilderMemoryID = AllocateMemory(StringByteLength(Space(Taille.q + 1), #PB_Unicode))
   
    If *MyStringBuilderMemoryID
     
      MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID = *MyStringBuilderMemoryID
      MemorySize.q = MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) / 2
      MemorySize.q - 1
     
      MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining = MemorySize.q
      MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = MemorySize.q
      MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition = 1
     
      ProcedureReturn 1
     
    Else
      ProcedureReturn 0
     
    EndIf
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Vérifie que le StringBuilder existe avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction échoura.
; Renvoie 1 si le StringBuilder éxiste ou sinon 0.
Procedure.b IsMyStringBuilder(Nom$)
 
  If Nom$ = "" Or Not FindMapElement(MapMyStringBuilder(), Nom$)
    ProcedureReturn 0
  Else
    ProcedureReturn  1
  EndIf
 
EndProcedure

; Ajoute une nouvelle chaine à la suite dans le StringBuilder avec comme Nom: Nom$ et Chaine: String.s.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction échoura.
; Si la Chaine à ajouter est vide alors la fonction échoura.
; Renvoie 1 si la Chaine a été ajouté ou sinon 0.
Procedure.b MyStringBuilderAddString(Nom$, String.s)
 
  If IsMyStringBuilder(Nom$) And String.s > ""
   
    If Len(String.s) > MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining
     
      *MyStringBuilderMemoryID = ReAllocateMemory(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID, MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) + (StringByteLength(String.s) * 10))
     
      If *MyStringBuilderMemoryID
       
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID = *MyStringBuilderMemoryID
       
        MemorySize.q = MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) / 2
        MemorySize.q - 1
       
        If PokeS(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID + ((MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition - 1) * 2), String.s, -1, #PB_Unicode)
         
          MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining = (MemorySize.q - (MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition - 1) - Len(String.s))
          MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = MemorySize.q
          MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition + Len(String.s)
         
          ProcedureReturn 1
         
        Else
          ProcedureReturn 0
         
        EndIf
       
      Else
        ProcedureReturn 0
       
      EndIf
     
    Else
     
      MemorySize.q = MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) / 2
      MemorySize.q - 1
     
      If PokeS(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID + ((MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition - 1) * 2), String.s, -1, #PB_Unicode)
       
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining = (MemorySize.q - (MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition - 1) - Len(String.s))
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = MemorySize.q
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition + Len(String.s)
       
        ProcedureReturn 1
       
      Else
        ProcedureReturn 0
       
      EndIf
     
    EndIf
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Change la Taille (En caractères) d'allocation du StringBuilder avec comme Nom: Nom$ et Taille: Taille.q.
; Attention, si la Taille spécifié est plus petite que celle actuel, la Chaine du StringBuilder à la fin de celui-ci serra alors raccourcir et ainsi, les données serront alors supprimé définitivement.
; Si le Nom est vide ou que celui-ci n'éxiste pas alors la fonction échoura.
; Si la Taille est inférieur ou égale à 0 alors Taille vaudra 1.
; La Taille du StringBuilder est toujours en caractères.
; Renvoie 1 si la Taille du StringBuilder a été changé ou sinon 0.
Procedure.b MyStringBuilderReAllocate(Nom$, Taille.q = 1)
 
  If IsMyStringBuilder(Nom$)
   
    If Taille.q <= 0
      Taille.q = 1
    EndIf
   
    AncienneTaille.q = MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) / 2
    AncienneTaille.q - 1
   
    *MyStringBuilderMemoryID = ReAllocateMemory(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID, StringByteLength(Space(Taille.q + 1)))
   
    If *MyStringBuilderMemoryID
     
      PokeS(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID + StringByteLength(Space(Taille.q)), Chr(#Null), -1, #PB_Unicode)
     
      MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID = *MyStringBuilderMemoryID
      MemorySize.q = (MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID)) / 2
      MemorySize.q - 1
     
      TailleActuel.q = AncienneTaille.q
      NouvelleTaille.q = Taille.q
      Restant.q = MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining
     
      If TailleActuel.q > NouvelleTaille.q
       
        Difference.q = TailleActuel.q - NouvelleTaille.q
        Restant.q - Difference.q
       
        If Restant.q < 0
          MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition + Restant.q
          Restant.q = 0
        EndIf
       
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining = Restant.q
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = Taille.q
       
      ElseIf NouvelleTaille.q > TailleActuel.q
       
        Difference.q = NouvelleTaille.q - TailleActuel.q
        Restant.q + Difference.q
       
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining  = Restant.q
        MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = Taille.q
       
      EndIf
     
      ProcedureReturn 1
     
    Else
      ProcedureReturn 0
     
    EndIf
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Efface entièrement le StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction échoura.
; Seule la Chaine du StringBuilder est éffacé, ça taille restera quand à elle inchangé, ceci ne supprime pas le StringBuilder.
; Renvoie 1 si le StringBuilder a été éffacé ou sinon 0.
Procedure.b MyStringBuilderClearString(Nom$)
 
  If IsMyStringBuilder(Nom$)
   
    MemorySize.q = MemorySize(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID) / 2
    MemorySize.q - 1
   
    FillMemory(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID, MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize, #Null , #PB_Unicode)
   
    MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining = MemorySize.q
    MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize = MemorySize.q
    MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition = 1
   
    ProcedureReturn 1
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Supprime le StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction échoura.
; Attention, toutes les données du StringBuilder serront définitivement supprimé !
; Renvoie 1 si le StringBuilder a été supprimé ou sinon 0.
Procedure.b MyStringBuilderDeletteElement(Nom$)
 
  If IsMyStringBuilder(Nom$)
    DeleteMapElement(MapMyStringBuilder(), Nom$)
    ProcedureReturn 1
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Renvoie la partie de la chaine désiré du StringBuilder avec comme Nom: Nom$.
; La Position de Depart commance à 1, si celle-ci est inférieur ou égale à 0 alors celle-ci vaudra 1.
; Si la Position de Depart est supérieur à la longueur de la chaine actuellement stoqué dans le StringBuilder, alors celle-ci vaudra la longueur de la chaine actuellement stoqué dans le StringBuilder.
; La Longueur commance à 1, si celle-ci est inférieur à -1 alors celle-ci vaudra -1.
; Si la Longueur vaud -1 alors toutes la chaine stoqué dans le StringBuilder serra renvoyé.
; Si la Longueur est supérieur à la longueur de la chaine actuellement stoqué dans le StringBuilder, alors celle-ci vaudra la longueur de la chaine actuellement stoqué dans le StringBuilder.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction renvéra une chaine vide.
Procedure.s MyStringBuilderGetString(Nom$, PositionDepart.q = 1, Longueur.q = -1)
 
  If IsMyStringBuilder(Nom$)
   
    If PositionDepart.q <= 1
      PositionDepart.q = 1
    EndIf
   
    If PositionDepart.q > MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize
      PositionDepart.q = MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize
    EndIf
   
    If Longueur.q < -1
      Longueur.q = -1
    EndIf
   
    If Longueur.q > MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize
      Longueur.q = (MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize)
    EndIf
   
    ProcedureReturn PeekS(MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID + ((PositionDepart.q - 1) * 2), Longueur.q, #PB_Unicode)
   
  Else
    ProcedureReturn ""
   
  EndIf
 
EndProcedure

; Renvoie l'adresse mémoire ou est stoqué la chaine dans le StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction renvéra 0.
Procedure.i MyStringBuilderGetMemoryID(Nom$)
 
  If IsMyStringBuilder(Nom$)
    ProcedureReturn MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderMemoryID
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Renvoie la Taille en caractères du StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction renvéra 0.
Procedure.i MyStringBuilderGetSize(Nom$)
 
  If IsMyStringBuilder(Nom$)
    ProcedureReturn MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderSize
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Renvoie l'espace restant en caractères du StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction renvéra 0.
Procedure.i MyStringBuilderGetRemaining(Nom$)
 
  If IsMyStringBuilder(Nom$)
    ProcedureReturn MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderRemaining
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

; Renvoie la Position en caractères du StringBuilder avec comme Nom: Nom$.
; Si le Nom est vide ou que celui-ci n'existe pas alors la fonction renvéra 0.
Procedure.i MyStringBuilderGetPosition(Nom$)
 
  If IsMyStringBuilder(Nom$)
    ProcedureReturn MapMyStringBuilder.StructureMyStringBuilder(Nom$)\MyStringBuilderPosition
   
  Else
    ProcedureReturn 0
   
  EndIf
 
EndProcedure

Chaine$ = "Abcdefghijklmnopqrstuvwxyz"
Chaine2$ = ""
MyStringBuilderName$ = "MyStringBuilder n°"

Time1 = ElapsedMilliseconds()

For I = 1 To 99
 
  If CreateAndInitialiseMyStringBuilder(MyStringBuilderName$ + Str(I), 1)
   
    If IsMyStringBuilder(MyStringBuilderName$ + Str(I))
     
      ;       MessageRequester("StringBuilder initialisation...", "StringBuilder Name = " + MyStringBuilderName$ + Str(I) + Chr(13) + Chr(10) +
      ;                                                           "StringBuilder MemoryID = " + Str(MyStringBuilderGetMemoryID(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                           "StringBuilder Memory Size = " + Str(MyStringBuilderGetSize(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                           "StringBuilder Memory Remaining = " + Str(MyStringBuilderGetRemaining(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                           "StringBuilder Memory Position = " + Str(MyStringBuilderGetPosition(MyStringBuilderName$ + Str(I))))
     
      ; Time1 = ElapsedMilliseconds()
     
      For J = 1 To 255
       
        Write.b = MyStringBuilderAddString(MyStringBuilderName$ + Str(I), Str(I) + Chaine$ + Str(J))
        MemoryID.q = MyStringBuilderGetMemoryID(MyStringBuilderName$ + Str(I))
        MemorySize.q = MyStringBuilderGetSize(MyStringBuilderName$ + Str(I))
        MemoryRemaining.q = MyStringBuilderGetRemaining(MyStringBuilderName$ + Str(I))
        MemoryPosition.q = MyStringBuilderGetPosition(MyStringBuilderName$ + Str(I))
       
        ;     
        ;     Debug "MemoryID: " + Str(MemoryID.q)
        ;     Debug "MemorySize: " + Str(MemorySize.q)
        ;     Debug "MemoryRemaining: " + Str(MemoryRemaining.q)
        ;     Debug "MemoryPosition: " + Str(MemoryPosition.q)
        ;     Debug "Write: " + Str(Write.b)
        ;     Debug "---------------------------"
        ;     
      Next
     
      ; Time2 = ElapsedMilliseconds()
     
      ;       MessageRequester("StringBuilder Résultat...", "StringBuilder Name = " + MyStringBuilderName$ + Str(I) + Chr(13) + Chr(10) +
      ;                                                     "StringBuilder MemoryID = " + Str(MyStringBuilderGetMemoryID(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                     "StringBuilder Memory Size = " + Str(MyStringBuilderGetSize(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                     "StringBuilder Memory Remaining = " + Str(MyStringBuilderGetRemaining(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                     "StringBuilder Memory Position = " + Str(MyStringBuilderGetPosition(MyStringBuilderName$ + Str(I))) + Chr(13) + Chr(10) +
      ;                                                     "Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
     
     
    Else
      MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'est pas initialisé !", 16)
     
    EndIf
   
  Else
    MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'a pas put être crée !", 16)
   
  EndIf
 
Next

Time2 = ElapsedMilliseconds()

For i = 1 To 99
  Debug MyStringBuilderName$ + Str(I) + " = " + MyStringBuilderGetString(MyStringBuilderName$ + Str(I))
  Debug "----------"
Next

Debug "Time Elapsed = " + Str(Time2 - Time1) + " Ms."

Time1 = ElapsedMilliseconds()

; Juste 5000 au lieux des 255 * 99 = 25245
; Mettez 25245 pour voir le temps réel
For J = 1 To 5000
  Chaine2$ + Str(I) + Chaine$ + Str(J)
Next

Time2 = ElapsedMilliseconds()

Debug "Time Elapsed = " + Str(Time2 - Time1) + " Ms."

; ---------------------------------------------------------------------------------Exemple 2:---------------------------------------------------------------------------------------------------------------------------------------------------

; Chaine$ = "Abcdefghijklmnopqrstuvwxyz"
; Chaine2$ = ""
; MyStringBuilderName$ = "Mon StringBuilder"
;
; Debug "Temps passé avec façon Normale = " + Str(Time2 - Time1) + " Ms."
; Debug "---------------------------------"
;
; Time1 = ElapsedMilliseconds()
;
; If CreateAndInitialiseMyStringBuilder(MyStringBuilderName$)
;   
;   If IsMyStringBuilder(MyStringBuilderName$)
;     
;     For I = 1 To 10000
;       MyStringBuilderAddString(MyStringBuilderName$, Chaine$ + Str(I))
;       
;     Next
;     
;   Else
;     MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'est pas initialisé !", 16)
;     
;   EndIf
;   
; Else
;   MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'a pas put être crée !", 16)
;   
; EndIf
;
; Time2 = ElapsedMilliseconds()
;
; Debug MyStringBuilderGetString(MyStringBuilderName$)
; Debug "Temps passé avec StringBuilder = " + Str(Time2 - Time1) + " Ms."
; Debug "---------------------------------"
;
; Time1 = ElapsedMilliseconds()
;
; ; Juste 5000 au lieux des 255 * 99 = 25245
; ; Mettez 25245 pour voir le temps réel
; For J = 1 To 5000
;   Chaine2$ + Str(I) + Chaine$ + Str(J)
; Next
;
; Time2 = ElapsedMilliseconds()
;
; Debug "Time Elapsed = " + Str(Time2 - Time1) + " Ms."
;
; MessageRequester("Temps", "Temps passé avec StringBuilder = " + Str(Time2 - Time1) + " Ms.", 64)
;
; ---------------------------------------------------------------------------------Exemple 3:---------------------------------------------------------------------------------------------------------------------------------------------------

; Chaine$ = "Abcdefghijklmnopqrstuvwxyz"
; Chaine2$ = ""
; MyStringBuilderName$ = "Mon StringBuilder"
; ;
; ; Time1 = ElapsedMilliseconds()
; ;
; ; For J = 1 To 10000
; ;   Chaine2$ + Str(I) + Chaine$ + Str(J)
; ; Next
; ;
; ; Time2 = ElapsedMilliseconds()
; ;
; ; Debug Chaine2$
; ; Debug "Temps passé avec façon normale = " + Str(Time2 - Time1) + " Ms."
; ; Debug "---------------------------------"
;
; Time1 = ElapsedMilliseconds()
;
; If CreateAndInitialiseMyStringBuilder(MyStringBuilderName$, 100000000)
;   
;   If IsMyStringBuilder(MyStringBuilderName$)
;     
;     For I = 1 To 1000000
;       MyStringBuilderAddString(MyStringBuilderName$, Chaine$ + Str(I))
;       
;     Next
;     
;   Else
;     MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'est pas initialisé !", 16)
;     
;   EndIf
;   
; Else
;   MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder: " + MyStringBuilderName$ + Str(I) + ", n'a pas put être crée !", 16)
;   
; EndIf
;
; Time2 = ElapsedMilliseconds()
;
; Debug MyStringBuilderGetString(MyStringBuilderName$)
; Debug "Temps passé avec StringBuilder = " + Str(Time2 - Time1) + " Ms."
; Debug "---------------------------------"
;
; MessageRequester("Temps", "Temps passé avec StringBuilder = " + Str(Time2 - Time1) + " Ms.", 64)

Auteur:  Shadow [ Sam 09/Fév/2019 21:05 ]
Sujet du message:  Re: StringBuilder

Le premier code est utilisable grâce à des index de tableau, un peu chiant à utiliser.
Le Second code est utilisable grâce à un simple nom, le nom du StringBuilder.

De cette façon, vous pouvez en créer autant que vous le souhaitez, à été tester
mais pas à font, mais suffisamment pour le mettre ici.

Auteur:  SPH [ Dim 10/Fév/2019 17:00 ]
Sujet du message:  Re: StringBuilder

Shadow a écrit:
... à été tester
mais pas à font, mais suffisamment pour le mettre ici.

:lol:

haaaa, sacré Shadow :!: :mrgreen:

Auteur:  Shadow [ Dim 10/Fév/2019 18:02 ]
Sujet du message:  Re: StringBuilder

Dernier code mis à jour, corrigés les bugs, test plus en profondeur + ajout description.
Le deuxième code est obsolète, je le laisse juste à titre de musé.

Page 3 sur 3 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/