0

我需要用 C++ 实现一些抽象协议客户端-服务器会话解析库。我没有包含整个客户端-服务器对话的文件,但必须即时解析它。我必须实现以下接口:

class parsing_class
{
  public:
  void on_data( const char* data, size_t len );
  //other functions
  private:
  size_t pos_;// current position in the data flow
  bool first_part_parsed_;
  bool second_part_parsed_;
  //... some more bool markers or something like vector< bool >
};

数据通过on_data函数传递给我的班级。数据块长度因一次调用而异。我知道协议的数据包格式并且知道应该如何组织对话,所以我可以通过当前pos_判断我是否有足够的数据来解析Nth部分。现在实现如下:

void parsing_class::on_data( const char* data, size_t len )
{
   pos_ += len;
   if( pos > FIRST_PART_SIZE and !first_part_parsed_ )
     parse_first_part( data, len );
   if( pos > SECOND_PART_SIZE and !second_part_parsed_ )
     parse_second_part( data, len );
   //and so on..  
}

我想要的是一些如何优化这个算法的技巧。也许要避免这些众多ifon_data可能会被调用很多次,每次都必须经过所有开关)。

4

1 回答 1

1

您不需要所有这些boolpos_,因为它们似乎只保留对话内容的状态,以便您可以继续下一部分。

以下内容如何:为对话的每个部分编写一个解析函数

bool parse_part_one(const char *data) {
    ... // parse the data
    next_fun = parse_part_two;
    return true;
}
bool parse_part_two(const char *data) {
    ... // parse the data
    next_fun = parse_part_thee;
    return true;
}
...

并在您的类中添加一个指向当前解析函数的指针,从一个开始。现在,on_data你要做的就是调用下一个解析函数

bool success = next_fun(data);

因为每个函数都设置了指向下一个解析函数的指针,所以下一次调用on_data会自动调用下一个解析函数。无需测试您在对话中的位置。

如果 的值len很关键(我假设它是关键的),那么也将其传递并返回false以指示无法解析该部分(next_fun在这种情况下也不要更新)。

于 2013-07-14T11:22:25.960 回答