-
Peterson, Peter authoredPeterson, Peter authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ArrayBoundedValidator.cpp 4.12 KiB
#include "MantidKernel/ArrayBoundedValidator.h"
#include <iostream>
#include <sstream>
#include <string>
namespace Mantid
{
namespace Kernel
{
/**
* Default constructor
*/
template <typename TYPE>
ArrayBoundedValidator<TYPE>::ArrayBoundedValidator() : IValidator<std::vector<TYPE> >()
{
this->boundVal = new BoundedValidator<TYPE>();
}
/**
* Copy constructor
* @param abv :: the ArrayBoundedValidator to copy
*/
template <typename TYPE>
ArrayBoundedValidator<TYPE>::ArrayBoundedValidator(const ArrayBoundedValidator<TYPE> &abv) : IValidator<std::vector<TYPE> >()
{
this->boundVal = dynamic_cast<BoundedValidator<TYPE> *>(abv.boundVal->clone());
}
/**
* Constructor via bounds parameters
* @param lowerBound :: the lower bound value to validate
* @param upperBound :: the upper bound value to validate
*/
template <typename TYPE>
ArrayBoundedValidator<TYPE>::ArrayBoundedValidator(const TYPE lowerBound, const TYPE upperBound) : IValidator<std::vector<TYPE> >()
{
this->boundVal = new BoundedValidator<TYPE>(lowerBound, upperBound);
}
/**
* Constructor via a BoundedValidator
* @param bv :: the BoundedValidator object to use
*/
template <typename TYPE>
ArrayBoundedValidator<TYPE>::ArrayBoundedValidator(BoundedValidator<TYPE> &bv)
{
this->boundVal = dynamic_cast<BoundedValidator<TYPE> *>(bv.clone());
}
/**
* Object destructor
*/
template <typename TYPE>
ArrayBoundedValidator<TYPE>::~ArrayBoundedValidator()
{
if (this->boundVal)
{
delete this->boundVal;
}
}
/**
* Create a clone of the current ArrayBoundedValidator
* @return the cloned object
*/
template <typename TYPE>
IValidator<std::vector<TYPE> >* ArrayBoundedValidator<TYPE>::clone()
{
return new ArrayBoundedValidator<TYPE>(*this);
}
/**
* Accessor for the stored BoundedValidator
* @return a pointer to the stored BoundedValidator
*/
template <typename TYPE>
BoundedValidator<TYPE>* ArrayBoundedValidator<TYPE>::getValidator() const
{
return this->boundVal;
}
/**
* Function to check the validity of the array elements
* @param value :: the array to be checked
* @return a listing of the indicies that fail the bounds checks
*/
template <typename TYPE>
std::string
ArrayBoundedValidator<TYPE>::isValid( const std::vector<TYPE> &value ) const
{
std::string failure = this->checkValidity(value);
return failure;
}
/**
* Function that actually does the work of checking the validity of the
* array elements.
* @param value :: the array to be checked
* @return a listing of the indicies that fail the bounds checks
*/
template <typename TYPE>
std::string
ArrayBoundedValidator<TYPE>::checkValidity( const std::vector<TYPE> &value ) const
{
// declare a class that can do conversions to string
std::ostringstream error;
// load in the "no error" condition
error << "";
typename std::vector<TYPE>::const_iterator it;
std::size_t index = 0;
for (it = value.begin(); it != value.end(); ++it)
{
std::string retval = this->boundVal->isValid(*it);
if ( !retval.empty() )
{
error << "At index " << index << ": " << retval;
}
index++;
}
return error.str();
}
template <typename TYPE>
bool ArrayBoundedValidator<TYPE>::hasLower() const
{
return this->boundVal->hasLower();
}
template <typename TYPE>
bool ArrayBoundedValidator<TYPE>::hasUpper() const
{
return this->boundVal->hasUpper();
}
template <typename TYPE>
const TYPE& ArrayBoundedValidator<TYPE>::lower() const
{
return this->boundVal->lower();
}
template <typename TYPE>
const TYPE& ArrayBoundedValidator<TYPE>::upper() const
{
return this->boundVal->upper();
}
template <typename TYPE>
void ArrayBoundedValidator<TYPE>::setLower( const TYPE& value )
{
this->boundVal->setLower(value);
}
template <typename TYPE>
void ArrayBoundedValidator<TYPE>::setUpper( const TYPE& value )
{
this->boundVal->setUpper(value);
}
template <typename TYPE>
void ArrayBoundedValidator<TYPE>::clearLower()
{
this->boundVal->clearLower();
}
template <typename TYPE>
void ArrayBoundedValidator<TYPE>::clearUpper()
{
this->boundVal->clearUpper();
}
// Required explicit instantiations
template class ArrayBoundedValidator<double>;
template class ArrayBoundedValidator<int>;
} // Kernel
} // Mantid