C++语言中的元类编程(七)(二)

2014-11-24 11:12:40 · 作者: · 浏览: 1
Descriptor, public IProtocolDescriptor {

virtual unsigned ID() const { return image_des_header; }

virtual const char * Name() const { return "image_des_header"; }

virtual bool IsCondition() const { return true; }

virtual const IFieldDescriptor * ConditionFieldDescriptor() const { return NULL; }

virtual const IProtocolDescriptor * CastToProtocolDescriptor() const { return this; }

virtual size_t FieldSize(stream_iterator fieldData) const { return 0; } // 我们可以不关心子协议类型的field的大小,至于具体原因,我们将来会再解释

virtual size_t FieldCount(stream_iterator conditionFieldData, stream_iterator fieldData) const { return 1; }

virtual size_t GetFieldDescriptorCount() const { return 2; }

virtual const IFieldDescriptor * GetFirstFieldDescriptor() const {

const_cast (mSubFieldDesIdx) = 0;

return mSubFieldDes[0];

}

virtual const IFieldDescriptor * GetNextFieldDescriptor() const {

++ const_cast (mSubFieldDesIdx);

if (mSubFieldDesIdx < 2)

return mSubFieldDes[mSubFieldDesIdx];

return NULL;

}

CImageHeaderWidthDes mWidthDes;

CImageHeaderHeightDes mHeigthDes;

const IFieldDescriptor * mSubFieldDes[2];

int mSubFieldDesIdx;

public:

CImageHeaderDes() {

mSubFieldDes[0] = &mWidthDes;

mSubFieldDes[1] = &mHeigthDes;

mSubFieldDesIdx = 0;

}

};

class CImageDataDes: public IFieldDescriptor {

virtual unsigned ID() const { return image_des_data; }

virtual const char * Name() const { return "image_des_data"; }

virtual bool IsCondition() const { return false; }

virtual const IFieldDescriptor * ConditionFieldDescriptor() const { return mImageHeaderDes; }

virtual const IProtocolDescriptor * CastToProtocolDescriptor() const { return NULL; }

virtual size_t FieldSize(stream_iterator fieldData) const { return 8; }

virtual size_t FieldCount(stream_iterator conditionFieldData, stream_iterator fieldData) const {

short size[2] = {0};

conditionFieldData.CopyBits( 32, &size, sizeof(size) ); // 这个操作从conditionFieldData中拷贝32bits到size中。

return (int) size[0] * (int) size[1] * 4;

}

const IFieldDescriptor * mImageHeaderDes;

public:

CImageDataDes(const IFieldDescriptor * imageHeaderDes) {

mImageHeaderDes = imageHeaderDes;

}

};

class CImageDes: public IFieldDescriptor, public IProtocolDescriptor {

... // 省略接口IFieldDescriptor和IProtocolDescriptor的实现,请仿造CImageHeaderDes自行补充完整

CImageHeaderDes mImageHeaderDes;

CImageDataDes mImageDataDes;

const IFieldDescriptor * mSubFieldDes[2];

int mSubFieldDesIdx;

public:

CImageDes(): mImageDataDes(&mImageHeaderDes) {

mSubFieldDes[0] = &mImageHeaderDes;

mSubFieldDes[1] = &mImageDataDes;

mSubFieldDesIdx = 0;

}

};

从上面的例子中,我们可以清晰的看到元类IFieldDescriptor和IProtocolDescriptor的描述能力,同时这种表达方式也非常的便于我们(根据原始的结构)检查每一个描述是否是正确的,同时我们也应当看到,这种描述能力是非常灵活的,可以任意的根据我们的需要进行扩展(比如我们最初提出这个设计是为了描述TS协议,但是居然也可以描述位图!而且我们可以肯定,只要是能用树形表示的绝大多数逻辑结构,它都能描述!),之后需要考虑的就是如何利用IFieldDescriptor和IProtocolDescriptor描述出的数据结构,去分析bit流,并且输出一个field的序列。