• <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
            現在實習的都不念研了,除非保送。  回復  更多評論
              
            久久久久久亚洲精品成人| 欧美色综合久久久久久| 久久精品国产亚洲av高清漫画| 精品无码久久久久国产动漫3d| 久久国产高潮流白浆免费观看| 99久久99久久精品国产片| 久久亚洲AV无码精品色午夜 | 国产精品久久成人影院| 国产精自产拍久久久久久蜜| 思思久久99热只有频精品66| 久久九九精品99国产精品| 久久久久人妻一区精品果冻| 日韩人妻无码精品久久久不卡| 91久久精品无码一区二区毛片| 婷婷国产天堂久久综合五月| 国产精品美女久久久久网| 伊人伊成久久人综合网777| 成人久久综合网| 久久婷婷五月综合色奶水99啪| 久久国产视屏| 狠狠色综合久久久久尤物| 日韩人妻无码精品久久免费一| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | AA级片免费看视频久久| 日韩精品久久无码人妻中文字幕 | 国产精品久久久久久久久久影院 | 国产日韩久久久精品影院首页| 伊人色综合久久天天人守人婷| 久久99热国产这有精品| 久久精品www人人爽人人| 久久精品国产亚洲AV忘忧草18 | 久久精品国产一区二区| 日本免费一区二区久久人人澡| 婷婷久久香蕉五月综合加勒比| 18禁黄久久久AAA片| 久久久WWW成人| 日韩久久无码免费毛片软件| 国产福利电影一区二区三区,免费久久久久久久精 | 久久久中文字幕日本| 久久国产精品免费一区二区三区| 久久精品嫩草影院|