コード例 #1
0
        //
        // This is similar to CreateDispenser() except it doesn't constrain the key to be a reference type.
        // As a result, some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenserV <K, V>(DispenserScenario scenario, Func <K, V> factory)
            where K : IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = _dispenserPolicy.GetAlgorithm(scenario);

            Debug.Assert(algorithm != DispenserAlgorithm.ReuseAsLongAsKeyIsAlive,
                         "Use CreateDispenser() if you want to use this algorithm. The key must not be a valuetype.");

            if (algorithm == DispenserAlgorithm.CreateAlways)
            {
                return(new DispenserThatAlwaysCreates <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.ReuseAlways)
            {
                return(new DispenserThatAlwaysReuses <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.ReuseAsLongAsValueIsAlive)
            {
                return(new DispenserThatReusesAsLongAsValueIsAlive <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.LatchesTypeInfoInsideType)
            {
                return((Dispenser <K, V>)(Object)(new DispenserThatLatchesTypeInfosInsideTypes((Func <RuntimeType, RuntimeTypeInfo>)(Object) factory)));
            }

            throw new Exception();
        }
コード例 #2
0
        public override sealed DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
            #if TEST_CODEGEN_OPTIMIZATION
            return DispenserAlgorithm.CreateAlways;
            #else
            switch (scenario)
            {
                // Assembly + NamespaceTypeName to Type
                case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // Assembly refName to Assembly
                case DispenserScenario.AssemblyRefName_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // RuntimeAssembly to CaseInsensitiveTypeDictionary
                case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                    return DispenserAlgorithm.ReuseAlways;

                // Scope definition handle to RuntimeAssembly
                case DispenserScenario.Scope_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                default:
                    return DispenserAlgorithm.CreateAlways;
            }
            #endif //!TEST_CODEGEN_OPTIMIZATION
        }
コード例 #3
0
        public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
#if TEST_CODEGEN_OPTIMIZATION
            return(DispenserAlgorithm.CreateAlways);
#else
            switch (scenario)
            {
            // Assembly + NamespaceTypeName to Type
            case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // Assembly refName to Assembly
            case DispenserScenario.AssemblyRefName_Assembly:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // RuntimeAssembly to CaseInsensitiveTypeDictionary
            case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                return(DispenserAlgorithm.ReuseAlways);

            // Scope definition handle to RuntimeAssembly
            case DispenserScenario.Scope_Assembly:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            default:
                return(DispenserAlgorithm.CreateAlways);
            }
#endif //!TEST_CODEGEN_OPTIMIZATION
        }
コード例 #4
0
        public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
#if TEST_CODEGEN_OPTIMIZATION
            return DispenserAlgorithm.CreateAlways;
#else
            switch (scenario)
            {
                // Type.GetTypeInfo() for Runtime types.
                case DispenserScenario.Type_TypeInfo:
                    return DispenserAlgorithm.LatchesTypeInfoInsideType;

                // Metadata typedef handle to RuntimeTypeInfo
                case DispenserScenario.TypeDef_TypeInfo:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // TypeInfo + Name to EventInfo
                case DispenserScenario.TypeInfoAndName_EventInfo:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // TypeInfo + Name to FieldInfo
                case DispenserScenario.TypeInfoAndName_FieldInfo:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // TypeInfo + Name to MethodInfo
                case DispenserScenario.TypeInfoAndName_MethodInfo:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // TypeInfo + Name to PropertyInfo
                case DispenserScenario.TypeInfoAndName_PropertyInfo:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // Assembly + NamespaceTypeName to Type
                case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // Assembly refName to Assembly
                case DispenserScenario.AssemblyRefName_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // RuntimeAssembly to CaseInsensitiveTypeDictionary
                case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                    return DispenserAlgorithm.ReuseAlways;

                // Scope definition handle to RuntimeAssembly
                case DispenserScenario.Scope_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                default:
                    return DispenserAlgorithm.CreateAlways;
            }
#endif //!TEST_CODEGEN_OPTIMIZATION

        }
コード例 #5
0
ファイル: DefaultDispenserPolicy.cs プロジェクト: rivy/corert
        public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
#if TEST_CODEGEN_OPTIMIZATION
            return(DispenserAlgorithm.CreateAlways);
#else
            switch (scenario)
            {
            // Type.GetTypeInfo() for Runtime types.
            case DispenserScenario.Type_TypeInfo:
                return(DispenserAlgorithm.LatchesTypeInfoInsideType);

            // Metadata typedef handle to RuntimeTypeInfo
            case DispenserScenario.TypeDef_TypeInfo:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // TypeInfo + Name to EventInfo
            case DispenserScenario.TypeInfoAndName_EventInfo:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // TypeInfo + Name to FieldInfo
            case DispenserScenario.TypeInfoAndName_FieldInfo:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // TypeInfo + Name to MethodInfo
            case DispenserScenario.TypeInfoAndName_MethodInfo:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // TypeInfo + Name to PropertyInfo
            case DispenserScenario.TypeInfoAndName_PropertyInfo:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // Assembly + NamespaceTypeName to Type
            case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // Assembly refName to Assembly
            case DispenserScenario.AssemblyRefName_Assembly:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // RuntimeAssembly to CaseInsensitiveTypeDictionary
            case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                return(DispenserAlgorithm.ReuseAlways);

            // Scope definition handle to RuntimeAssembly
            case DispenserScenario.Scope_Assembly:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            default:
                return(DispenserAlgorithm.CreateAlways);
            }
#endif //!TEST_CODEGEN_OPTIMIZATION
        }
コード例 #6
0
ファイル: DispenserFactory.cs プロジェクト: z77ma/runtime
        //
        // Note: If your K is a valuetype, use CreateDispenserV() instead. Some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenser <K, V>(DispenserScenario scenario, Func <K, V> factory)
            where K : class, IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = s_dispenserPolicy.GetAlgorithm(scenario);

            if (algorithm == DispenserAlgorithm.ReuseAsLongAsKeyIsAlive)
            {
                return(new DispenserThatReusesAsLongAsKeyIsAlive <K, V>(factory));
            }
            else
            {
                return(CreateDispenserV <K, V>(scenario, factory));
            }

            throw new Exception();
        }
コード例 #7
0
        public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
            switch (scenario)
            {
                // Assembly + NamespaceTypeName to Type
                case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // Assembly refName to Assembly
                case DispenserScenario.AssemblyRefName_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                // RuntimeAssembly to CaseInsensitiveTypeDictionary
                case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                    return DispenserAlgorithm.ReuseAlways;

                // Scope definition handle to RuntimeAssembly
                case DispenserScenario.Scope_Assembly:
                    return DispenserAlgorithm.ReuseAsLongAsValueIsAlive;

                default:
                    return DispenserAlgorithm.CreateAlways;
            }
        }
コード例 #8
0
        public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario)
        {
            switch (scenario)
            {
            // Assembly + NamespaceTypeName to Type
            case DispenserScenario.AssemblyAndNamespaceTypeName_Type:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // Assembly refName to Assembly
            case DispenserScenario.AssemblyRefName_Assembly:
                return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive);

            // RuntimeAssembly to CaseInsensitiveTypeDictionary
            case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary:
                return(DispenserAlgorithm.ReuseAlways);

            // Scope definition handle to RuntimeAssembly
            case DispenserScenario.Scope_Assembly:
                return(DispenserAlgorithm.ReuseAlways);    // Match policy used for runtime Assembly instances in other runtime flavors.

            default:
                return(DispenserAlgorithm.CreateAlways);
            }
        }
コード例 #9
0
 public abstract DispenserAlgorithm GetAlgorithm(DispenserScenario scenario);
コード例 #10
0
        //
        // Note: If your K is a valuetype, use CreateDispenserV() instead. Some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenser <K, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] V>(DispenserScenario scenario, Func <K, V> factory)
            where K : class, IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = s_dispenserPolicy.GetAlgorithm(scenario);

            if (algorithm == DispenserAlgorithm.ReuseAsLongAsKeyIsAlive)
            {
                return(new DispenserThatReusesAsLongAsKeyIsAlive <K, V>(factory));
            }
            else
            {
                return(CreateDispenserV <K, V>(scenario, factory));
            }

            throw new Exception();
        }
コード例 #11
0
ファイル: DispenserPolicy.cs プロジェクト: tijoytom/corert
 public abstract DispenserAlgorithm GetAlgorithm(DispenserScenario scenario);