#include <config.h>
#include <sarray/SArray.h>
#include <stdexcept>
#include <cfloat>
const double JAGS_NA = -DBL_MAX*(1-1e-15);
using std::logic_error;
using std::length_error;
SArray::SArray(Index const &dim)
: _range(Index(dim.size()), dim)
{
unsigned long n = _range.length();
_value = new double[n];
for (unsigned long i = 0; i < n; ++i) {
_value[i] = JAGS_NA;
}
_fixed = false;
_discrete = false;
}
SArray::SArray(SArray const &orig)
: _range(orig._range)
{
unsigned long n = _range.length();
_value = new double[n];
for (unsigned long i = 0; i < n; ++i) {
_value[i] = orig._value[i];
}
_fixed = false;
_discrete = false;
}
SArray::~SArray()
{
delete [] _value;
}
bool SArray::isFixed() const
{
return _fixed;
}
void SArray::setValue(double const *value, unsigned long n)
{
if (_fixed) {
throw logic_error ("Attempt to set value of fixed SArray");
}
else if (n != _range.length()) {
throw length_error("Length mismatch error in SArray::setValue");
}
else {
for (unsigned long i = 0; i < n; ++i) {
_value[i] = value[i];
}
}
}
void SArray::setValue(double const value, unsigned long i)
{
if (_fixed) {
throw logic_error ("Attempt to set value of fixed SArray");
}
else if (i >= _range.length()) {
throw logic_error("Attempt to set value of invalid element of SArray");
}
else {
_value[i] = value;
}
}
void SArray::setFixed(bool fix)
{
if (fix) {
for (unsigned int i = 0; i < _range.length(); ++i) {
if (_value[i] == JAGS_NA)
throw logic_error("Attempt to fix SArray containing missing values");
}
}
_fixed = fix;
}
Range const &SArray::range() const
{
return _range;
}
void SArray::setDiscreteValued(bool discrete)
{
_discrete = discrete;
}
bool SArray::isDiscreteValued() const
{
return _discrete;
}
syntax highlighted by Code2HTML, v. 0.9.1