TER Taker::cross (Offer const& offer) { // In direct crossings, at least one leg must not be XRP. if (isXRP (offer.amount ().in) && isXRP (offer.amount ().out)) return tefINTERNAL; auto const amount = do_cross ( offer.amount (), offer.quality (), offer.owner ()); return fill (amount, offer); }
TER Taker::cross (Offer const& leg1, Offer const& leg2) { // In bridged crossings, XRP must can't be the input to the first leg // or the output of the second leg. if (isXRP (leg1.amount ().in) || isXRP (leg2.amount ().out)) return tefINTERNAL; auto ret = do_cross ( leg1.amount (), leg1.quality (), leg1.owner (), leg2.amount (), leg2.quality (), leg2.owner ()); return fill (ret.first, leg1, ret.second, leg2); }
Amounts cross (Amounts offer, Quality quality) { if (reject (quality)) return Amounts (offer.in.zeroed (), offer.out.zeroed ()); // we need to emulate "unfunded offers" behavior if (get_funds (AccountID (0x4702), offer.out) == beast::zero) return Amounts (offer.in.zeroed (), offer.out.zeroed ()); if (done ()) return Amounts (offer.in.zeroed (), offer.out.zeroed ()); auto result = do_cross (offer, quality, AccountID (0x4702)); funds_ -= result.order.in; return result.order; }
std::pair<Amounts, Amounts> cross (Amounts offer1, Quality quality1, Amounts offer2, Quality quality2) { /* check if composed quality should be rejected */ Quality const quality (composed_quality ( quality1, quality2)); if (reject (quality)) return std::make_pair( Amounts { offer1.in.zeroed (), offer1.out.zeroed () }, Amounts { offer2.in.zeroed (), offer2.out.zeroed () }); if (done ()) return std::make_pair( Amounts { offer1.in.zeroed (), offer1.out.zeroed () }, Amounts { offer2.in.zeroed (), offer2.out.zeroed () }); auto result = do_cross ( offer1, quality1, AccountID (0x4703), offer2, quality2, AccountID (0x4704)); return std::make_pair (result.first.order, result.second.order); }
t_int *cross_perform(t_int *w) { int i, j; t_cross *x = (t_cross *) (w[1]); t_float *MSPInputVector1 = (t_float *)(w[2]); t_float *MSPInputVector2 = (t_float *)(w[3]); t_float *threshold = (t_float *)(w[4]); t_float *MSPOutputVector = (t_float *)(w[5]); t_fftease *fft = x->fft; t_fftease *fft2 = x->fft2; int MSPVectorSize = fft->MSPVectorSize; int operationRepeat = fft->operationRepeat; int operationCount = fft->operationCount; t_float *internalInputVector1 = fft->internalInputVector; t_float *internalInputVector2 = fft2->internalInputVector; t_float *internalOutputVector = fft->internalOutputVector; t_float *inputOne = fft->input; t_float *inputTwo = fft2->input; t_float *output = fft->output; int D = fft->D; int Nw = fft->Nw; t_float mult = fft->mult; if(x->mute){ for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; } return w+6; } x->threshie = *threshold; if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){ memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float)); memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float)); memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float)); memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float)); do_cross(x); mult = x->normult; for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; } memcpy(output, output + D, (Nw-D) * sizeof(t_float)); for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; } } else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) { for( i = 0; i < operationRepeat; i++ ){ memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float)); memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float)); memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float)); memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float)); do_cross(x); mult = x->normult; for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; } memcpy(output, output + D, (Nw-D) * sizeof(t_float)); for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; } } } else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) { memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float)); memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float)); memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float)); operationCount = (operationCount + 1) % operationRepeat; if( operationCount == 0 ) { memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float)); memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float)); memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float)); memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float)); do_cross(x); mult = x->normult; for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; } memcpy(output, output + D, (Nw - D) * sizeof(t_float)); for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; } } fft->operationCount = operationCount; } return w+6; }