Skip to content
Snippets Groups Projects
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