• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                實(shí)習(xí)的時候,自己的時間明顯沒有在學(xué)校的時候多啊。這次Kernel FP拖了很久,一個多月都還沒寫完。幸好語法分析器用了之前開發(fā)的Syngram,要不得多花一個月。Kernel FP的類型推導(dǎo)的代碼實(shí)在是很難看,趁著又發(fā)現(xiàn)了一個Bug,重構(gòu)一下。

                類型推導(dǎo)的時候需要頻繁地修改符號的類型。譬如說現(xiàn)在有符號Type1 A和Type2 B。突然發(fā)現(xiàn)函數(shù)的分支里面,一條返回A,一條返回B,立刻就斷定Type1與Type2相等了。現(xiàn)在事情就來了,需要將所有類型里面的Type1通通換成Type2。以前的做法是在推導(dǎo)之前將類型入棧,推導(dǎo)之后出棧,每次替換棧內(nèi)的類型。這種做法導(dǎo)致了代碼寫起來非常難受而且很容易出錯。因此今天針對這個問題,重寫了這個用來實(shí)現(xiàn)類型推導(dǎo)的類。

                現(xiàn)在需求如下。主類叫TypeSolver。TypeSolver::SolverAndReplace(OldType , NewType)的時候需要更新所有相關(guān)的類型。現(xiàn)在怎么辦呢?我提供了一個TypeWrapper用來裝Type的智能指針,實(shí)現(xiàn)operator->。使用TypeSolver創(chuàng)建Wrapper的時候,將Wrapper和類型記錄在Solver里面。多個Wrapper可能共享一個Type,這個時候Solver中還維護(hù)了一個引用計(jì)數(shù)。

                于是,我在Wrapper用其他Wrapper構(gòu)造,或使用Wrapper或Type賦值,或者析構(gòu)的時候都通知Solver。Solver析構(gòu)的時候通知所有Wrapper。代碼如下:

                h文件:
             1 class VL_KfpIdTypeWrapper : public VL_Base
             2 {
             3     friend class VL_KfpIdTypeSolver;
             4 protected:
             5     VL_KfpIdTypeSolver*                        FSolver;
             6     VL_KfpIdType::Ptr                        FType;
             7 
             8     VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver* Solver);
             9 
            10     void                                    Inc();
            11     void                                    Dec();
            12 public:
            13     VL_KfpIdTypeWrapper();
            14     VL_KfpIdTypeWrapper(const VL_KfpIdTypeWrapper& Wrapper);
            15     ~VL_KfpIdTypeWrapper();
            16 
            17     VL_KfpIdTypeWrapper&                    operator=(const VL_KfpIdTypeWrapper& Wrapper);
            18     VL_KfpIdTypeWrapper&                    operator=(VL_KfpIdType::Ptr Type);
            19     VL_KfpIdType*                            operator->();
            20 };

                cpp文件:
             1 void VL_KfpIdTypeWrapper::Inc()
             2 {
             3     if(FSolver)
             4     {
             5         if(FType)
             6         {
             7             VInt Index=FSolver->FAssociatedTypeCounter.IndexOfKey(FType.Object());
             8             if(Index==-1)
             9             {
            10                 FSolver->FAssociatedTypeCounter.Add(FType,1,FType.Object());
            11             }
            12             else
            13             {
            14                 FSolver->FAssociatedTypeCounter.ValueOfIndex(Index)++;
            15             }
            16         }
            17     }
            18 }
            19 
            20 void VL_KfpIdTypeWrapper::Dec()
            21 {
            22     if(FSolver)
            23     {
            24         if(FType)
            25         {
            26             VInt Index=FSolver->FAssociatedTypeCounter.IndexOfKey(FType.Object());
            27             if(--FSolver->FAssociatedTypeCounter.ValueOfIndex(Index)==0)
            28             {
            29                 FSolver->FAssociatedTypeCounter.DeleteByIndex(Index);
            30             }
            31         }
            32     }
            33 }
            34 
            35 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver* Solver)
            36 {
            37     FSolver=Solver;
            38     FSolver->FAssociatedWrappers.Add(this);
            39 }
            40 
            41 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper()
            42 {
            43     FSolver=0;
            44 }
            45 
            46 VL_KfpIdTypeWrapper::~VL_KfpIdTypeWrapper()
            47 {
            48     Dec();
            49 }
            50 
            51 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper(const VL_KfpIdTypeWrapper& Wrapper)
            52 {
            53     FSolver=Wrapper.FSolver;
            54     FType=Wrapper.FType;
            55     Inc();
            56 }
            57 
            58 VL_KfpIdTypeWrapper& VL_KfpIdTypeWrapper::operator=(const VL_KfpIdTypeWrapper& Wrapper)
            59 {
            60     Dec();
            61     FSolver=Wrapper.FSolver;
            62     FType=Wrapper.FType;
            63     Inc();
            64     return *this;
            65 }
            66 
            67 VL_KfpIdTypeWrapper& VL_KfpIdTypeWrapper::operator=(VL_KfpIdType::Ptr Type)
            68 {
            69     Dec();
            70     FType=Type;
            71     Inc();
            72     return *this;
            73 }
            74 
            75 VL_KfpIdType* VL_KfpIdTypeWrapper::operator->()
            76 {
            77     return FType.Object();
            78 }
            posted on 2008-10-27 05:23 陳梓瀚(vczh) 閱讀(1996) 評論(6)  編輯 收藏 引用 所屬分類: 腳本技術(shù)

            評論:
            # re: 是時候重構(gòu)了! 2008-10-27 05:26 | 陳梓瀚(vczh)
            好像有點(diǎn)小bug,不過算了,不在這里更新代碼。  回復(fù)  更多評論
              
            # re: 是時候重構(gòu)了! 2008-10-27 06:59 | 沈臻豪(foxtail)
            做事要嚴(yán)謹(jǐn) 最好更新一下  回復(fù)  更多評論
              
            # re: 是時候重構(gòu)了! 2008-10-27 07:38 | 陳梓瀚(vczh)
            我更新了我硬盤里面的代碼,而且也在這里說了,非常嚴(yán)謹(jǐn)。  回復(fù)  更多評論
              
            # re: 是時候重構(gòu)了! 2008-10-27 08:19 | 空明流轉(zhuǎn)
            我的編譯器也到了要考慮虛擬機(jī)的時候了。  回復(fù)  更多評論
              
            # re: 是時候重構(gòu)了![未登錄] 2008-10-29 06:43 | hh
            大哥,你念研不。  回復(fù)  更多評論
              
            # re: 是時候重構(gòu)了! 2008-10-31 19:06 | 金山詞霸2008
            現(xiàn)在實(shí)習(xí)的都不念研了,除非保送。  回復(fù)  更多評論
              
            久久精品国产日本波多野结衣| 狠狠色婷婷综合天天久久丁香| 成人午夜精品久久久久久久小说| 久久精品一区二区国产| 超级碰久久免费公开视频| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 91精品国产高清久久久久久国产嫩草| 亚洲午夜精品久久久久久人妖| 一本久久a久久精品综合香蕉| 久久99热只有频精品8| 久久人人超碰精品CAOPOREN| 亚洲精品无码久久久久久| 久久国产精品二国产精品 | 久久成人国产精品| 香蕉久久永久视频| 亚洲综合久久综合激情久久| 无码人妻久久一区二区三区免费| 欧美午夜A∨大片久久| 国产V综合V亚洲欧美久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 国产成人精品久久亚洲| 久久永久免费人妻精品下载| 亚洲午夜无码久久久久小说| 婷婷综合久久中文字幕| 精品综合久久久久久97超人| 久久精品国产精品亚洲毛片| 欧美丰满熟妇BBB久久久| 伊人久久精品无码av一区| 久久这里只有精品首页| 麻豆久久| 亚洲精品第一综合99久久| 久久久久97国产精华液好用吗| 青青青国产精品国产精品久久久久 | 国产亚洲精品自在久久| 国产毛片欧美毛片久久久| 久久精品人人做人人爽电影 | 精品久久久久久综合日本| 久久福利青草精品资源站| 99久久国产亚洲高清观看2024 | 国产精品久久久久久久久鸭| www久久久天天com|