And the VB.Net version
Code:
Public NotInheritable Class ObjectToTypedValue
Private Sub New()
End Sub
#Region "Public Converter functions"
' Blank (like returned by princ)
Public Shared Function Convert() As Object
Return New TypedValue(CInt(LispDataType.None))
End Function
' Integers (32 bit or other)
Public Shared Function Convert(value As Integer) As Object
Return New TypedValue(CInt(LispDataType.Text), value)
End Function
' 16 bit integers
Public Shared Function Convert(value As Int16) As Object
Return New TypedValue(CInt(LispDataType.Int16), value)
End Function
' Doubles
Public Shared Function Convert(value As Double) As Object
Return New TypedValue(CInt(LispDataType.[Double]), value)
End Function
' Strings
Public Shared Function Convert(value As String) As Object
Return New TypedValue(CInt(LispDataType.Text), value)
End Function
' Booleans
Public Shared Function Convert(value As Boolean) As Object
If CBool(value) Then
Return New TypedValue(CInt(LispDataType.T_atom))
End If
Return New TypedValue(CInt(LispDataType.Nil))
End Function
' 2d Points
Public Shared Function Convert(value As Point2d) As Object
Return New TypedValue(CInt(LispDataType.Point2d), value)
End Function
' 3d Points
Public Shared Function Convert(value As Point3d) As Object
Return New TypedValue(CInt(LispDataType.Point3d), value)
End Function
' Catch all other objects including null
Public Shared Function Convert(value As Object) As Object
If value Is Nothing Then
Return New TypedValue(CInt(LispDataType.Nil))
End If
If TypeOf value Is IEnumerable Then
Dim rb As New ResultBuffer()
AddToRB(rb, value)
Return rb
End If
Return Convert(TryCast(value, String))
End Function
#End Region
#Region "Private helper functions for enumerable types"
' Unhandled objects in enumerables
Private Shared Sub AddToRB(rb As ResultBuffer, value As Object)
rb.Add(Convert(value))
End Sub
' Tuples to dotted pairs
Private Shared Sub AddToRB(rb As ResultBuffer, value As Tuple(Of Object, Object))
rb.Add(New TypedValue(CInt(LispDataType.DottedPair)))
AddToRB(rb, value.Item1)
AddToRB(rb, value.Item2)
rb.Add(New TypedValue(CInt(LispDataType.ListEnd)))
End Sub
' Dictionary entry to association pair
Private Shared Sub AddToRB(rb As ResultBuffer, value As DictionaryEntry)
Dim en As IEnumerable = TryCast(value.Value, IEnumerable)
If en Is Nothing Then
rb.Add(New TypedValue(CInt(LispDataType.DottedPair)))
AddToRB(rb, value.Key)
AddToRB(rb, value.Value)
Else
rb.Add(New TypedValue(CInt(LispDataType.ListBegin)))
rb.Add(Convert(value.Key))
For Each element As Object In en
AddToRB(rb, element)
Next
End If
rb.Add(New TypedValue(CInt(LispDataType.ListEnd)))
End Sub
' Hash tables to association lists
Private Shared Sub AddToRB(rb As ResultBuffer, value As IDictionary)
rb.Add(New TypedValue(CInt(LispDataType.ListBegin)))
Dim en As IDictionaryEnumerator = value.GetEnumerator()
While en.MoveNext()
AddToRB(rb, en.Current)
End While
rb.Add(New TypedValue(CInt(LispDataType.ListEnd)))
End Sub
' Lists, collections and arrays to Lisp Lists
Private Shared Sub AddToRB(rb As ResultBuffer, value As IEnumerable)
rb.Add(New TypedValue(CInt(LispDataType.ListBegin)))
For Each element As Object In value
AddToRB(rb, element)
Next
rb.Add(New TypedValue(CInt(LispDataType.ListEnd)))
End Sub
#End Region
End Class