Thursday, December 16, 2010

c++ Function Object

1. std::functional,包括:

   1.1 常用的数学运算工具。如plus/minus/multiplies/divides/modulus,equal_to/not_equal_to/greater/less/greater_equal/less_equal,logical_and/logical_or;

   1.2 一套adaptor工具,根据已有的function object得到新的function object。如bind1st/bind2nd/not1/not2;

   1.3 一套conversor工具,把普通的function pointer和member function转换成function object。如ptr_fun/mem_fun/mem_fun_ref;

   std::functional各功能块的关系如图所示:


    1.4 std::functional的局限:严格的类型匹配(不只是参数类型匹配),使std::functional的运用主要局限于具体的template算法中(如std::algorithm),而对系统框架/接口的设计没有太大帮助。

2. boost::functional

    对std::functional的增强,主要集中在两点,一是避免references to references(参数是引用的引用,语法错误)的问题,二是可以消除ptr_fun这个conversor的使用

4. boost::lambda

    就地生成匿名function object,有助于写出更清晰简洁的代码。类似于其它语言中的闭包(enclosure)
 
5. boost::function

    一个function object封装器,能把接口相同(输入输出参数一致)的各种function object 封装在一起,完成类似C#中的delegate(委托)功能。boost::function能提供一个统一的interface,在系统设计时很有用。

    缺点:1.比一般的function call或function object需要更多的运行时开销;2.有可能需要在Heap中分配内存。

Wednesday, November 3, 2010

GRE protocol

1. RFC

RFC 1701 — Generic Routing Encapsulation (GRE) (INFORMATIONAL)
RFC 1702 — Generic Routing Encapsulation over IPv4 networks (INFORMATIONAL)
RFC 2784 — Generic Routing Encapsulation (GRE) (PROPOSED STANDARD - Updated by RFC 2890)
RFC 2890 — Key and Sequence Number Extensions to GRE (PROPOSED STANDARD)

2. RFC 1701 关键点

  2.1 GRE是一个通用封装协议,GRE 协议只关心Header里头的flags, version, protocol type等域,其它如Key, Sequence Number, Routing 等域与应用相关,由具体应用决定它们的含义。

  2.2 Routing. Routing信息包含在Source Route Entry (SRE) list中,每个SRE可以包含多个地址信息,一个GRE包可以包含多个SRE. 如果Routing信息存在的话,外层协议需要根据SRE list中指示的信息,依次路由。

  如果SREs的Address Family是0x800(IP),则SRE的Routing Information域由一系列的IP地址组成。

Thursday, October 21, 2010

Singleton模式

1. 优点(相比于全局变量):
 
    1.1 避免污染全局空间。

    1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。

    1.3 允许更灵活的实现策略。

2 缺点:

    2.1 构造函数没法传递参数。

    2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。

    2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
 
         http://www.ibm.com/developerworks/java/library/j-dcl.html

Monday, October 18, 2010

Type Container of Meta-programming

1. boost::tuple

    本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。

    tuple为元编程提供的工具有:

        element <N, Tuple>::type
        length < Tuple >::value

2. loki::Typelist

     一种类型容器,为元编程提供的方法有:
         Length <TypeList >
         TypeAt <TypeList, N >
         IndexOf <TypeList, T >
         Append <TypeList, T >
         Erase <TypeList, T >
         Replace <TypeList, T, U >

    为编译期到运行期提供映射的工具有:
         GenScatterHierarchy
         GenLinearHierarchy

3. boost::mpl::vector, list, etc.

    专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:

        begin<>, end<>, transform<>, insert<>...

    为编译期到运行期提供的映射的工具有:
         for_each<>

    总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。

4. boost::fusion

    boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。

   
5. lmp::tuple

    自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element< N, lmp::tuple >将返回lmp::null_type,而不是像boost::element< N, boost::tuple >那样由编译器报一个编译错误。

    lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。

Sunday, September 19, 2010

Win32 GUI

1. Window概述

    1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。

    1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。

        1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
        1.2.2 客户区由应用程序管理,用于显示图形和文字信息。

    1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。

    1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.

      Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。

2. 创建window

    2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
      2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
         2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
         2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
         2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class

    2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。

    2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.

    2.4 处理消息循环

    2.5 销毁window (DestroyWindow() ).


3. Window类型

    在调用 CreateWindowEx()函数时给dwStyle设置合适的值

    3.1 Overlapped Windows:  一种 "top-level"的窗口, 通常用作应用程序的主窗口。
        基本风格: title bar, border, and client area (WS_OVERLAPPED)
        可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)

    3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
        基本风格: border and client area(WS_POPUP)
        可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
        可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.

    3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up

window, 或另外一个child window。Child Window必须有父窗口。
        基本风格:不带任何窗口元素(WS_CHILD)
        可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
   
        子窗口的几个重要属性:
            3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
            3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
            3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
            3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。

    3.4 其它特色窗口类型
        3.4.1 Layered Windows:  一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
        3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
       
4. Windows的主从关系(Owned window and Owner window)

    主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。

    4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).

    4.2 有主从关系的windows有下列一些约束:
        4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
        4.2.2 当主窗口销毁时,从窗口自动销毁
        4.2.3 当主窗口最小化时,从窗口自动隐藏

Friday, September 17, 2010

GTP(GPRS Tunnelling Protocol) 协议

1. GTP v1 for user plan. 3GPP TS 29.281. used in:
      LTE-S1 (between eNodeB and SGW), control plan is S1AP
      LTE-S5 (between SGW and PGW), control plan is GTPv2-C
      LTE-X2 (between eNodeBs), control plan is X2AP

2. GTPv2-C for control plan. 3GPP TS 29.274. used in:
      LTE-S5
      LTE-S8

3. GTP (GTP-C and GTP-U) 3GPP TS 29.060. used in
      Gn (between GSNs within a PLMN)
      Gp (between GSNs in different PLMNs)
      Iu (between SGSN and UTRAN),  GTP-U only. The control plan is RANAP

4. GTP based charging protocol GTP'. 3GPP TS 32.295

Friday, August 20, 2010

boost::MPL - basic tools

1. lambda表达式:一种元数据(metadata)。有两种表达方式,一是普通的元数据类,二是占位符表达式(placeholder expressions)。占位符表达式的本质是把第n个元数据封装成一个元数据类。

    如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:

    struct arg<1>
    {
        template <class A1, class A2 &gt;
        struct apply
        {
             typedef A1 type; // return first argument
        }
    };

    整个语句的含义相当于:
    struct Temp
    {
        template<typename Arg1, typename Arg2>
        struct apply {
            typedef mpl::plus<Arg1, Arg2> type;
        };
    }

2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。

3.有价值的概念
   3.1 compile time to runtime mapping,
      用途: 从mataprogramming 转到
      工具:mpl::for_each<>, boost::fusion

   3.2 runtime to compile time mapping。
      用途:提供缓式计算,避免不必要的运行时开销,提高性能
      工具:参照blitz++

   3.3 闭包

   3.4 命名参数
      用途:函数接受大量参数时,简化参数传递
      工具: