2013-07-14 3 views
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 기능을 통해 내 클래스에 전달됩니다. 데이터 청크 길이는 호출마다 다릅니다. 프로토콜의 패킷 형식을 알고 대화를 구성하는 방법을 알고 있으므로 Nth 부분을 구문 분석 할 충분한 데이터가 있는지 여부를 현재 pos_으로 판단 할 수 있습니다. 이제 구현은 다음과 같다 :

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.. 
} 

내가 원하는 것은이 알고리즘을 최적화하는 방법을 몇 가지 팁입니다. 어쩌면이 수많은 것을 피하기 위해 if (on_data은 여러 번 호출 될 수 있으며 모든 스위치를 거쳐야합니다.)

+0

on_data가 동일한 데이터로 두 번 호출되는 것처럼 보입니까? 그렇지 않으면이 논리가 필요하지 않습니까? – billz

+0

이것은 클라이언트가 여러 번 호출 할 때마다 새로운 데이터 덩어리로 호출되며 내부 저장소에 추가하고 구문 분석합니다. 내가 enogh 정보를 가지고 있다고 결정할 때, 나는 infrom 사용자에게 작업이 완료되었음을 사용자가 제공 한 callback이라고 부른다. – Alexander

+0

first_part_parsed_/second_part_parsed_는 중복 되었습니까? pos와 단계를 구분할 수 있습니까? – billz

답변

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의 값은 (내가 될 것이라고 가정한다) 다음뿐만 아니라 함께 그것을 전달하고 일부는 (어느 경우에 next_fun를 업데이트하지 않는) 해석 할 수 없었던 것을 나타 내기 위해서 false을 반환 중요합니다.