// ==========================================================================
// This software is subject to the provisions of the Zope Public License,
// Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
// THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
// WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
// FOR A PARTICULAR PURPOSE.
// ==========================================================================
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Collections;
using System.Reflection;
using System.Security;
namespace Python.Runtime {
///
/// This class is responsible for efficiently maintaining the bits
/// of information we need to support aliases with 'nice names'.
///
internal class GenericUtil {
static Dictionary>> mapping;
private GenericUtil() {}
static GenericUtil() {
mapping = new
Dictionary>>();
}
//====================================================================
// Register a generic type that appears in a given namespace.
//====================================================================
internal static void Register(Type t) {
Dictionary> nsmap = null;
mapping.TryGetValue(t.Namespace, out nsmap);
if (nsmap == null) {
nsmap = new Dictionary>();
mapping[t.Namespace] = nsmap;
}
string basename = t.Name;
int tick = basename.IndexOf("`");
if (tick > -1) {
basename = basename.Substring(0, tick);
}
List gnames = null;
nsmap.TryGetValue(basename, out gnames);
if (gnames == null) {
gnames = new List();
nsmap[basename] = gnames;
}
gnames.Add(t.Name);
}
//====================================================================
// xxx
//====================================================================
public static List GetGenericBaseNames(string ns) {
Dictionary> nsmap = null;
mapping.TryGetValue(ns, out nsmap);
if (nsmap == null) {
return null;
}
List names = new List();
foreach (string key in nsmap.Keys) {
names.Add(key);
}
return names;
}
//====================================================================
// xxx
//====================================================================
public static List GenericsForType(Type t) {
Dictionary> nsmap = null;
mapping.TryGetValue(t.Namespace, out nsmap);
if (nsmap == null) {
return null;
}
string basename = t.Name;
int tick = basename.IndexOf("`");
if (tick > -1) {
basename = basename.Substring(0, tick);
}
List names = null;
nsmap.TryGetValue(basename, out names);
if (names == null) {
return null;
}
List result = new List();
foreach (string name in names) {
string qname = t.Namespace + "." + name;
Type o = AssemblyManager.LookupType(qname);
if (o != null) {
result.Add(o);
}
}
return result;
}
//====================================================================
// xxx
//====================================================================
public static string GenericNameForBaseName(string ns, string name) {
Dictionary> nsmap = null;
mapping.TryGetValue(ns, out nsmap);
if (nsmap == null) {
return null;
}
List gnames = null;
nsmap.TryGetValue(name, out gnames);
if (gnames == null) {
return null;
}
if (gnames.Count > 0) {
return gnames[0];
}
return null;
}
}
}