[PD-cvs] externals/clr/pd Atom.cs, 1.5, 1.6 PureData.cs, 1.2, 1.3 pd.csproj, 1.2, 1.3

Thomas Grill xovo at users.sourceforge.net
Mon Mar 6 01:35:42 CET 2006


Update of /cvsroot/pure-data/externals/clr/pd
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28852/clr/pd

Modified Files:
	Atom.cs PureData.cs pd.csproj 
Log Message:
many improvements:
- efficient symbol and atom list handling
- better control over function arguments

Index: PureData.cs
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/pd/PureData.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** PureData.cs	28 Jan 2006 10:36:25 -0000	1.2
--- PureData.cs	6 Mar 2006 00:35:40 -0000	1.3
***************
*** 1,9 ****
  using System;
  using System.Runtime.CompilerServices; // for extern import
  
  namespace PureData
  {
      // PD core functions
!     public class Core 
      {
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
--- 1,10 ----
  using System;
  using System.Runtime.CompilerServices; // for extern import
+ using System.Runtime.InteropServices; // for structures
  
  namespace PureData
  {
      // PD core functions
!     public unsafe class Core 
      {
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
***************
*** 20,35 ****
  
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
!         public extern static IntPtr GenSym(string sym);        
  
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
!         public extern static string EvalSym(Symbol sym);        
      }
      
      // This is the base class for a PD/CLR external
!     public class External
          : Core
      {
!         private readonly IntPtr ptr;
!         
          protected virtual void MethodBang() { Post("No bang handler"); }
  
--- 21,37 ----
  
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
!         internal extern static void *SymGen(string sym);        
  
          [MethodImplAttribute (MethodImplOptions.InternalCall)]
!         internal extern static string SymEval(void *sym);        
      }
      
      // This is the base class for a PD/CLR external
!     public unsafe class External
          : Core
      {
!         // PD object pointer
!         private readonly void *ptr;
! 
          protected virtual void MethodBang() { Post("No bang handler"); }
  
***************
*** 40,46 ****
          protected virtual void MethodPointer(Pointer p) { Post("No pointer handler");}
  
!         protected virtual void MethodList(Atom[] lst) { Post("No list handler"); }
  
!         protected virtual void MethodAnything(Atom[] lst) { Post("No list handler"); }
      }
  }
--- 42,48 ----
          protected virtual void MethodPointer(Pointer p) { Post("No pointer handler");}
  
!         protected virtual void MethodList(AtomList lst) { Post("No list handler"); }
  
!         protected virtual void MethodAnything(Symbol tag,AtomList lst) { Post("No anything handler"); }
      }
  }

Index: pd.csproj
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/pd/pd.csproj,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** pd.csproj	27 Jan 2006 22:50:00 -0000	1.2
--- pd.csproj	6 Mar 2006 00:35:40 -0000	1.3
***************
*** 1,105 ****
! <VisualStudioProject>
!     <CSHARP
!         ProjectType = "Local"
!         ProductVersion = "7.10.3077"
!         SchemaVersion = "2.0"
!         ProjectGuid = "{FFBC9D2E-1FB7-4E82-B5DC-46B31F8A58A2}"
!     >
!         <Build>
!             <Settings
!                 ApplicationIcon = ""
!                 AssemblyKeyContainerName = ""
!                 AssemblyName = "PureData"
!                 AssemblyOriginatorKeyFile = ""
!                 DefaultClientScript = "JScript"
!                 DefaultHTMLPageLayout = "Grid"
!                 DefaultTargetSchema = "IE50"
!                 DelaySign = "false"
!                 OutputType = "Library"
!                 PreBuildEvent = ""
!                 PostBuildEvent = ""
!                 RootNamespace = "PureData"
!                 RunPostBuildEvent = "OnBuildSuccess"
!                 StartupObject = ""
!             >
!                 <Config
!                     Name = "Debug"
!                     AllowUnsafeBlocks = "false"
!                     BaseAddress = "285212672"
!                     CheckForOverflowUnderflow = "false"
!                     ConfigurationOverrideFile = ""
!                     DefineConstants = "DEBUG;TRACE"
!                     DocumentationFile = ""
!                     DebugSymbols = "true"
!                     FileAlignment = "4096"
!                     IncrementalBuild = "false"
!                     NoStdLib = "false"
!                     NoWarn = ""
!                     Optimize = "false"
!                     OutputPath = "..\"
!                     RegisterForComInterop = "false"
!                     RemoveIntegerChecks = "false"
!                     TreatWarningsAsErrors = "false"
!                     WarningLevel = "4"
!                 />
!                 <Config
!                     Name = "Release"
!                     AllowUnsafeBlocks = "false"
!                     BaseAddress = "285212672"
!                     CheckForOverflowUnderflow = "false"
!                     ConfigurationOverrideFile = ""
!                     DefineConstants = "TRACE"
!                     DocumentationFile = ""
!                     DebugSymbols = "false"
!                     FileAlignment = "4096"
!                     IncrementalBuild = "false"
!                     NoStdLib = "false"
!                     NoWarn = ""
!                     Optimize = "true"
!                     OutputPath = "bin\Release\"
!                     RegisterForComInterop = "false"
!                     RemoveIntegerChecks = "false"
!                     TreatWarningsAsErrors = "false"
!                     WarningLevel = "4"
!                 />
!             </Settings>
!             <References>
!                 <Reference
!                     Name = "System"
!                     AssemblyName = "System"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
!                 />
!                 <Reference
!                     Name = "System.Data"
!                     AssemblyName = "System.Data"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
!                 />
!                 <Reference
!                     Name = "System.XML"
!                     AssemblyName = "System.Xml"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
!                 />
!             </References>
!         </Build>
!         <Files>
!             <Include>
!                 <File
!                     RelPath = "AssemblyInfo.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!                 <File
!                     RelPath = "Atom.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!                 <File
!                     RelPath = "PureData.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!             </Include>
!         </Files>
!     </CSHARP>
! </VisualStudioProject>
! 
--- 1,105 ----
! <VisualStudioProject>
!     <CSHARP
!         ProjectType = "Local"
!         ProductVersion = "7.10.3077"
!         SchemaVersion = "2.0"
!         ProjectGuid = "{FFBC9D2E-1FB7-4E82-B5DC-46B31F8A58A2}"
!     >
!         <Build>
!             <Settings
!                 ApplicationIcon = ""
!                 AssemblyKeyContainerName = ""
!                 AssemblyName = "PureData"
!                 AssemblyOriginatorKeyFile = ""
!                 DefaultClientScript = "JScript"
!                 DefaultHTMLPageLayout = "Grid"
!                 DefaultTargetSchema = "IE50"
!                 DelaySign = "false"
!                 OutputType = "Library"
!                 PreBuildEvent = ""
!                 PostBuildEvent = ""
!                 RootNamespace = "PureData"
!                 RunPostBuildEvent = "OnBuildSuccess"
!                 StartupObject = ""
!             >
!                 <Config
!                     Name = "Debug"
!                     AllowUnsafeBlocks = "true"
!                     BaseAddress = "285212672"
!                     CheckForOverflowUnderflow = "false"
!                     ConfigurationOverrideFile = ""
!                     DefineConstants = "DEBUG;TRACE"
!                     DocumentationFile = ""
!                     DebugSymbols = "true"
!                     FileAlignment = "4096"
!                     IncrementalBuild = "false"
!                     NoStdLib = "false"
!                     NoWarn = ""
!                     Optimize = "false"
!                     OutputPath = "..\"
!                     RegisterForComInterop = "false"
!                     RemoveIntegerChecks = "false"
!                     TreatWarningsAsErrors = "false"
!                     WarningLevel = "4"
!                 />
!                 <Config
!                     Name = "Release"
!                     AllowUnsafeBlocks = "true"
!                     BaseAddress = "285212672"
!                     CheckForOverflowUnderflow = "false"
!                     ConfigurationOverrideFile = ""
!                     DefineConstants = "TRACE"
!                     DocumentationFile = ""
!                     DebugSymbols = "false"
!                     FileAlignment = "4096"
!                     IncrementalBuild = "false"
!                     NoStdLib = "false"
!                     NoWarn = ""
!                     Optimize = "true"
!                     OutputPath = "bin\Release\"
!                     RegisterForComInterop = "false"
!                     RemoveIntegerChecks = "false"
!                     TreatWarningsAsErrors = "false"
!                     WarningLevel = "4"
!                 />
!             </Settings>
!             <References>
!                 <Reference
!                     Name = "System"
!                     AssemblyName = "System"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
!                 />
!                 <Reference
!                     Name = "System.Data"
!                     AssemblyName = "System.Data"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
!                 />
!                 <Reference
!                     Name = "System.XML"
!                     AssemblyName = "System.Xml"
!                     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
!                 />
!             </References>
!         </Build>
!         <Files>
!             <Include>
!                 <File
!                     RelPath = "AssemblyInfo.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!                 <File
!                     RelPath = "Atom.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!                 <File
!                     RelPath = "PureData.cs"
!                     SubType = "Code"
!                     BuildAction = "Compile"
!                 />
!             </Include>
!         </Files>
!     </CSHARP>
! </VisualStudioProject>
! 

Index: Atom.cs
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/pd/Atom.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** Atom.cs	28 Jan 2006 10:36:25 -0000	1.5
--- Atom.cs	6 Mar 2006 00:35:40 -0000	1.6
***************
*** 1,61 ****
  using System;
  using System.Runtime.InteropServices; // for structures
  
  namespace PureData
  {
- 	public enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3};
- 
      [StructLayout (LayoutKind.Sequential)]
!     sealed public class Symbol
      {
!         // this should NOT be public
!         readonly private IntPtr ptr;
!         
!         public Symbol(IntPtr p)
!         {
!             ptr = p;
!         }
! 
!         public Symbol(Symbol s)
!         {
!             ptr = s.ptr;
!         }
  
          public Symbol(string s)
          {
!             ptr = Core.GenSym(s);
          }
!         
!         override public string ToString()
          {
!             return Core.EvalSym(this);
          }
      }
  
      [StructLayout (LayoutKind.Sequential)]
!     sealed public class Pointer
      {
!         public IntPtr ptr;
!     }
  
!     [StructLayout (LayoutKind.Explicit)]
!     public struct Word
!     {
!         [FieldOffset(0)] public float w_float;
!         [FieldOffset(0)] public Symbol w_symbol;
!         [FieldOffset(0)] public Pointer w_pointer;
      }
  
-     //[StructLayout (LayoutKind.Explicit)]
  	[StructLayout (LayoutKind.Sequential)]
! 	sealed public class Atom 
  	{
! 	
! 		public AtomType type;
! 		public Word word;
  		
  		public Atom(float f)
  		{
  			type = AtomType.Float;
  			word.w_float = f;
  		}
--- 1,62 ----
  using System;
  using System.Runtime.InteropServices; // for structures
+ using System.Collections;
+ #if NET_2_0
+ using System.Collections.Generic;
+ #endif
  
  namespace PureData
  {
      [StructLayout (LayoutKind.Sequential)]
!     public unsafe struct Symbol
      {
!         // this should NOT be public (or at least read only)
!         private readonly void *sym;
  
          public Symbol(string s)
          {
!             sym = Core.SymGen(s);
          }
! 
!         public override string ToString()
          {
!             return Core.SymEval(sym);
          }
      }
  
      [StructLayout (LayoutKind.Sequential)]
!     public unsafe struct Pointer
      {
!         private readonly void *ptr;
  
!         public override string ToString()
!         {
!             if(sizeof(void *) == 4)
!                 return ((int)ptr).ToString();
!             else
!                 return ((long)ptr).ToString();
!         }
      }
  
  	[StructLayout (LayoutKind.Sequential)]
! 	public unsafe struct Atom 
  	{
!         private enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3};
!         
!         [StructLayout (LayoutKind.Explicit)]
!         private struct Word
!         {
!             [FieldOffset(0)] public float w_float;
!             [FieldOffset(0)] public Symbol w_sym;
!             [FieldOffset(0)] public Pointer w_ptr;
!         }
! 
! 		private AtomType type;
! 		private Word word;
  		
  		public Atom(float f)
  		{
  			type = AtomType.Float;
+ 			word = new Word();
  			word.w_float = f;
  		}
***************
*** 64,67 ****
--- 65,69 ----
  		{
              type = AtomType.Float;
+             word = new Word();
              word.w_float = (float)i;
          }
***************
*** 70,74 ****
          {
              type = AtomType.Symbol;
!             word.w_symbol = s;
          }
          
--- 72,77 ----
          {
              type = AtomType.Symbol;
!             word = new Word();
!             word.w_sym = s;
          }
          
***************
*** 76,104 ****
  		{
              type = AtomType.Symbol;
!             word.w_symbol = new Symbol(s);
  		}
! 	}
! 	
  	
! 	// this struct is relative to this c struct, see clr.c
  
! 	/*
! 		// simplyfied atom
! 		typedef struct atom_simple atom_simple;
! 		typedef enum
! 		{
! 			A_S_NULL=0,
! 			A_S_FLOAT=1,
! 			A_S_SYMBOL=2,
! 		}  t_atomtype_simple;
! 		typedef struct atom_simple
! 		{
! 			t_atomtype_simple a_type;
! 			union{
! 				float float_value;
! 				MonoString *string_value;
! 			} stuff;
! 		};
! 		*/
  
! }
\ No newline at end of file
--- 79,270 ----
  		{
              type = AtomType.Symbol;
!             word = new Word();
!             word.w_sym = new Symbol(s);
  		}
! 
!         public Atom(Pointer p)
!         {
!             type = AtomType.Pointer;
!             word = new Word();
!             word.w_ptr = p;
!         }
! 
!         public bool IsFloat { get { return type == AtomType.Float; } }
!         public bool IsSymbol { get { return type == AtomType.Symbol; } }
!         public bool IsPointer { get { return type == AtomType.Pointer; } }
! 
!         public float ToFloat()
!         {
!             if(IsFloat)
!                 return word.w_float;
!             else
!                 throw new System.InvalidCastException("Can't be cast to float.");
!         }
!         
!         public Symbol ToSymbol()
!         {
!             if(IsSymbol)
!                 return word.w_sym;
!             else
!                 throw new System.InvalidCastException("Can't be cast to Symbol.");
!         }
!         
!         public Pointer ToPointer()
!         {
!             if(IsPointer)
!                 return word.w_ptr;
!             else
!                 throw new System.InvalidCastException("Can't be cast to Pointer.");
!         }
!         
!         override public string ToString()
!         {
!             if(IsFloat)
!                 return word.w_float.ToString();
!             else if(IsSymbol)
!                 return word.w_sym.ToString();
!             else if(IsPointer)
!                 return word.w_ptr.ToString();
!             else
!                 // should never happen
!                 throw new System.InvalidProgramException("Internal error.");
!         }
! 
!         public static explicit operator float(Atom a)
!         {
!             return a.ToFloat();
!         }
! 
!         public static explicit operator Symbol(Atom a)
!         {
!             return a.ToSymbol();
!         }
! 
!         public static explicit operator Pointer(Atom a)
!         {
!             return a.ToPointer();
!         }
!     }
  	
!     public class AtomListEnum
!         : IEnumerator
!     {
!         public AtomList list;
  
!         // Enumerators are positioned before the first element
!         // until the first MoveNext() call.
!         int position = -1;
  
!         public AtomListEnum(AtomList l)
!         {
!             list = l;
!         }
! 
!         public bool MoveNext()
!         {
!             return ++position < list.Count;
!         }
! 
!         public void Reset()
!         {
!             position = -1;
!         }
! 
!         public object Current
!         {
!             get
!             {
!                 try
!                 {
!                     return list[position];
!                 }
!                 catch (IndexOutOfRangeException)
!                 {
!                     throw new InvalidOperationException();
!                 }
!             }
!         }
!     }
! 
! 
!     // attention: this is dangerous, because we could do the following
!     // AtomList l2 = l;  
!     // with l also being an AtomList... the two private memebers will get copied, although atoms is only a temporary reference
! 
!     [StructLayout (LayoutKind.Sequential)]
!     unsafe public struct AtomList
! #if NET_2_0
! 		: ICollection<Atom>
! #else
!         : ICollection
! #endif
!     {
!         private readonly int len;
!         private readonly Atom *atoms;
!         
!         public int Count { get { return len; } }
! #if NET_2_0
!         public bool IsReadOnly { get { return false; } } // member of generic.ICollection<Atom> (C# 2.0)
! #endif        
!         public bool IsSynchronized { get { return false; } }
!         public Object SyncRoot { get { return null; } }
! 
!         // protect this from being used
!         private AtomList(AtomList a) { len = 0; atoms = null; }
! 
! #if NET_2_0
!         public void CopyTo(Atom[] array,int start)
! #else        
!         public void CopyTo(Array array,int start)
! #endif        
!         {
!             if(len > array.GetUpperBound(0)+1-start)
!                 throw new System.ArgumentException("Destination array is not long enough.");
!             int i;                
!             for(i = 0; i < len-start; ++i)
!                 array.SetValue(atoms[start+i],i);
!         }
! 
!         public IEnumerator GetEnumerator()
!         {
!             return new AtomListEnum(this);
!         }
!         
!         public Atom this[int i]
!         {
!             get
!             {
!                 if(i < 0 || i >= len)
!                     throw new System.IndexOutOfRangeException("Index outside array bounds.");
!                 return atoms[i];
!             }
!             set
!             {
!                 if(i < 0 || i >= len)
!                     throw new System.IndexOutOfRangeException("Index outside array bounds.");
!                 atoms[i] = value;
!             }
!         }
! 
! #if !NET_2_0
!         public static explicit operator Atom[](AtomList l)
!         {
!             Atom[] ret = new Atom[l.Count];
!             int i;
!             for(i = 0; i < l.Count; ++i) ret[i] = l.atoms[i];
!             return ret;
!         }
! #endif        
! 
!         override public string ToString()
!         {
!             string n = "{";
!             if(len > 0) {
!                 int i;
!                 for(i = 0; i < len-1; ++i) n += atoms[i].ToString()+",";
!                 n += atoms[i].ToString();
!             }
!             return n+"}";
!         }
!     }	
! }





More information about the Pd-cvs mailing list