opt14.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 58 行

C
58
字号
#include "fail.h"

class BRANCH;
class BRANCH_REF;
class TERM;

enum REF_TYPE { RT_BRANCH, RT_TERM };

struct BRANCH_REF {
    REF_TYPE tag;
    void*    what;     // BRANCH* or TERM*
};

struct BRANCH {
    BRANCH_REF left;
    BRANCH_REF right;
};

struct TERM {
    unsigned count;
    int doSomething() {
	return ++count;
    }
};


void trace( BRANCH_REF const &r ) {
    switch (r.tag) {
    case RT_BRANCH: {
	BRANCH *b = (BRANCH*) r.what;
	trace (b->left);
	trace (b->right);
	return;
    }
    case RT_TERM: {
        TERM *t = (TERM*) r.what;
	t->doSomething();
	return;
    }
    default:
	fail(__LINE__);
    }
}

TERM term;
BRANCH branch5 = { { RT_TERM, &term }, { RT_TERM, &term } };
BRANCH branch4 = { { RT_TERM, &term }, { RT_TERM, &term } };
BRANCH branch3 = { { RT_BRANCH, &branch5 }, { RT_TERM, &term } };
BRANCH branch2 = { { RT_TERM, &term }, { RT_BRANCH, &branch4 } };
BRANCH branch1 = { { RT_BRANCH, &branch2 }, { RT_BRANCH, &branch3 } };
BRANCH_REF ref1 = { RT_BRANCH, &branch1 };

int main() {
    trace( ref1 );
    if( term.count != 6 ) fail(__LINE__);
    _PASS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?