EnumerateConstants() публичный Метод

public EnumerateConstants ( Func action ) : bool
action Func
Результат bool
Пример #1
0
        public static object EachObject(BlockParam block, RubyModule /*!*/ self, [NotNull] RubyClass /*!*/ theClass)
        {
            if (!theClass.HasAncestor(self.Context.ModuleClass))
            {
                throw RubyExceptions.CreateRuntimeError("each_object only supported for objects of type Class or Module");
            }

            if (block == null)
            {
                throw RubyExceptions.NoBlockGiven();
            }

            int matches = 0;
            List <RubyModule>  visitedModules = new List <RubyModule>();
            Stack <RubyModule> pendingModules = new Stack <RubyModule>();

            pendingModules.Push(theClass.Context.ObjectClass);

            while (pendingModules.Count > 0)
            {
                RubyModule next = pendingModules.Pop();
                visitedModules.Add(next);

                if (theClass.Context.IsKindOf(next, theClass))
                {
                    matches++;

                    object result;
                    if (block.Yield(next, out result))
                    {
                        return(result);
                    }
                }

                using (theClass.Context.ClassHierarchyLocker()) {
                    next.EnumerateConstants(delegate(RubyModule module, string name, object value) {
                        RubyModule constAsModule = value as RubyModule;
                        if (constAsModule != null && !visitedModules.Contains(constAsModule))
                        {
                            pendingModules.Push(constAsModule);
                        }
                        return(false);
                    });
                }
            }
            return(matches);
        }
Пример #2
0
        public static RubyArray /*!*/ GetDefinedConstants(RubyModule /*!*/ self, [DefaultParameterValue(true)] bool inherited)
        {
            var result = new RubyArray();

            if (inherited)
            {
                var visited = new Dictionary <string, bool>();

                bool hideGlobalConstants = !self.IsObjectClass;

                using (self.Context.ClassHierarchyLocker()) {
                    self.ForEachConstant(true, delegate(RubyModule /*!*/ module, string name, object value) {
                        if (name == null)
                        {
                            // terminate enumeration when Object is reached
                            return(hideGlobalConstants && module.IsObjectClass);
                        }

                        if (!visited.ContainsKey(name))
                        {
                            if (Tokenizer.IsConstantName(name))
                            {
                                result.Add(self.Context.StringifyIdentifier(name));
                            }
                            visited.Add(name, true);
                        }
                        return(false);
                    });
                }
            }
            else
            {
                using (self.Context.ClassHierarchyLocker()) {
                    self.EnumerateConstants((module, name, value) => {
                        if (Tokenizer.IsConstantName(name))
                        {
                            result.Add(self.Context.StringifyIdentifier(name));
                        }
                        return(false);
                    });
                }
            }
            return(result);
        }
Пример #3
0
        public static object EachObject(BlockParam block, RubyModule /*!*/ self, [NotNull] RubyClass /*!*/ theClass)
        {
            Type classType = theClass.GetType();
            bool isClass   = (classType == typeof(RubyClass));

            if (!isClass && classType != typeof(RubyModule))
            {
                throw new NotSupportedException("each_object only supported for objects of type Class or Module");
            }
            if (block == null)
            {
                throw RubyExceptions.NoBlockGiven();
            }

            Dictionary <RubyModule, object> visited = new Dictionary <RubyModule, object>();
            Stack <RubyModule> modules = new Stack <RubyModule>();

            modules.Push(theClass.Context.ObjectClass);
            while (modules.Count > 0)
            {
                RubyModule next    = modules.Pop();
                RubyClass  asClass = next as RubyClass;

                if (!isClass || asClass != null)
                {
                    object result;
                    if (block.Yield(next, out result))
                    {
                        return(result);
                    }
                }
                next.EnumerateConstants(delegate(RubyModule module, string name, object value) {
                    RubyModule constAsModule = (value as RubyModule);
                    if (constAsModule != null && !visited.ContainsKey(constAsModule))
                    {
                        modules.Push(constAsModule);
                        visited[module] = null;
                    }
                    return(false);
                });
            }
            return(visited.Count);
        }
Пример #4
0
        public static RubyArray/*!*/ GetDefinedConstants(RubyModule/*!*/ self, [DefaultParameterValue(true)]bool inherited) {
            var result = new RubyArray();
            if (inherited) {
                var visited = new Dictionary<string, bool>();

                bool hideGlobalConstants = !self.IsObjectClass;

                using (self.Context.ClassHierarchyLocker()) {
                    self.ForEachConstant(true, delegate(RubyModule/*!*/ module, string name, object value) {
                        if (name == null) {
                            // terminate enumeration when Object is reached
                            return hideGlobalConstants && module.IsObjectClass;
                        }

                        if (!visited.ContainsKey(name)) {
                            if (Tokenizer.IsConstantName(name)) {
                                result.Add(self.Context.StringifyIdentifier(name));
                            }
                            visited.Add(name, true);
                        }
                        return false;
                    });
                }

            } else {
                using (self.Context.ClassHierarchyLocker()) {
                    self.EnumerateConstants((module, name, value) => {
                        if (Tokenizer.IsConstantName(name)) {
                            result.Add(self.Context.StringifyIdentifier(name));
                        }
                        return false;
                    });
                }
            }
            return result;
        }