[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/cfarrow/libdiffpy/develop/src/diffpy/srreal/PDFEnvelope.cpp [Back]  [Original]

/*****************************************************************************
*
* diffpy.srreal     by DANSE Diffraction group
*                   Simon J. L. Billinge
*                   (c) 2009 Trustees of the Columbia University
*                   in the City of New York.  All rights reserved.
*
* File coded by:    Pavol Juhas
*
* See AUTHORS.txt for a list of people who contributed.
* See LICENSE.txt for license information.
*
******************************************************************************
*
* class PDFEnvelope -- abstract base class for PDF envelope functions
*
*****************************************************************************/

#include 
#include 
#include 

#include 
#include 
#include 
#include 

using namespace std;
using diffpy::validators::ensureNonNull;

namespace diffpy {

// Unique instantiation of the template registry base class.
template class HasClassRegistry;

namespace srreal {

// class PDFEnvelopeOwner ----------------------------------------------------

// public methods

QuantityType PDFEnvelopeOwner::applyEnvelopes(
        const QuantityType& x, const QuantityType& y) const
{
    assert(x.size() == y.size());
    QuantityType z = y;
    EnvelopeStorage::const_iterator evit;
    for (evit = menvelope.begin(); evit != menvelope.end(); ++evit)
    {
        PDFEnvelope& fenvelope = *(evit->second);
        QuantityType::const_iterator xi = x.begin();
        QuantityType::iterator zi = z.begin();
        for (; xi != x.end(); ++xi, ++zi)
        {
            *zi *= fenvelope(*xi);
        }
    }
    return z;
}


void PDFEnvelopeOwner::addEnvelope(PDFEnvelopePtr envlp)
{
    ensureNonNull("PDFEnvelope", envlp);
    menvelope[envlp->type()] = envlp;
}


void PDFEnvelopeOwner::addEnvelopeByType(const string& tp)
{
    // this throws invalid_argument for invalid type
    PDFEnvelopePtr envlp = PDFEnvelope::createByType(tp);
    // we get here only when createByType was successful
    menvelope[envlp->type()] = envlp;
}


void PDFEnvelopeOwner::popEnvelope(PDFEnvelopePtr envlp)
{
    EnvelopeStorage::iterator evit = menvelope.begin();
    for (; evit != menvelope.end(); ++evit)
    {
        if (evit->second == envlp)  menvelope.erase(evit);
    }
}


void PDFEnvelopeOwner::popEnvelopeByType(const string& tp)
{
    menvelope.erase(tp);
}


const PDFEnvelopePtr& PDFEnvelopeOwner::getEnvelopeByType(const string& tp) const
{
    // call non-constant method
    const PDFEnvelopePtr& rv =
        const_cast(this)->getEnvelopeByType(tp);
    return rv;
}


PDFEnvelopePtr& PDFEnvelopeOwner::getEnvelopeByType(const string& tp)
{
    if (!menvelope.count(tp))
    {
        ostringstream emsg;
        emsg 

Web Proxy Viewer  |  New URL  |  Original Page