From a5924bb4140e6eb67cfb00faf55b5ca28a5bb165 Mon Sep 17 00:00:00 2001 From: the_fiddler Date: Sun, 5 Dec 2010 15:26:54 +0000 Subject: [PATCH] * CppSpecWriter.cs: FIxed handling of enum parameters. Moved delegates to private structures. --- Source/Bind/CppSpecWriter.cs | 61 +++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/Source/Bind/CppSpecWriter.cs b/Source/Bind/CppSpecWriter.cs index ab3ed468..9bb2ad02 100644 --- a/Source/Bind/CppSpecWriter.cs +++ b/Source/Bind/CppSpecWriter.cs @@ -84,7 +84,6 @@ namespace Bind sw.WriteLine("struct {0}", Settings.GLClass); sw.WriteLine("{"); sw.Indent(); - WriteDelegates(sw, delegates); WriteWrappers(sw, wrappers, Type.CSTypes); sw.Unindent(); sw.WriteLine("};"); @@ -161,9 +160,9 @@ namespace Bind foreach (var ext in wrappers.Keys) { if (ext == "Core") - sw.WriteLine("{0}::Init()", Settings.GLClass); + sw.WriteLine("{0}::Delegates::Init()", Settings.GLClass); else - sw.WriteLine("{0}::{1}::Init()", Settings.GLClass, ext); + sw.WriteLine("{0}::{1}::Delegates::Init()", Settings.GLClass, ext); sw.WriteLine("{"); sw.Indent(); @@ -199,14 +198,7 @@ namespace Bind public void WriteDelegates(BindStreamWriter sw, DelegateCollection delegates) { - sw.WriteLine("private:"); - - // Avoid multiple definitions of the same function - Delegate last_delegate = null; - foreach (var d in delegates) - { - WriteDelegate(sw, d.Value, ref last_delegate); - } + throw new NotSupportedException(); } static void WriteDelegate(BindStreamWriter sw, Delegate d, ref Delegate last_delegate) @@ -215,7 +207,8 @@ namespace Bind if (d != last_delegate) { last_delegate = d; - sw.WriteLine("typedef {0} (*p{1}){2};", d.ReturnType, d.Name, d.Parameters); + var parameters = d.Parameters.ToString().Replace(".", "::"); + sw.WriteLine("typedef {0} (*p{1}){2};", d.ReturnType, d.Name, parameters); sw.WriteLine("static p{0} {0};", d.Name); } } @@ -226,7 +219,7 @@ namespace Bind public void WriteImports(BindStreamWriter sw, DelegateCollection delegates) { - throw new NotImplementedException(); + throw new NotSupportedException(); } #endregion @@ -236,8 +229,6 @@ namespace Bind public void WriteWrappers(BindStreamWriter sw, FunctionCollection wrappers, Dictionary CSTypes) { - sw.WriteLine("public:"); - foreach (string extension in wrappers.Keys) { if (extension != "Core") @@ -247,8 +238,6 @@ namespace Bind sw.Indent(); } - sw.WriteLine("static void Init();"); - // Avoid multiple definitions of the same function Delegate last_delegate = null; @@ -258,18 +247,36 @@ namespace Bind for (var current = forward_compatible; current != deprecated; current = deprecated) { + // Write delegates last_delegate = null; + + sw.WriteLine("private:"); + sw.WriteLine("struct Delegates"); + sw.WriteLine("{"); + sw.Indent(); + sw.WriteLine("static void Init();"); + foreach (var f in current) + { + WriteDelegate(sw, f.WrappedDelegate, ref last_delegate); + } + sw.Unindent(); + sw.WriteLine("}"); + + // Write wrappers + last_delegate = null; + sw.WriteLine("public:"); foreach (var f in current) { if (last_delegate == f.WrappedDelegate) continue; last_delegate = f.WrappedDelegate; - sw.WriteLine("static inline {0} {1}{2}", f.WrappedDelegate.Parameters, - f.TrimmedName, f.WrappedDelegate.Parameters); + var parameters = f.WrappedDelegate.Parameters.ToString().Replace(".", "::"); + sw.WriteLine("static inline {0} {1}{2}", f.WrappedDelegate.ReturnType, + f.TrimmedName, parameters); sw.WriteLine("{"); sw.Indent(); - //WriteMethodBody(sw, f); + WriteMethodBody(sw, f); sw.Unindent(); sw.WriteLine("}"); } @@ -290,6 +297,14 @@ namespace Bind sw.WriteLine("};"); } + static void WriteMethodBody(BindStreamWriter sw, Function f) + { + if (f.ReturnType != null) + sw.WriteLine("return Delegates::{0}{1}", f.WrappedDelegate.Name, f.CallString()); + else + sw.WriteLine("Delegates::{0}{1}", f.WrappedDelegate.Name, f.CallString()); + } + static DocProcessor processor = new DocProcessor(Path.Combine(Settings.DocPath, Settings.DocFile)); static Dictionary docfiles; void WriteDocumentation(BindStreamWriter sw, Function f) @@ -382,7 +397,11 @@ namespace Bind sw.Indent(); foreach (var c in @enum.ConstantCollection.Values) { - sw.WriteLine("{0},", c); + // C++ doesn't have the concept of "unchecked", so remove this. + if (!c.Unchecked) + sw.WriteLine("{0},", c); + else + sw.WriteLine("{0},", c.ToString().Replace("unchecked", String.Empty)); } sw.Unindent(); sw.WriteLine("};");