• <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拖了很久,一個多月都還沒寫完。幸好語法分析器用了之前開發的Syngram,要不得多花一個月。Kernel FP的類型推導的代碼實在是很難看,趁著又發現了一個Bug,重構一下。

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

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

                于是,我在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
            現在實習的都不念研了,除非保送。  回復  更多評論
              
            久久99热这里只频精品6| 国产亚州精品女人久久久久久 | 久久国产成人精品麻豆| 久久婷婷色综合一区二区| 一本久久免费视频| 久久午夜羞羞影院免费观看| 99久久国产综合精品网成人影院 | 久久天堂电影网| 久久se精品一区二区| 久久精品国产福利国产琪琪| 99精品久久精品一区二区| 伊人久久大香线蕉影院95| 久久亚洲日韩看片无码| 情人伊人久久综合亚洲| 99久久精品国产一区二区| 久久激情五月丁香伊人| www.久久99| 中文字幕久久精品无码| 久久久久这里只有精品| 免费观看成人久久网免费观看| 一级做a爰片久久毛片毛片| 国内精品伊人久久久久av一坑| 亚洲七七久久精品中文国产| 99久久精品费精品国产一区二区| 尹人香蕉久久99天天拍| 狠狠色婷婷综合天天久久丁香| 国内精品久久久久影院薰衣草| 国产精品久久久久乳精品爆| 久久精品国产亚洲AV香蕉| 亚洲人成网站999久久久综合| 一本伊大人香蕉久久网手机| 久久综合狠狠综合久久97色| 欧美亚洲国产精品久久蜜芽| 久久综合给久久狠狠97色| 欧美日韩精品久久久免费观看| 国产精品伦理久久久久久| 99精品国产在热久久无毒不卡| 精产国品久久一二三产区区别| 久久国产高清一区二区三区| 中文精品久久久久国产网址| 国产成人精品久久免费动漫|