27         ASSERT(*min <= *max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
   32             T integral = (*(umin + 1) - *umin) * integrand(*umin);
 
   33             while (++umin != max) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
 
   34             integral += (*umin - *(umin - 1)) * integrand(*umin);
 
   35             return 0.5f * integral;
 
   51         ASSERT(min <= *max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
   56             T integral = (*umin - min) * integrand(min);
 
   57             integral += (*(umin + 1) - min) * integrand(*umin);
 
   58             while (++umin != max) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
 
   59             integral += (*umin - *(umin - 1)) * integrand(*umin);
 
   60             return 0.5f * integral;
 
   62         else return 0.5f * (*umin - min) * (integrand(min) + integrand(*umin));
 
   76         ASSERT(*min <= max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
   82             T integral = (*(umin + 1) - *umin) * integrand(*umin);
 
   83             while (++umin != umax) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
 
   84             integral += (max - *(umin - 1)) * integrand(*umin);
 
   85             integral += (max - *umin) * integrand(max);
 
   86             return 0.5f * integral;
 
   88         else return 0.5f * (max - *umin) * (integrand(max) + integrand(*umin));
 
  103         ASSERT(min <= max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
  109             T integral = (*umin - min) * integrand(min);
 
  112                 integral += (*(umin + 1) - min) * integrand(*umin);
 
  113                 while (++umin != umax) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
 
  114                 integral += (max - *(umin - 1)) * integrand(*umin);
 
  116             else integral += (max - min) * integrand(*umin);
 
  117             integral += (max - *umin) * integrand(max);
 
  118             return 0.5f * integral;
 
  120         else return 0.5f * (max - min) * (integrand(max) + integrand(min));
 
  124 namespace ImplicitIntegrator
 
  138     void integrateWithObscureLeftBoundary(
const float min, 
const FrequencyIterator max, 
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
 
  140         ASSERT(&integrandBuffer != &resultBuffer);
 
  141         ASSERT(min <= *max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
  143         resultBuffer.reset();
 
  147             integrand(min, integrandBuffer);
 
  148             resultBuffer.multAdd(*umin - min, integrandBuffer);
 
  150             integrand(*umin, integrandBuffer);
 
  151             resultBuffer.multAdd(*(umin + 1) - min, integrandBuffer);
 
  153             while (++umin != max)
 
  155                 integrand(*umin, integrandBuffer);
 
  156                 resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
 
  159             integrand(*umin, integrandBuffer);
 
  160             resultBuffer.multAdd(*umin - *(umin - 1), integrandBuffer);
 
  162             resultBuffer *= 0.5f;
 
  166             integrand(min, integrandBuffer);
 
  167             resultBuffer += integrandBuffer;
 
  169             integrand(*umin, integrandBuffer);
 
  170             resultBuffer += integrandBuffer;
 
  172             resultBuffer *= 0.5f * (*umin - min);
 
  188     void integrateWithObscureRightBoundary(
const FrequencyIterator min, 
const float max, 
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
 
  190         ASSERT(&integrandBuffer != &resultBuffer);
 
  191         ASSERT(*min <= max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
  193         resultBuffer.reset();
 
  198             integrand(*umin, integrandBuffer);
 
  199             resultBuffer.multAdd(*(umin + 1) - *umin, integrandBuffer);
 
  201             while (++umin != umax)
 
  203                 integrand(*umin, integrandBuffer);
 
  204                 resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
 
  207             integrand(*umin, integrandBuffer);
 
  208             resultBuffer.multAdd(max - *(umin - 1), integrandBuffer);
 
  210             integrand(max, integrandBuffer);
 
  211             resultBuffer.multAdd(max - *umin, integrandBuffer);
 
  213             resultBuffer *= 0.5f;
 
  217             integrand(max, integrandBuffer);
 
  218             resultBuffer += integrandBuffer;
 
  220             integrand(*umin, integrandBuffer);
 
  221             resultBuffer += integrandBuffer;
 
  223             resultBuffer *= 0.5f * (max - *umin);
 
  239     void integrateWithObscureBoundaries(
const float min, 
const float max, 
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
 
  241         ASSERT(&integrandBuffer != &resultBuffer);
 
  242         ASSERT(min <= max, 
"Lower integration boundary must not be larger than upper boundary. ");
 
  244         resultBuffer.reset();
 
  249             integrand(min, integrandBuffer);
 
  250             resultBuffer.multAdd(*umin - min, integrandBuffer);
 
  254                 integrand(*umin, integrandBuffer);
 
  255                 resultBuffer.multAdd(*(umin + 1) - min, integrandBuffer);
 
  257                 while (++umin != umax)
 
  259                     integrand(*umin, integrandBuffer);
 
  260                     resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
 
  263                 integrand(*umin, integrandBuffer);
 
  264                 resultBuffer.multAdd(max - *(umin - 1), integrandBuffer);
 
  268                 integrand(*umin, integrandBuffer);
 
  269                 resultBuffer.multAdd(max - min, integrandBuffer);
 
  272             integrand(max, integrandBuffer);
 
  273             resultBuffer.multAdd(max - *umin, integrandBuffer);
 
  275             resultBuffer *= 0.5f;
 
  279             integrand(max, integrandBuffer);
 
  280             resultBuffer += integrandBuffer;
 
  282             integrand(min, integrandBuffer);
 
  283             resultBuffer += integrandBuffer;
 
  285             resultBuffer *= 0.5f * (max - min);