Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ArrayLengthValidator.cpp 5.71 KiB
#include "MantidKernel/ArrayLengthValidator.h"

#include <boost/make_shared.hpp>
#include <cstdint>

using namespace Mantid::Kernel;

namespace Mantid {
namespace Kernel {

//----------------------------------------------------------------------------------------------
/** No arg constructor
 */
template <typename TYPE>
ArrayLengthValidator<TYPE>::ArrayLengthValidator()
    : TypedValidator<std::vector<TYPE>>(), m_arraySize(size_t(0)),
      m_hasArraySize(false), m_arraySizeMin(size_t(0)),
      m_hasArraySizeMin(false), m_arraySizeMax(size_t(0)),
      m_hasArraySizeMax(false) {}
//----------------------------------------------------------------------------------------------
/** Constructor
 * @param len:: the legth of the array
 */
template <typename TYPE>
ArrayLengthValidator<TYPE>::ArrayLengthValidator(const size_t len)
    : TypedValidator<std::vector<TYPE>>(), m_arraySize(size_t(len)),
      m_hasArraySize(true), m_arraySizeMin(size_t(0)), m_hasArraySizeMin(false),
      m_arraySizeMax(size_t(0)), m_hasArraySizeMax(false) {}
//----------------------------------------------------------------------------------------------
/** Constructor
 * @param lenmin:: the minimum legth of the array
 * @param lenmax:: the maximum legth of the array
 */
template <typename TYPE>
ArrayLengthValidator<TYPE>::ArrayLengthValidator(const size_t lenmin,
                                                 const size_t lenmax)
    : TypedValidator<std::vector<TYPE>>(), m_arraySize(size_t(0)),
      m_hasArraySize(false), m_arraySizeMin(size_t(lenmin)),
      m_hasArraySizeMin(true), m_arraySizeMax(size_t(lenmax)),
      m_hasArraySizeMax(true) {}
//----------------------------------------------------------------------------------------------
/** Destructor
 */
template <typename TYPE> ArrayLengthValidator<TYPE>::~ArrayLengthValidator() {}

/**
  Check if length is set
  @returns true/false
 */
template <typename TYPE> bool ArrayLengthValidator<TYPE>::hasLength() const {
  return this->m_hasArraySize;
}

/**
  Check if minimum length is set
  @returns true/false
 */
template <typename TYPE> bool ArrayLengthValidator<TYPE>::hasMinLength() const {
  return this->m_hasArraySizeMin;
}

/**
  Check if maximum length is set
  @returns true/false
 */
template <typename TYPE> bool ArrayLengthValidator<TYPE>::hasMaxLength() const {
  return this->m_hasArraySizeMax;
}

/**
  Function to retun the set length
  @returns  m_arraySize
 */
template <typename TYPE>
const size_t &ArrayLengthValidator<TYPE>::getLength() const {
  return this->m_arraySize;
}

/**
  Function to retun the set minimum length
  @returns  m_arraySize
 */
template <typename TYPE>
const size_t &ArrayLengthValidator<TYPE>::getMinLength() const {
  return this->m_arraySizeMin;
}

/**
  Function to retun the set maximum length
  @returns  m_arraySize
 */
template <typename TYPE>
const size_t &ArrayLengthValidator<TYPE>::getMaxLength() const {
  return this->m_arraySizeMax;
}

/**
  Function to set the length. It will automatically clear the minimum and
  maximum
  @param  value:: size_t type
 */
template <typename TYPE>
void ArrayLengthValidator<TYPE>::setLength(const size_t &value) {
  this->m_hasArraySize = true;
  this->m_arraySize = value;
  this->clearLengthMax();
  this->clearLengthMin();
}

/**
  Function to set the minimum length. It will automatically clear the set length
  @param  value:: size_t type
 */
template <typename TYPE>
void ArrayLengthValidator<TYPE>::setLengthMin(const size_t &value) {
  this->m_hasArraySizeMin = true;
  this->m_arraySizeMin = value;
  this->clearLength();
}
/**
  Function to set the maximum length. It will automatically clear the set length
  @param  value:: size_t type
 */
template <typename TYPE>
void ArrayLengthValidator<TYPE>::setLengthMax(const size_t &value) {
  this->m_hasArraySizeMax = true;
  this->m_arraySizeMax = value;
  this->clearLength();
}

/**
  Function to unset the length. It sets  m_hasArraySize to false, and the
  m_arraySize to 0
 */
template <typename TYPE> void ArrayLengthValidator<TYPE>::clearLength() {
  this->m_hasArraySize = false;
  this->m_arraySize = size_t(0);
}

/**
  Function to unset the minimum length. It sets  m_hasArraySizeMin to false, and
  the m_arraySizeMin to 0
 */
template <typename TYPE> void ArrayLengthValidator<TYPE>::clearLengthMin() {
  this->m_hasArraySizeMin = false;
  this->m_arraySizeMin = size_t(0);
}

/**
  Function to unset the maximum length. It sets  m_hasArraySizeMax to false, and
  the m_arraySizeMax to 0
 */
template <typename TYPE> void ArrayLengthValidator<TYPE>::clearLengthMax() {
  this->m_hasArraySizeMax = false;
  this->m_arraySizeMax = size_t(0);
}

/**
  Clone function
  @returns a clone of the validator
  */
template <typename TYPE>
IValidator_sptr ArrayLengthValidator<TYPE>::clone() const {
  return boost::make_shared<ArrayLengthValidator>(*this);
}

/**
Private function to check validity
@returns a string. The string is emty if everything is OK, otherwise returns the
error
*/
template <typename TYPE>
std::string ArrayLengthValidator<TYPE>::checkValidity(
    const std::vector<TYPE> &value) const {
  if (this->hasLength() && value.size() != this->m_arraySize) {
    return "Incorrect size";
  }
  if (this->hasMinLength() && value.size() < this->m_arraySizeMin) {
    return "Array size too short";
  }
  if (this->hasMaxLength() && value.size() > this->m_arraySizeMax) {
    return "Array size too long";
  }
  return "";
}

// Required explicit instantiations
template class ArrayLengthValidator<double>;
template class ArrayLengthValidator<int32_t>;
template class ArrayLengthValidator<int64_t>;
template class ArrayLengthValidator<std::string>;
#if defined(_WIN32) || defined(__clang__) && defined(__APPLE__)
template class ArrayLengthValidator<long>;
#endif
} // namespace Mantid
} // namespace Kernel