gtclass.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 484 行 · 第 1/2 页

CPP
484
字号
        return NULL;
    }
}

int TreeClassNode::getCount( TreeList_T list )
//--------------------------------------------
{
    switch( list ) {
    case ParentList:
        return _bases.count();
    case ChildList:
        return _deriveds.count();
    case TreeNode::FlatList:
        return (*_flatClasses).count();
    default:
        REQUIRE( 0, "TreeClassNode::getPtr - bad list." );
        return NULL;
    }
}

TreeNode * TreeClassNode::removeNode( TreeList_T list, TreeNode * node )
//----------------------------------------------------------------------
{
    int index;

    switch( list ) {
    case ParentList:
        for( index = _bases.count(); index > 0; index -= 1 ) {
            if( ((TreeClassPtr*)_bases[ index - 1 ])->getTo() == node ) {
                TreeClassPtr * ptr = (TreeClassPtr*)_bases.removeAt( index - 1 );
                TreeNode *     nd = ptr->getTo();
                delete ptr;
                return nd;
            }
        }
        return NULL;

    case ChildList:
        for( index = _deriveds.count(); index > 0; index -= 1 ) {
            if( ((TreeClassPtr*)_deriveds[ index - 1 ])->getTo() == node ) {
                TreeClassPtr * ptr = (TreeClassPtr *)_deriveds.removeAt( index - 1 );
                TreeNode *     nd = ptr->getTo();
                delete ptr;
                return nd;
            }
        }
        return NULL;

    case TreeNode::FlatList:
        for( index = _flatClasses->count(); index > 0; index -= 1 ) {
            if( ((TreeNode *)(TreeClassNode *)(*_flatClasses)[ index - 1 ]) == node ) {
                return (TreeClassNode *)_flatClasses->removeAt( index - 1 );
            }
        }
        return NULL;
    default:
        REQUIRE( 0, "TreeClassNode::removeNode - bad list." );
        return NULL;
    }
}

void TreeClassNode::addPtr( TreeList_T list, TreePtr * ptr )
//----------------------------------------------------------
{
    switch( list ) {
    case ParentList:
        _bases.add( (TreeClassPtr*)ptr);
        break;

    case ChildList:
        TreeClassPtr * p;
        TreeNode *     sv;

        p = (TreeClassPtr*)ptr->makeClone();
        sv = p->getTo();
        p->setTo( p->getFrom() );
        p->setFrom( sv );

        _deriveds.add( p );
        break;

    default:
        REQUIRE( 0, "TreeClassNode::addPtr - bad list." );
    }
}

void TreeClassNode::swapNode( TreeList_T list,
                              TreeNode * from, TreeNode * to )
//------------------------------------------------------------
{
    int index;

    switch( list ) {
    case ParentList:
        for( index = _bases.count(); index > 0; index -= 1 ) {
            if( ((TreeClassPtr*)_bases[ index - 1 ])->getTo() == from ) break;
        }

        REQUIRE( index > 0, "TreeClassNode::swapNode -- unknown from" );
        ((TreeClassPtr*)_bases[ index - 1 ])->setTo( to );
        break;
    case ChildList:
        for( index = _deriveds.count(); index > 0; index -= 1 ) {
            if( ((TreeClassPtr*)_deriveds[ index - 1 ])->getTo() == from ) break;
        }

        REQUIRE( index > 0, "TreeClassNode::swapNode -- unknown from" );
        ((TreeClassPtr*)_deriveds[ index - 1 ])->setTo( to );
        break;
    default:
        REQUIRE( 0, "TreeClassNode::swapNode - bad list." );
    }
}

static int CompDerivationPtr( const DerivationPtr ** lhs,
                              const DerivationPtr ** rhs )
//--------------------------------------------------------
{
    const TreeNode * lhN = (const TreeNode *) ((TreeClassPtr*)(*lhs))->getTo();
    const TreeNode * rhN = (const TreeNode *) ((TreeClassPtr*)(*rhs))->getTo();

    return TreeNode::compareNodes( lhN, rhN );
}

void TreeClassNode::sortPrtKids()
//-------------------------------
{
    _bases.sort( (TComp) CompDerivationPtr );
    _deriveds.sort( (TComp) CompDerivationPtr );
}

void TreeClassNode::setAllDeriveds( void )
//----------------------------------------
{
    for( int j = _flatClasses->count(); j > 0; j -= 1 ) {
        (*_flatClasses)[ j - 1 ]->setDeriveds();
    }
}

/*-------------------------- TreeClassWindow ----------------------------*/

TreeClassWindow::TreeClassWindow( char * title )
                    : TreeWindow( title )
//----------------------------------------------
{
    show();

    _loadFilter->setSymType( KSTClasses );
    _findFilter->setSymType( KSTClasses );
}


TreeClassWindow::~TreeClassWindow()
//---------------------------------
{
}

bool TreeClassWindow::contextHelp( bool is_active_window )
//--------------------------------------------------------
{
    if( is_active_window ) {
        WBRWinBase::helpInfo()->sysHelpId( BRH_INHERITANCE_VIEW );
    }
    return( TRUE );
}

const char * TreeClassWindow::emptyText()
//---------------------------------------
{
    return "No classes found with current query";
}

void TreeClassWindow::fillRoots( void )
//-------------------------------------
// OPTIMIZE -- this finds all class, creates symbols for them,
//             then creates TreeClassNodes from these and deletes the
//             symbols.  Would be better if didn't create / delete syms.
{
    WVList          world;
    Symbol *        sym;
    TreeClassNode * rootNode;
    TreeClassList   roots;
    WVList          bases;
    bool            quit = FALSE;

    _loadFilter->setSymType( KSTClasses );
    dbManager()->module()->findSymbols( &world, _loadFilter );

    while( world.count() > 0 ) {
        sym = (Symbol *) world.removeAt( world.count() - 1 );
        rootNode = new TreeClassNode( this, sym );
        delete sym;

        // if not related to a prev tree, its a new tree

        TreeClassList joinTo;

        if( rootNode->doParents( world, roots, joinTo ) ) {
            TreeClassNode * prevRoot = NULL;

            for( int i = joinTo.count(); i > 0; i -= 1 ) {

                // make sure that they really are related by checking
                // both.  If both aren't checked, then a partially
                // loaded child might think it is already related
                // to its parent

                if( rootNode->isRelated( joinTo[ i - 1 ] )
                    && joinTo[ i - 1 ]->isRelated( rootNode ) ) {

                    // no action, they are already joined

                } else {
                    rootNode->joinLattice( (ClassLattice *) joinTo[ i - 1 ] );
                    if( prevRoot != NULL ) {
                        REQUIRE( prevRoot->isRelated( joinTo[ i - 1 ] ),
                                 "TreeClassWindow::fillRoots ack nak" );
                        roots.removeSame( prevRoot );
                    }

                    prevRoot = joinTo[ i - 1 ];
                }
            }
        } else {
            roots.add( rootNode );
        }
    }

    for( int i = roots.count(); i > 0; i -= 1 ) {
        TreeClassNode* node = roots[ i - 1 ];
        node->setAllDeriveds();
        node->normalizeLevels();

        for( int j = node->getCount( TreeNode::FlatList ); j > 0; j -= 1 ) {
            if( node->getNode( TreeNode::FlatList, j - 1 )->getLevel() == 0 ) {
                _roots.add( new TreeRoot( this, node->getNode( TreeNode::FlatList, j - 1 ) ) );
                break;
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?