March 05, 2021, 06:55:25 AM

Author Topic: [bmx] TFactory Class by Bobysait [ 1+ years ago ]  (Read 510 times)

Offline BlitzBot

[bmx] TFactory Class by Bobysait [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : TFactory Class
Author : Bobysait
Posted : 1+ years ago

Description : Similar to TMap, as it is an extension from TMap
TFactory override the Insert method to rename automatically the keys.

So every entries are single

It can be used to store Brushes/Materials/Textures like TV3D do, and many else.
It is fully "bbDoced" and is coded to be safe for users
-> use of private / public to protect wrong use of the __TFactory__


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. '#region TFactory
  4.        
  5.         '#region Factory Base Type
  6.        
  7.         ' - Protected from user -
  8.                 Private
  9.                
  10.                 Type __TFactory__ extends tmap
  11.                        
  12.                         Field _AutoInc          :Int            =       0
  13.                         Field _Default          :String         =       ""
  14.                         Global _LastName        :String         =       ""
  15.                        
  16.                         ' - generate a valid unique name to insert in a factory hashmap -
  17.                        
  18.                         Method AutoName         :String                 ( Name:String="" )
  19.                                
  20.                                 ' if empty name -> fill it with the default name
  21.                                 If Name="" Then Name = _Default
  22.                                
  23.                                 Local OrigName:String = Name
  24.                                
  25.                                 ' check if the map countais this name
  26.                                 If Not(Contains(Name)) Then If Name<>_Default Then Return Name
  27.                                
  28.                                 Repeat
  29.                                        
  30.                                         Name = OrigName+_AutoInc
  31.                                        
  32.                                         If Not(Contains(Name)) Then Return Name
  33.                                        
  34.                                         _AutoInc :+ 1
  35.                                        
  36.                                         If _AutoInc=0 Then Return ""
  37.                                        
  38.                                 Forever
  39.                                
  40.                                 Return ""
  41.                                
  42.                         End Method
  43.                        
  44.                         Method Insert ( Key:Object,Value:Object )
  45.                                 Insert2 ( String(Key),Value )
  46.                         End Method
  47.                        
  48.                         ' - Insert a new object in the factory -
  49.                        
  50.                         Method Insert2  :String         ( Name:String, obj:Object, autoname:Byte=True )
  51.                                
  52.                                 _LastName = Name
  53.                                
  54.                                 ' no empty name
  55.                                 If Name=""
  56.                                        
  57.                                         If autoname=False Then Return ""
  58.                                        
  59.                                         _LastName = Self.autoname ( Name )
  60.                                        
  61.                                 EndIf
  62.                                
  63.                                 ' no entries with same name
  64.                                 If Contains ( _LastName )
  65.                                        
  66.                                         If autoname=False Then Return ""
  67.                                        
  68.                                         _LastName = Self.autoname ( _LastName )
  69.                                        
  70.                                 EndIf
  71.                                
  72.                                 ' remove old link to the Hack map
  73.                                 Remove ( Name )
  74.                                
  75.                                 ' insert the name in the hash- map
  76.                                 Super.Insert ( _LastName, obj )
  77.                                
  78.                                 Return _LastName
  79.                                
  80.                         End Method
  81.                        
  82.                 End Type
  83.                
  84.         '#end region
  85.        
  86.        
  87.         '#region public Factory
  88.        
  89.         ' - Public factory SDK -
  90.                
  91.                 Public
  92.                
  93.                 Rem
  94.                         bbdoc: TFactory class is an extension of TMap
  95.                         about: TFactory is an extension of TMap, and provide an easy way to deal with "unique" named object
  96.                 EndRem
  97.                 Type TFactory Extends __TFactory__
  98.                        
  99.                         Rem
  100.                                 bbdoc: Create a factory object
  101.                                 about: create a factory with parameters @DefaultName as the defaultname for autonaming and @CounterStart for auto-increment
  102.                         EndRem
  103.                         Function Create :TFactory ( DefaultName:String, CounterStart:Int = 0 )
  104.                                
  105.                                 Local factory:TFactory          =       New TFactory
  106.                                 factory._AutoInc                        =       CounterStart
  107.                                 factory._Default                        =       DefaultName
  108.                                
  109.                                 Return factory
  110.                                
  111.                         End Function
  112.                        
  113.                         Rem
  114.                                 bbdoc: Insert an object in the specified @factory
  115.                                 about: insert an object initialised with the name @Name, the name will then be automaticaly formated to be unique
  116.                                 check the formated name with #FactorylastRegistered
  117.                         endrem
  118.                         Method InsertName               :String         ( Name:String, obj:Object, autoname:Byte=True )
  119.                                 Return Super.Insert2( Name,obj,autoname)
  120.                         End Method
  121.                        
  122.                         Rem
  123.                                 bbdoc: Return the last registered name inserted in the specified @factory
  124.                                 about:
  125.                         endrem
  126.                         Method LastRegistered   :String         ( )
  127.                                 Return _LastName
  128.                         End Method
  129.                        
  130.                 End Type
  131.                
  132.                 Rem
  133.                         bbdoc: Create a factory object
  134.                         about: create a factory with parameters @DefaultName as the defaultname for autonaming and @CounterStart for auto-increment
  135.                 EndRem
  136.                 Function CreateFactory :TFactory( DefaultName:String="", CounterStart:Int = 0 )
  137.                         Return TFactory.Create(DefaultName,CounterStart)
  138.                 End Function
  139.                
  140.                 Rem
  141.                         bbdoc: Insert an object in the specified @factory
  142.                         about: insert an object initialised with the name @Name, the name will then be automaticaly formated to be unique
  143.                         check the formated name with #FactorylastRegistered
  144.                 endrem
  145.                 Function FactoryInsert :String ( Factory:TFactory, Obj:Object, Name :String, autoname:Byte = True )
  146.                         Return Factory.InsertName ( Name, Obj, autoname )
  147.                 End Function
  148.                
  149.                 Rem
  150.                         bbdoc: Return the last registered name inserted in the specified @factory
  151.                         about:
  152.                 endrem
  153.                 Function FactorylastRegistered:String(factory:TFactory)
  154.                         Return factory.LastRegistered()
  155.                 End Function
  156.                
  157.         '#end region
  158.        
  159. '#end region


Comments :


Bobysait(Posted 1+ years ago)

 And here is a small exemple on how to use it
Code: [Select]
' - Sample -

' Create a factory -> default name is "Material_"
Local Myfactory :TFactory = CreateFactory ( "Material_", 0 )

' register some objects ( we'll use string objetcs for this sample )
For Local nb:Int = 1 To 10
' name is automatic
Myfactory.Insertname( "", String(nb) )
' print the automatic registered name
Print Myfactory.LastRegistered()
Next

' get the last name registered -> use the factory as a tmap using LastRegistered() as key
Local Name1:String = String(MyFactory.ValueForKey(MyFactory.LastRegistered()))
Print "Name1="+Name1

' let's try to register an object with an existing name ( "Material_5" should have been registered with the previous instertions )
Local Obj:String="My Obj"
' I can use the TMap method "Insert", as it has been override to match the TFactory SDK
Myfactory.Insert ( "Material_5",Obj)

' Let's get the name registered for "Material_5"
Local RegName:String = FactorylastRegistered( Myfactory )
Local Name2:String = String(MyFactory.ValueForKey(RegName))
Print "Name2="+Name2
Print "Registered name = "+RegName

' delete Factory ^^
Myfactory = Null


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal