• <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) 閱讀(1996) 評論(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
            現在實習的都不念研了,除非保送。  回復  更多評論
              
            中文字幕久久亚洲一区| 久久91精品国产91久久小草| 久久亚洲av无码精品浪潮| 久久一区二区三区免费| 亚洲国产精品无码久久一区二区| 2021少妇久久久久久久久久| 合区精品久久久中文字幕一区| 国产精品一区二区久久国产| 欧美久久亚洲精品| 久久99国产精品久久久| 久久热这里只有精品在线观看| 97超级碰碰碰碰久久久久| 久久久久久久波多野结衣高潮| 国产ww久久久久久久久久| 色欲av伊人久久大香线蕉影院 | 久久久久亚洲精品中文字幕| 伊人久久大香线蕉综合Av| 四虎久久影院| 久久精品亚洲男人的天堂| 久久精品国产免费一区| 麻豆成人久久精品二区三区免费| 四虎久久影院| 色综合久久夜色精品国产| 久久夜色精品国产| 久久天天躁狠狠躁夜夜av浪潮 | 99久久精品免费看国产一区二区三区 | 一本久道久久综合狠狠爱| 伊人久久大香线蕉综合热线| 九九热久久免费视频| 久久99精品久久久久久噜噜| 中文字幕亚洲综合久久2| 久久综合九色综合精品| 77777亚洲午夜久久多喷| 亚洲狠狠综合久久| 国产精品热久久毛片| 狠狠久久综合伊人不卡| 老司机午夜网站国内精品久久久久久久久| 国产亚洲美女精品久久久| 久久久久这里只有精品| 久久频这里精品99香蕉久| 久久大香萑太香蕉av|