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)