• <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
                實習的時候,自己的時間明顯沒有在學校的時候多啊。這次Kernel FP拖了很久,一個多月都還沒寫完。幸好語法分析器用了之前開發(fā)的Syngram,要不得多花一個月。Kernel FP的類型推導的代碼實在是很難看,趁著又發(fā)現(xiàn)了一個Bug,重構一下。

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

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

                于是,我在Wrapper用其他Wrapper構造,或使用Wrapper或Type賦值,或者析構的時候都通知Solver。Solver析構的時候通知所有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) 閱讀(1989) 評論(6)  編輯 收藏 引用 所屬分類: 腳本技術

            評論:
            # re: 是時候重構了! 2008-10-27 05:26 | 陳梓瀚(vczh)
            好像有點小bug,不過算了,不在這里更新代碼。  回復  更多評論
              
            # re: 是時候重構了! 2008-10-27 06:59 | 沈臻豪(foxtail)
            做事要嚴謹 最好更新一下  回復  更多評論
              
            # re: 是時候重構了! 2008-10-27 07:38 | 陳梓瀚(vczh)
            我更新了我硬盤里面的代碼,而且也在這里說了,非常嚴謹。  回復  更多評論
              
            # re: 是時候重構了! 2008-10-27 08:19 | 空明流轉
            我的編譯器也到了要考慮虛擬機的時候了。  回復  更多評論
              
            # re: 是時候重構了![未登錄] 2008-10-29 06:43 | hh
            大哥,你念研不。  回復  更多評論
              
            # re: 是時候重構了! 2008-10-31 19:06 | 金山詞霸2008
            現(xiàn)在實習的都不念研了,除非保送。  回復  更多評論
              
            日本精品久久久久影院日本 | 无码精品久久一区二区三区| 久久精品九九亚洲精品天堂| 久久99精品国产一区二区三区| 久久久精品午夜免费不卡| 国产三级观看久久| 囯产极品美女高潮无套久久久 | 91视频国产91久久久| 亚洲天堂久久精品| 久久热这里只有精品在线观看| 久久99国产精品尤物| 久久夜色精品国产| 精品国产91久久久久久久| 亚洲欧洲久久久精品| 久久久久久久综合日本亚洲| 久久99热这里只有精品国产| 亚洲日韩中文无码久久| 久久久久九九精品影院| 国产精品一久久香蕉国产线看 | 久久婷婷激情综合色综合俺也去| 97久久精品无码一区二区| 亚洲AⅤ优女AV综合久久久| 狠狠色丁香婷综合久久| 亚洲色欲久久久综合网| 久久亚洲av无码精品浪潮| 久久香蕉国产线看观看乱码| 久久人妻AV中文字幕| 久久中文精品无码中文字幕| 狠狠色丁香久久婷婷综| 奇米综合四色77777久久| 久久99久久99精品免视看动漫| 欧美日韩中文字幕久久伊人| 99久久人妻无码精品系列蜜桃 | 亚洲国产精品久久久久婷婷老年| 人妻久久久一区二区三区| 久久国语露脸国产精品电影| 欧美黑人激情性久久| 亚洲国产精品无码久久| 一本色道久久综合狠狠躁| 亚洲av伊人久久综合密臀性色| 亚洲精品乱码久久久久久自慰|