The goal of this project is to create a class structure, that is almost similar to Java.
Noteworthy are the collection classes. These allow you to add almost all FreeBASIC datatypes (except Integer - use Long or mdInteger instead) and own types into generic lists and maps.
#Include Once "md/util/mdList.bi"
Type MyClass
Public:
Declare Constructor ()
Declare Constructor (ByVal value As Integer)
Declare Operator Cast() As String
Declare Sub setMyVar (ByVal value As Integer)
Declare Function getMyVar () As Integer
Private:
As Integer myVar
End Type
'must have a default constructor or no explicit constructor at all!
Constructor MyClass ()
End Constructor
Constructor MyClass (ByVal value As Integer)
This.setMyVar(value)
End Constructor
'must implement cast to string for string representation
Operator MyClass.Cast() As String
Return Str(This.myVar)
End Operator
Sub MyClass.setMyVar (ByVal value As Integer)
This.myVar = value
End Sub
Function MyClass.getMyVar () As Integer
Return This.myVar
End Function
'operator for comparision must exist!
Operator = (ByRef lhs As MyClass, ByRef rhs As MyClass) As Integer
Return lhs.getMyVar() = rhs.getMyVar()
End Operator
mdListDeclare(MyClass)
Dim As mdList(MyClass) list
Dim As MyClass foo
foo.setMyVar(0) : list.add(foo)
foo.setMyVar(1) : list.add(foo)
foo.setMyVar(2) : list.add(foo)
foo.setMyVar(3) : list.add(foo)
foo.setMyVar(0) : list.add(foo)
Print "Output 1:"
For i As Integer = 0 To list.size() - 1
Print list.get(i).getMyVar()
Next
Print
Print "Output 2:"
Dim As MyClass element
ForEach(MyClass, element In list)
Print element.getMyVar()
NextEach
Print
Print "Output 3:"
Dim As mdIterator(MyClass) iterator = list.iterator()
While iterator.hasNext()
Print iterator.nex().getMyVar()
Wend
Print
Sleep
mdTypes also has classes for hash codes, logging and database persistence.
>>DOWNLOAD<< (Mirror at FreeBASIC-Portal)
The download contains all types, a lot of examples and a readme with installation instructions. For tutorials and more information check the mirror page.
Last edited by MOD on Oct 22, 2015 18:47, edited 3 times in total.
I get the same two compiler errors with the above example:
.....\FBIDETEMP.bas(34) error 24: Invalid data types in 'mdListDeclare(MyClass)'
.....\FBIDETEMP.bas(34) error 24: Invalid data types in 'mdListDeclare(MyClass)'
I noticed, that I didn't update the code of the first post. MyClass now have a Cast() to String operator. But even without this I would expect an other error than "Invalid data types".
Did you copy the md/ folder into your inc/ folder? And do you have the latest version from the download (currently just the mirror works)?
Could you try the updated example from the first post again or the examples, that are included in the package?
It works out of the box here (fbc 0.90.1/0.91.0).
You could also try to compile with -pp and paste the code somewhere (e.g. pastebin), so I can check the output.
Yes, so it was my fault, because I didn't update the example on this thread. Sorry for that.
The package contains a lot of example codes how to use mdTypes. Every mdType has a link to the Java class/interface, which it represents, at the top of the file, so one can also use the Java documentation on a certain level of usage.
It is great to bypass the problem of dynamic arrays in UDTs and general (+generic) collection of variables and objects.
MOD wrote:Thx. If somebody wants additional information, just ask. I'll extend the tutorial every now and then.
I have a question about this statement in the example given in the mdTypes: DELETE list.get(i)
1) Does this just delete the pointer (set it to nullptr), but does not remove the element from the list? In other words, the count/size of the list stays the same or does the element get removed from the list. I still must use list.remove(i) to remove it from the list?
2) If I want to set the pointer to null or destroy the object it points to, how do I do that with and without removing and changing the size and indexing of the list?
3) What if in my code elsewhere, the pointer is already deallocated and set to null. What happens to the list element? Is it automatically removed from the list when the object to the pointer is released?
'Imports
#INCLUDE ONCE "md/util/mdList.bi"
'Tell FB, that you want to use mdList with String variables - this will expand the intern macro
mdListDeclare(BYTE, PTR)
'Declare a list
DIM AS mdList(BYTE, PTR) list
'Create and add some data
DIM AS BYTE PTR a = NEW BYTE
DIM AS BYTE PTR b = NEW BYTE
*a = 5
*b = 7
list.add(a)
list.add(b)
'Iterate with simple for loop and print out data
FOR i AS INTEGER = 0 TO list.size() - 1
PRINT *list.get(i),
DELETE list.get(i)
NEXT
The thing about the pointer feature of mdTypes' collections api is more flexibility. Usually you would use real objects, not object pointers.
Anyway, to answer your questions:
1. The "Delete" in this line is FreeBASICs Delete Statement. It does only delete the pointers data but doesn't set the pointer to null or change the list in any way. After this action you should not use the pointers data anymore, like with every other deleted pointer. As the example ends after this statement, I've added the line to free the memory, as it should be done by the programmer. If it wouldn't end here, one would need a line to set the pointer to NULL or remove the element from the list (but not while iterating through the list, use a temp list for that!).
2. Well, it's what happens in the example. The pointer ist destroyed but not set to NULL and the list stays unchanged.
3. The list could check if the pointer is NULL but cannot check if it was already destroyed anywhere else (simply not possible, we don't have any kind of garbage collector). However, what should I do when the pointer is NULL? As I said in my first sentence, this feature is about flexibility, so it's up to the programmer how to manipulate the list. If you want automatic freeing of data after leaving the scope, use objects not object pointers.
MOD wrote:The thing about the pointer feature of mdTypes' collections api is more flexibility. Usually you would use real objects, not object pointers.
I am getting many errors trying to compile code that uses the mdTypes, and I must be doing something very wrong.
The errors are like these:
tm_mysql.bas(40) error 41: Variable not declared, tmG_dbList
tm_mysql.bas(43) error 247: Symbol not a CLASS, ENUM, TYPE or UNION type, before '.'
tm_mysql.bas(43) error 3: Expected End-of-Line, found '('
tm_mysql.bas(46) error 41: Variable not declared, tmG_dbListCount
tm_mysql.bas(58) error 41: Variable not declared, tmG_resultList
tm_mysql.bas(61) error 247: Symbol not a CLASS, ENUM, TYPE or UNION type, before
'Imports
#Include Once "mysql\mysql.bi"
#Include Once "windows.bi"
#Include Once "md\util\mdList.bi"
'Tell FB, that you want to use mdList with MYSQL and MYSQL_RES variables - this will expand the intern macro
mdListDeclare(MYSQL, PTR) ' MySQL DB Pointer Type
mdListDeclare(MYSQL_RES, PTR) ' MySQL Results Pointer Type
'Declare a global list
DIM AS mdList(MYSQL, PTR) tmG_dbList
DIM AS mdList(MYSQL_RES, PTR) tmG_resultList
function tm_addDBList (ByVal tp_db as MYSQL ptr) as integer
dim as integer tv_dbID
' Add a MYSQL DB pointer to list
tmG_dbList.Add (tp_db)
' Get the new current size of list - 1; that will be the reference ID returned
tv_dbID = tmG_dbList.Size() - 1
return (tv_dbID)
end function ' tm_addDBList
*list.get(i) = 1 ' Does this set the value to 1 contained at the pointer?
list.set(i) = 2 ' Does this set the value to 2 contained at the pointer?
*list.set(i) = 3 ' Does this set the value to 3 contained at the pointer?
list.get(i) = b ' Does this refer the element to b pointer?
list.get(i) = NULL ' Does this refer the element to a null pointer?
PRINT list.contains(NULL) ' If NULL is contained in any list element, then this prints TRUE
PRINT list.contains(NOT NULL) 'If LIST does not contain all null pointers, then this prints TRUE
'Imports
#INCLUDE ONCE "md/util/mdList.bi"
'Tell FB, that you want to use mdList with String variables - this will expand the intern macro
mdListDeclare(BYTE, PTR)
'Declare a list
DIM AS mdList(BYTE, PTR) list
'Create and add some data
DIM AS BYTE PTR a = NEW BYTE
DIM AS BYTE PTR b = NEW BYTE
*a = 5
*b = 7
list.add(a)
list.add(b)
'Iterate with simple for loop and print out data
FOR i AS INTEGER = 0 TO list.size() - 1
PRINT *list.get(i),
DELETE list.get(i)
NEXT
SLEEP