Ignore:
Timestamp:
Aug 19, 2008, 2:13:22 PM (16 years ago)
Author:
イグトランス (egtra)
Message:

CLoopRefCheckをhashset<string>ベースにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp

    r723 r726  
    88#endif
    99
     10#include <hash_set>
     11
    1012using namespace ActiveBasic::Compiler;
    1113
     
    167169
    168170class CLoopRefCheck{
    169     char **names;
    170     int num;
    171     void init(){
    172         int i;
    173         for(i=0;i<num;i++){
    174             free(names[i]);
    175         }
    176         free(names);
    177     }
     171    stdext::hash_set<std::string> names;
     172
    178173public:
    179174    CLoopRefCheck()
    180175    {
    181         names=(char **)malloc(1);
    182         num=0;
    183176    }
    184177    ~CLoopRefCheck()
    185178    {
    186         init();
    187     }
    188     void add(const char *lpszInheritsClass)
    189     {
    190         names=(char **)realloc(names,(num+1)*sizeof(char *));
    191         names[num]=(char *)malloc(lstrlen(lpszInheritsClass)+1);
    192         lstrcpy(names[num],lpszInheritsClass);
    193         num++;
    194     }
    195     void del(const char *lpszInheritsClass)
    196     {
    197         int i;
    198         for(i=0;i<num;i++){
    199             if(lstrcmp(names[i],lpszInheritsClass)==0){
    200                 free(names[i]);
    201                 break;
    202             }
    203         }
    204         if(i!=num){
    205             num--;
    206             for(;i<num;i++){
    207                 names[i]=names[i+1];
    208             }
    209         }
    210     }
    211     BOOL check(const CClass &inheritsClass) const
     179    }
     180    void add(const std::string &lpszInheritsClass)
     181    {
     182        names.insert(lpszInheritsClass);
     183    }
     184    void del(const std::string &lpszInheritsClass)
     185    {
     186        names.erase(lpszInheritsClass);
     187    }
     188    bool check(const CClass &inheritsClass) const
    212189    {
    213190        //ループ継承チェック
    214         int i;
    215         for(i=0;i<num;i++){
    216             if( inheritsClass.GetName() == names[i] ){
    217                 return 1;
    218             }
    219         }
    220         return 0;
    221     }
     191        return names.find(inheritsClass.GetName()) != names.end();
     192    }
     193private:
     194    CLoopRefCheck(const CLoopRefCheck&);
     195    CLoopRefCheck& operator =(const CLoopRefCheck&);
    222196};
    223197CLoopRefCheck *pobj_LoopRefCheck;
     
    243217            }
    244218
    245             pobj_LoopRefCheck->add(objClass.GetName().c_str());
     219            pobj_LoopRefCheck->add(objClass.GetName());
    246220
    247221            bool tempResult = MemberVar_LoopRefCheck(pMember->GetType().GetClass());
     
    251225            }
    252226
    253             pobj_LoopRefCheck->del(objClass.GetName().c_str());
     227            pobj_LoopRefCheck->del(objClass.GetName());
    254228        }
    255229    }
     
    403377                // インターフェイスが未解析のとき
    404378                LexicalAnalyzer::LookaheadClass(
    405                     pInterface->GetClass().GetName().c_str(),
     379                    pInterface->GetClass().GetName(),
    406380                    compiler.GetObjectModule().meta.GetClasses()
    407381                );
     
    494468                //継承先が読み取られていないとき
    495469                LexicalAnalyzer::LookaheadClass(
    496                     pInheritsClass->GetName().c_str(),
     470                    pInheritsClass->GetName(),
    497471                    compiler.GetObjectModule().meta.GetClasses()
    498472                );
     
    526500            //継承先が読み取られていないとき
    527501            LexicalAnalyzer::LookaheadClass(
    528                 pObjectClass->GetName().c_str(),
     502                pObjectClass->GetName(),
    529503                compiler.GetObjectModule().meta.GetClasses()
    530504            );
     
    652626            // インターフェイスが未解析のとき
    653627            LexicalAnalyzer::LookaheadClass(
    654                 pInterfaceClass->GetName().c_str(),
     628                pInterfaceClass->GetName(),
    655629                compiler.GetObjectModule().meta.GetClasses()
    656630            );
     
    12561230                            if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
    12571231                                //循環参照のチェック
    1258                                 pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
     1232                                pobj_LoopRefCheck->add(pobj_c->GetName());
    12591233                                if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers().back()->GetType().GetClass())){
    12601234                                    //エラー回避
     
    12621236                                    type.SetBasicType( DEF_PTR_VOID );
    12631237                                }
    1264                                 pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
     1238                                pobj_LoopRefCheck->del(pobj_c->GetName());
    12651239                            }
    12661240                        }
     
    13401314}
    13411315
    1342 void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes )
     1316void LexicalAnalyzer::LookaheadClass( const std::string &className, Classes &classes )
    13431317{
    13441318    pobj_LoopRefCheck->add( className );
    1345     GetClass_recur( className, classes );
     1319    GetClass_recur( className.c_str(), classes );
    13461320    pobj_LoopRefCheck->del( className );
    13471321}
Note: See TracChangeset for help on using the changeset viewer.