示例#1
0
int callfunc(struct rule *r,struct function *f,void *dp,int type){
	int i=0;
	int fid=f->fid;	
	for(i=0;i<10;i++){
		if(!fid)
			break;
		switch (fid)
		{
		case 1:
			_addself(r,f->pt);
			break;
		case 2:
			_delself(r,f->pt);
			break;
		case 3:
			_greater(r,f->pt);
			break;
		case 4:
			_less(r,f->pt);
			break;
		case 5:
			_equal(r,f->pt);
			break;
		case 6:
			_unequal(r,f->pt);
			break;
		case FUNC_LOG:
			_log(r,f->pt);
		case FUNC_ALERT:
			_alert(r,f->pt);
		
		}
	}
}
void merge_list( sq_list list_a, sq_list list_b, sq_list merged_list ){
	//Suppose that the lists have been sorted
	//Suppose that all lists exist
	Length total_length = list_a->length + list_b->length;
	if( total_length > merged_list->size ){
		merged_list->elem = ( ElemType * )realloc( merged_list->elem, sizeof(ElemType) * ( total_length + 10 ) );
		merged_list->size = total_length + 10;
	}

	//Begin merge
	Length a = 0;
	Length b = 0;
	merged_list->length = total_length;
	while( a != list_a->length && b != list_b->length ){
		if( _less( &(list_a->elem[a]), &(list_b->elem[b]) ) ){
			merged_list->elem[a+b] = list_a->elem[a];
			++a;
		}else{
			merged_list->elem[a+b] = list_b->elem[b];
			++b;
		}
	}
	if( a == list_a->length ){
		while( b != list_b->length ){
			merged_list->elem[a+b] = list_b->elem[b];
			++b;
		}
	}else{
		while( a != list_a->length ){
			merged_list->elem[a+b] = list_a->elem[a];
			++a;
		}
	}
}
inline bool _string<init_size, inc_bit>::operator<(const _Self & s) const
{
	size_t cmp_sz = (this->__len > s.length()) ? this->__len : s.length();

	for(size_t i = 0; i < cmp_sz; ++i)
		if(!_less(this->__p_string[i], s[i]))
			return false;
	return true;
}//operator<(base_string)
示例#4
0
void fuzzy_search(
    const trie_t &dict_trie,
    const trie_t &word_trie,
    const char_t *lower_limit,
    const char_t *upper_limit,
    size_t max_dist,
    output_t &output) {

  less_t _less;

  typedef _fuzzy_search_task_t task_t;
  typedef _fuzzy_search_greater_task_t greater_task_t;

  struct equal_task_t {
  bool operator()(const task_t &lhs, const task_t &rhs) {
    return 
      lhs.word_node == rhs.word_node and 
      lhs.dict_node == rhs.dict_node;// and
//      lhs.ttl <= rhs.ttl;
  }
  };

  //queue_t<task_t, (sizeof(task_t) * 1024 - sizeof(void*)) / sizeof(task_t)> q;
  std::priority_queue<task_t, typename std::vector<task_t>, greater_task_t> q;
  q.push((task_t){dict_trie.root_node, word_trie.root_node, max_dist});

//  size_t step_no = 0;
//  size_t skip_no = 0;
  while (! q.empty() ) {
    //++step_no;
    const task_t task = q.top();
    q.pop();

//    while (! q.empty() and equal_task_t()(q.top(), task)) {
//      ++skip_no;
//      q.pop();
//    }

//    if (step_no % 10000 == 0) {
//      std::cout << "step_no:" << step_no << "\tq_size:" << q.size() << "\tskip_no:" << skip_no <<"\t"<<task.word_node << "\t"<<task.dict_node  << "\t" << task.ttl<< std::endl;
//    }

    const size_t *dict_offset_begin = _get_offset_begin(task.dict_node);
    const size_t *word_offset_begin = _get_offset_begin(task.word_node);
    
    if (task.ttl) {
      //delete
      for (size_t i = 0; i < task.dict_node->child_count; ++i) {
        const plane_node_t *dict_child = _get_node(dict_trie, dict_offset_begin[i]);
        if (_empty_node(dict_child)) continue;
        task_t new_task = task;
        new_task.ttl -= 1;
        new_task.dict_node = dict_child;
        q.push(new_task);
      }

      // insert
      for (size_t i = 0; i < task.word_node->child_count; ++i) {
        const plane_node_t *word_child = _get_node(word_trie, word_offset_begin[i]);
        if (_empty_node(word_child)) continue;
        task_t new_task = task;
        new_task.ttl -= 1;
        new_task.word_node = word_child;
        q.push(new_task);
      }

      // replace
      // foreach curr_node keys
      for (size_t dict_child_id = 0; dict_child_id < task.dict_node->child_count; ++dict_child_id) {
        const plane_node_t *dict_child = _get_node(dict_trie, dict_offset_begin[dict_child_id]);
        if (_empty_node(dict_child)) continue;

        for (size_t word_child_id = 0; word_child_id < task.word_node->child_count; ++word_child_id) {
          const plane_node_t *word_child = _get_node(word_trie, word_offset_begin[word_child_id]);
          if (_empty_node(word_child)) continue;

          const char_t &dict_key = ((char_t*)((char*)task.dict_node + sizeof(plane_node_t)))[dict_child_id];
          const char_t &word_key = ((char_t*)((char*)task.word_node + sizeof(plane_node_t)))[word_child_id];
          
          if (dict_key == word_key) {
            continue; // ignore replace if it's the same as paste
          }

          task_t new_task = task;
          new_task.ttl -= 1;
          new_task.dict_node = dict_child;
          new_task.word_node = word_child;
          q.push(new_task);
        }
      }
    }
    
    // paste
    for (size_t i = 0, j = 0; i < task.dict_node->child_count && j < task.word_node->child_count; ) {
      const char_t &dict_key = ((char_t*)((char*)task.dict_node + sizeof(plane_node_t)))[i];
      const char_t &word_key = ((char_t*)((char*)task.word_node + sizeof(plane_node_t)))[j];

      if (_less(dict_key, word_key)) {
        ++i;
        continue;
      } else if (_less(word_key, dict_key)) {
        ++j;
        continue;
      } else {
        const plane_node_t *dict_child = _get_node(dict_trie, dict_offset_begin[i]);
        if (_empty_node(dict_child)) {
          ++i;
          ++j;
          continue;
        }
        
        const plane_node_t *word_child = _get_node(word_trie, word_offset_begin[j]);
        if (_empty_node(word_child)) {
          ++i;
          ++j;
          continue;
        }
        //std::cout << "EQ " << i << " " << j << " : " << word_key << " " << dict_key << std::endl; 
        task_t new_task = task;
        new_task.dict_node = dict_child;
        new_task.word_node = word_child;
        q.push(new_task);
       
        ++i;
        ++j;
      }

    }

    if (task.dict_node->value && task.word_node->value) {
      output.insert(std::make_pair(task.word_node->value, task.dict_node->value));
    }
  }
}
 bool operator ()(size_t i, size_t j)
 {
   return _less(data_[i], data_[j]);
 }