Esempio n. 1
0
int CChars::PrivateReplaceWithLonger(const char* szFind, const char* szReplace, int iFindLen, int iDifference)
{
	int		iCount;
	int		iIndex;
	int		i;
	int		iTotalDifference;
	int		iOldIndex;

	iCount = Occurrences(szFind);
	if (iCount == 0)
	{
		return 0;
	}

	iTotalDifference = iDifference * iCount;
	mcText.AddNum(iTotalDifference);
	(*mcText.Tail()) = 0;

	iIndex = Length() - (iFindLen + iTotalDifference);
	for (i = iCount-1; i >= 0; i--)
	{
		iOldIndex = iIndex;
		iIndex = FindFromEnd(iIndex, szFind);
		memcpy(mcText.Get(iIndex + iFindLen + (iDifference * (i+1))), mcText.Get(iIndex + iFindLen), iOldIndex - iIndex);
		Overwrite(iIndex + (iDifference * i), szReplace);
		iIndex -= iFindLen;
	}
	return iCount;
}
Mistral2_Expression* Mistral2_Gcc::add(Mistral2Solver *solver, bool top_level)
{
  if(!has_been_added()) {
#ifdef _DEBUGWRAP
    std::cout << "add gcc constraint" << std::endl;
#endif
      
    _solver = solver;
    
    int i, n=_vars.size(), m=_vals.size();
    int min_val=_vals.get_item(0);
    int max_val=_vals.get_item(m-1);
    int M = (max_val - min_val + 1);
    Mistral::VarArray scope(n);

    int *tmp_lb = new int[M];
    int *tmp_ub = new int[M];

    for(i=0; i<n; ++i) {
      _vars.get_item(i)->add(_solver,false);
      scope[i] = _vars.get_item(i)->_self;
    }

    //std::cout << min_val << " to " << max_val << std::endl;

    for(i=0; i<M; ++i) {
      tmp_lb[i] = _lb_card.get_item(i);
      tmp_ub[i] = _ub_card.get_item(i);

      //std::cout << " " << i+min_val << ": in [" << tmp_lb[i] << ".." << tmp_ub[i] << "]\n";
    }

    _self = Occurrences(scope, min_val, max_val, tmp_lb, tmp_ub);

    if( top_level )
      _solver->solver->add( _self );

    delete [] tmp_lb;
    delete [] tmp_ub;

  }

  return this;
}