Update to the latest IKVM.Reflection
[mono.git] / mcs / class / IKVM.Reflection / Emit / CustomModifiersBuilder.cs
diff --git a/mcs/class/IKVM.Reflection/Emit/CustomModifiersBuilder.cs b/mcs/class/IKVM.Reflection/Emit/CustomModifiersBuilder.cs
new file mode 100644 (file)
index 0000000..91f5b83
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+  Copyright (C) 2011 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen@frijters.net
+  
+*/
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace IKVM.Reflection.Emit
+{
+       public sealed class CustomModifiersBuilder
+       {
+               private readonly List<Item> list = new List<Item>();
+
+               internal struct Item
+               {
+                       internal Type type;
+                       internal bool required;
+               }
+
+               public void AddRequired(Type type)
+               {
+                       Item item;
+                       item.type = type;
+                       item.required = true;
+                       list.Add(item);
+               }
+
+               public void AddOptional(Type type)
+               {
+                       Item item;
+                       item.type = type;
+                       item.required = false;
+                       list.Add(item);
+               }
+
+               // this adds the custom modifiers in the same order as the normal SRE APIs
+               // (the advantage over using the SRE APIs is that a CustomModifiers object is slightly more efficient,
+               // because unlike the Type arrays it doesn't need to be copied)
+               public void Add(Type[] requiredCustomModifiers, Type[] optionalCustomModifiers)
+               {
+                       foreach (CustomModifiers.Entry entry in CustomModifiers.FromReqOpt(requiredCustomModifiers, optionalCustomModifiers))
+                       {
+                               Item item;
+                               item.type = entry.Type;
+                               item.required = entry.IsRequired;
+                               list.Add(item);
+                       }
+               }
+
+               public CustomModifiers Create()
+               {
+                       return new CustomModifiers(list);
+               }
+       }
+}