コード例 #1
0
ファイル: DisjointSet.cs プロジェクト: pents/DisjointSet
        private SetScope <T> GetScopeRoot(SetScope <T> scope)
        {
            var current = scope;

            while (!current.Value.Equals(current.Parent.Value))
            {
                current = current.Parent;
            }

            return(current);
        }
コード例 #2
0
ファイル: DisjointSet.cs プロジェクト: pents/DisjointSet
        private int GetScopeCount(SetScope <T> scope)
        {
            int index    = 0;
            var curScope = scope;

            while (!curScope.Value.Equals(curScope.Parent.Value))
            {
                curScope = curScope.Parent;
                index++;
            }

            return(index);
        }
コード例 #3
0
        private TypeScope CreateInterfaceCommonType(string name, int offset)
        {
            TypeScope ctn = (TypeScope)members[offset];

            if (ctn != null)
            {
                return(ctn);
            }
            bool in_scope = false;

            if (name != null)
            {
                in_scope = true;
            }
            bool is_interface = br.ReadBoolean();

            if (is_interface)//ïðîïóñêàåì ôëàã - èíòåðôåéñíîñòè
            {
                name = GetString(br.ReadInt32());
            }
            else
            {
                name = br.ReadString();
            }
            //br.ReadInt32();
            //ssyy
            //×èòàåì, ÿâëÿåòñÿ ëè òèï èíòåðôåéñîì
            bool type_is_interface = (br.ReadByte() == 1);

            //×èòàåì, ÿâëÿåòñÿ ëè òèï äåëåãàòîì
            bool type_is_delegate = (br.ReadByte() == 1);
            //\ssyy

            bool type_is_generic_definition = (br.ReadByte() == 1);

            if (type_is_generic_definition)
            {
                throw new Exception();
            }
            TypeScope base_type     = GetTypeReference();
            bool      is_value_type = br.ReadBoolean();

            //ssyy
            //×èòàåì ïîääåðæèâàåìûå èíòåðôåéñû
            int interf_count            = br.ReadInt32();
            List <TypeScope> interfaces = new List <TypeScope>();

            for (int i = 0; i < interf_count; i++)
            {
                interfaces.Add(GetTypeReference());
            }
            //\ssyy
            object low_val   = null;
            object upper_val = null;

            PascalABCCompiler.SemanticTree.type_access_level tal = (PascalABCCompiler.SemanticTree.type_access_level)br.ReadByte();
            PascalABCCompiler.SemanticTree.type_special_kind tsk = (PascalABCCompiler.SemanticTree.type_special_kind)br.ReadByte();
            bool is_sealed   = br.ReadBoolean();
            bool is_abstract = br.ReadBoolean();

            if (tsk == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
            {
                low_val   = CreateExpression();
                upper_val = CreateExpression();
            }

            TypeScope element_type = null;

            if (CanReadObject())
            {
                element_type = GetTypeReference();
            }
            switch (tsk)
            {
            case PascalABCCompiler.SemanticTree.type_special_kind.none_kind: ctn = new TypeScope(SymbolKind.Class, cur_scope, base_type); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.record: ctn = new TypeScope(SymbolKind.Struct, cur_scope, base_type); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.array_wrapper: ctn = new ArrayScope(); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.enum_kind: ctn = new EnumScope(SymbolKind.Enum, cur_scope, base_type); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.set_type: ctn = new SetScope(element_type); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.array_kind: if (!in_scope)
                {
                    ctn = new ArrayScope();
                }
                else
                {
                    return(null);
                } break;

            case PascalABCCompiler.SemanticTree.type_special_kind.diap_type: ctn = new DiapasonScope(low_val, upper_val); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.typed_file: ctn = new FileScope(element_type, null); break;

            case PascalABCCompiler.SemanticTree.type_special_kind.binary_file: ctn = new FileScope(null, null); break;
            }
            ctn.declaringUnit = root_scope;
            ctn.si.name       = name;
            ctn.is_abstract   = is_abstract;
            ctn.is_final      = is_sealed;
            AddMember(ctn, offset);
            ctn.elementType = element_type;

            br.ReadInt32();
            br.ReadInt32();//attributes
            //common_namespace_node ns = cun.namespaces[0];
            byte flag         = br.ReadByte();
            int  def_prop_off = 0;

            if (flag == 1)
            {
                def_prop_off = br.ReadInt32();
            }
            ReadDebugInfo();
            ctn.si.description = ctn.GetDescription();
            //ñîçäàåì scope äëÿ êëàññà
            //ctn = new wrapped_common_type_node(this, base_type, name, tal, ns, scope, loc, offset);
            //members[offset] = ctn;
            //AddMember(ctn, offset);
            RestoreAllMembers(ctn);

            return(ctn);
        }