随笔-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) 阅读(1929) 评论(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
现在实习的都不念研了,除非保送。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理