Skip to content

Commit

Permalink
Add noexcept to afw::math.
Browse files Browse the repository at this point in the history
  • Loading branch information
kfindeisen committed Jul 3, 2018
1 parent 8535fab commit e98c7d3
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 64 deletions.
32 changes: 21 additions & 11 deletions include/lsst/afw/math/Function.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ namespace math {

using boost::serialization::make_nvp;

/** Test that a Function's return value is nothrow-castable to T
*
* std::complex is an example of a numeric type that does not satisfy
* this requirement.
*/
template <typename T>
bool constexpr IS_NOTHROW_INIT = noexcept(static_cast<T>(1.0));

/**
* Basic Function class.
*
Expand Down Expand Up @@ -102,14 +110,14 @@ class Function : public lsst::daf::base::Citizen,
Function& operator=(Function const&) = default;
Function& operator=(Function&&) = default;

virtual ~Function() = default;
virtual ~Function() noexcept = default;

/**
* Return the number of function parameters
*
* @returns the number of function parameters
*/
unsigned int getNParameters() const { return _params.size(); }
unsigned int getNParameters() const noexcept { return _params.size(); }

/**
* Get one function parameter without range checking
Expand All @@ -126,7 +134,7 @@ class Function : public lsst::daf::base::Citizen,
*
* @returns the function parameters as a vector
*/
std::vector<double> const& getParameters() const { return _params; }
std::vector<double> const& getParameters() const noexcept { return _params; }

/**
* Is the function a linear combination of its parameters?
Expand All @@ -135,7 +143,7 @@ class Function : public lsst::daf::base::Citizen,
*
* @warning: subclasses must override if true.
*/
virtual bool isLinearCombination() const { return false; }
virtual bool isLinearCombination() const noexcept { return false; }

/**
* Set one function parameter without range checking
Expand Down Expand Up @@ -227,7 +235,7 @@ class Function1 : public afw::table::io::PersistableFacade<Function1<ReturnT>>,
Function1& operator=(Function1 const&) = default;
Function1& operator=(Function1&&) = default;

virtual ~Function1() = default;
virtual ~Function1() noexcept = default;

/**
* Return a pointer to a deep copy of this function
Expand Down Expand Up @@ -293,7 +301,7 @@ class Function2 : public afw::table::io::PersistableFacade<Function2<ReturnT>>,
Function2& operator=(Function2 const&) = default;
Function2& operator=(Function2&&) = default;

virtual ~Function2() = default;
virtual ~Function2() noexcept = default;

/**
* Return a pointer to a deep copy of this function
Expand Down Expand Up @@ -373,14 +381,14 @@ class BasePolynomialFunction2 : public Function2<ReturnT> {
BasePolynomialFunction2& operator=(BasePolynomialFunction2 const&) = default;
BasePolynomialFunction2& operator=(BasePolynomialFunction2&&) = default;

virtual ~BasePolynomialFunction2() = default;
virtual ~BasePolynomialFunction2() noexcept = default;

/**
* Get the polynomial order
*/
int getOrder() const { return _order; }
int getOrder() const noexcept { return _order; }

virtual bool isLinearCombination() const { return true; }
virtual bool isLinearCombination() const noexcept { return true; }

/**
* Compute number of parameters from polynomial order.
Expand Down Expand Up @@ -475,7 +483,7 @@ class NullFunction1 : public Function1<ReturnT> {
}

private:
ReturnT operator()(double) const { return static_cast<ReturnT>(0); }
ReturnT operator()(double) const noexcept(IS_NOTHROW_INIT<ReturnT>) { return static_cast<ReturnT>(0); }

private:
friend class boost::serialization::access;
Expand All @@ -497,7 +505,9 @@ class NullFunction2 : public Function2<ReturnT> {
}

private:
ReturnT operator()(double, double) const { return static_cast<ReturnT>(0); }
ReturnT operator()(double, double) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
return static_cast<ReturnT>(0);
}

private:
friend class boost::serialization::access;
Expand Down
64 changes: 33 additions & 31 deletions include/lsst/afw/math/FunctionLibrary.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,21 +54,23 @@ template <typename ReturnT>
class IntegerDeltaFunction1 : public Function1<ReturnT> {
public:
/**
* Construct an integer delta function with specified xo, yo
* Construct an integer delta function with specified xo
*/
explicit IntegerDeltaFunction1(double xo) : Function1<ReturnT>(0), _xo(xo) {}

IntegerDeltaFunction1(IntegerDeltaFunction1 const&) = default;
IntegerDeltaFunction1(IntegerDeltaFunction1&&) = default;
IntegerDeltaFunction1& operator=(IntegerDeltaFunction1 const&) = default;
IntegerDeltaFunction1& operator=(IntegerDeltaFunction1&&) = default;
virtual ~IntegerDeltaFunction1() = default;
virtual ~IntegerDeltaFunction1() noexcept = default;

virtual std::shared_ptr<Function1<ReturnT>> clone() const {
return std::shared_ptr<Function1<ReturnT>>(new IntegerDeltaFunction1(_xo));
}

virtual ReturnT operator()(double x) const { return static_cast<ReturnT>(x == _xo); }
virtual ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
return static_cast<ReturnT>(x == _xo);
}

virtual std::string toString(std::string const& prefix = "") const {
std::ostringstream os;
Expand Down Expand Up @@ -115,13 +117,13 @@ class IntegerDeltaFunction2 : public Function2<ReturnT> {
IntegerDeltaFunction2(IntegerDeltaFunction2&&) = default;
IntegerDeltaFunction2& operator=(IntegerDeltaFunction2 const&) = default;
IntegerDeltaFunction2& operator=(IntegerDeltaFunction2&&) = default;
virtual ~IntegerDeltaFunction2() = default;
virtual ~IntegerDeltaFunction2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(new IntegerDeltaFunction2(_xo, _yo));
}

virtual ReturnT operator()(double x, double y) const {
virtual ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
return static_cast<ReturnT>((x == _xo) && (y == _yo));
}

Expand Down Expand Up @@ -174,13 +176,13 @@ class GaussianFunction1 : public Function1<ReturnT> {
GaussianFunction1(GaussianFunction1&&) = default;
GaussianFunction1& operator=(GaussianFunction1 const&) = default;
GaussianFunction1& operator=(GaussianFunction1&&) = default;
virtual ~GaussianFunction1() = default;
virtual ~GaussianFunction1() noexcept = default;

virtual std::shared_ptr<Function1<ReturnT>> clone() const {
return std::shared_ptr<Function1<ReturnT>>(new GaussianFunction1(this->_params[0]));
}

virtual ReturnT operator()(double x) const {
virtual ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
return static_cast<ReturnT>((_multFac / this->_params[0]) *
std::exp(-(x * x) / (2.0 * this->_params[0] * this->_params[0])));
}
Expand Down Expand Up @@ -241,14 +243,14 @@ class GaussianFunction2 : public Function2<ReturnT> {
GaussianFunction2(GaussianFunction2&&) = default;
GaussianFunction2& operator=(GaussianFunction2 const&) = default;
GaussianFunction2& operator=(GaussianFunction2&&) = default;
virtual ~GaussianFunction2() = default;
virtual ~GaussianFunction2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(
new GaussianFunction2(this->_params[0], this->_params[1], this->_params[2]));
}

virtual ReturnT operator()(double x, double y) const {
virtual ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
if (_angle != this->_params[2]) {
_updateCache();
}
Expand Down Expand Up @@ -291,7 +293,7 @@ class GaussianFunction2 : public Function2<ReturnT> {
* The overhead is small, but the function is typically evaulated more often
* than its parameters are changed.
*/
void _updateCache() const {
void _updateCache() const noexcept {
_angle = this->_params[2];
_sinAngle = std::sin(_angle);
_cosAngle = std::cos(_angle);
Expand Down Expand Up @@ -355,14 +357,14 @@ class DoubleGaussianFunction2 : public Function2<ReturnT> {
DoubleGaussianFunction2(DoubleGaussianFunction2&&) = default;
DoubleGaussianFunction2& operator=(DoubleGaussianFunction2 const&) = default;
DoubleGaussianFunction2& operator=(DoubleGaussianFunction2&&) = default;
virtual ~DoubleGaussianFunction2() = default;
virtual ~DoubleGaussianFunction2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(
new DoubleGaussianFunction2(this->_params[0], this->_params[1], this->_params[2]));
}

virtual ReturnT operator()(double x, double y) const {
virtual ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
double radSq = (x * x) + (y * y);
double sigma1Sq = this->_params[0] * this->_params[0];
double sigma2Sq = this->_params[1] * this->_params[1];
Expand Down Expand Up @@ -438,15 +440,15 @@ class PolynomialFunction1 : public Function1<ReturnT> {
PolynomialFunction1(PolynomialFunction1&&) = default;
PolynomialFunction1& operator=(PolynomialFunction1 const&) = default;
PolynomialFunction1& operator=(PolynomialFunction1&&) = default;
virtual ~PolynomialFunction1() = default;
virtual ~PolynomialFunction1() noexcept = default;

virtual std::shared_ptr<Function1<ReturnT>> clone() const {
return std::shared_ptr<Function1<ReturnT>>(new PolynomialFunction1(this->_params));
}

virtual bool isLinearCombination() const { return true; };
virtual bool isLinearCombination() const noexcept { return true; };

virtual ReturnT operator()(double x) const {
virtual ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
int const order = static_cast<int>(this->_params.size()) - 1;
double retVal = this->_params[order];
for (int ii = order - 1; ii >= 0; --ii) {
Expand All @@ -458,7 +460,7 @@ class PolynomialFunction1 : public Function1<ReturnT> {
/**
* Get the polynomial order
*/
unsigned int getOrder() const { return this->getNParameters() - 1; };
unsigned int getOrder() const noexcept { return this->getNParameters() - 1; };

virtual std::string toString(std::string const& prefix) const {
std::ostringstream os;
Expand Down Expand Up @@ -525,13 +527,13 @@ class PolynomialFunction2 : public BasePolynomialFunction2<ReturnT> {
PolynomialFunction2(PolynomialFunction2&&) = default;
PolynomialFunction2& operator=(PolynomialFunction2 const&) = default;
PolynomialFunction2& operator=(PolynomialFunction2&&) = default;
virtual ~PolynomialFunction2() = default;
virtual ~PolynomialFunction2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(new PolynomialFunction2(this->_params));
}

virtual ReturnT operator()(double x, double y) const {
virtual ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
/* Solve as follows:
- f(x,y) = Cx0 + Cx1 x + Cx2 x^2 + Cx3 x^3 + ...
where:
Expand Down Expand Up @@ -671,7 +673,7 @@ class Chebyshev1Function1 : public Function1<ReturnT> {
Chebyshev1Function1(Chebyshev1Function1&&) = default;
Chebyshev1Function1& operator=(Chebyshev1Function1 const&) = default;
Chebyshev1Function1& operator=(Chebyshev1Function1&&) = default;
virtual ~Chebyshev1Function1() = default;
virtual ~Chebyshev1Function1() noexcept = default;

virtual std::shared_ptr<Function1<ReturnT>> clone() const {
return std::shared_ptr<Function1<ReturnT>>(new Chebyshev1Function1(this->_params, _minX, _maxX));
Expand All @@ -680,19 +682,19 @@ class Chebyshev1Function1 : public Function1<ReturnT> {
/**
* Get minimum allowed x
*/
double getMinX() const { return _minX; };
double getMinX() const noexcept { return _minX; };

/**
* Get maximum allowed x
*/
double getMaxX() const { return _maxX; };
double getMaxX() const noexcept { return _maxX; };

/**
* Get the polynomial order
*/
unsigned int getOrder() const { return this->getNParameters() - 1; };
unsigned int getOrder() const noexcept { return this->getNParameters() - 1; };

virtual bool isLinearCombination() const { return true; };
virtual bool isLinearCombination() const noexcept { return true; };

virtual ReturnT operator()(double x) const {
double xPrime = (x + _offset) * _scale;
Expand Down Expand Up @@ -826,7 +828,7 @@ class Chebyshev1Function2 : public BasePolynomialFunction2<ReturnT> {
Chebyshev1Function2(Chebyshev1Function2&&) = default;
Chebyshev1Function2& operator=(Chebyshev1Function2 const&) = default;
Chebyshev1Function2& operator=(Chebyshev1Function2&&) = default;
virtual ~Chebyshev1Function2() = default;
virtual ~Chebyshev1Function2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(
Expand All @@ -836,7 +838,7 @@ class Chebyshev1Function2 : public BasePolynomialFunction2<ReturnT> {
/**
* Get x,y range
*/
lsst::geom::Box2D getXYRange() const {
lsst::geom::Box2D getXYRange() const noexcept {
return lsst::geom::Box2D(lsst::geom::Point2D(_minX, _minY), lsst::geom::Point2D(_maxX, _maxY));
};

Expand Down Expand Up @@ -1025,13 +1027,13 @@ class LanczosFunction1 : public Function1<ReturnT> {
LanczosFunction1(LanczosFunction1&&) = default;
LanczosFunction1& operator=(LanczosFunction1 const&) = default;
LanczosFunction1& operator=(LanczosFunction1&&) = default;
virtual ~LanczosFunction1() = default;
virtual ~LanczosFunction1() noexcept = default;

virtual std::shared_ptr<Function1<ReturnT>> clone() const {
return std::shared_ptr<Function1<ReturnT>>(new LanczosFunction1(this->getOrder(), this->_params[0]));
}

virtual ReturnT operator()(double x) const {
virtual ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
double xArg1 = (x - this->_params[0]) * lsst::geom::PI;
double xArg2 = xArg1 * _invN;
if (std::fabs(xArg1) > 1.0e-5) {
Expand All @@ -1044,7 +1046,7 @@ class LanczosFunction1 : public Function1<ReturnT> {
/**
* Get the order of the Lanczos function
*/
unsigned int getOrder() const { return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };
unsigned int getOrder() const noexcept { return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };

virtual std::string toString(std::string const& prefix) const {
std::ostringstream os;
Expand Down Expand Up @@ -1100,14 +1102,14 @@ class LanczosFunction2 : public Function2<ReturnT> {
LanczosFunction2(LanczosFunction2&&) = default;
LanczosFunction2& operator=(LanczosFunction2 const&) = default;
LanczosFunction2& operator=(LanczosFunction2&&) = default;
virtual ~LanczosFunction2() = default;
virtual ~LanczosFunction2() noexcept = default;

virtual std::shared_ptr<Function2<ReturnT>> clone() const {
return std::shared_ptr<Function2<ReturnT>>(
new LanczosFunction2(this->getOrder(), this->_params[0], this->_params[1]));
}

virtual ReturnT operator()(double x, double y) const {
virtual ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT<ReturnT>) {
double xArg1 = (x - this->_params[0]) * lsst::geom::PI;
double xArg2 = xArg1 * _invN;
double xFunc = 1;
Expand All @@ -1126,7 +1128,7 @@ class LanczosFunction2 : public Function2<ReturnT> {
/**
* Get the order of Lanczos function
*/
unsigned int getOrder() const { return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };
unsigned int getOrder() const noexcept { return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };

virtual std::string toString(std::string const& prefix) const {
std::ostringstream os;
Expand Down

0 comments on commit e98c7d3

Please sign in to comment.