|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// (c) COPYRIGHT URI/MIT 1995-1996,1999
|
|
Packit |
a4aae4 |
// Please read the full copyright statement in the file COPYRIGHT_URI.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Authors:
|
|
Packit |
a4aae4 |
// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Implementation for TestArray. See TestByte.cc
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// jhrg 1/12/95
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cstring>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef HAVE_UNISTD_H
|
|
Packit |
a4aae4 |
#include <unistd.h>
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef WIN32
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
#include <io.h>
|
|
Packit |
a4aae4 |
#include <fcntl.h>
|
|
Packit |
a4aae4 |
#include <process.h>
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//#define DODS_DEBUG
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestInt8.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestByte.h"
|
|
Packit |
a4aae4 |
#include "TestInt16.h"
|
|
Packit |
a4aae4 |
#include "TestUInt16.h"
|
|
Packit |
a4aae4 |
#include "TestInt32.h"
|
|
Packit |
a4aae4 |
#include "TestUInt32.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestInt64.h"
|
|
Packit |
a4aae4 |
#include "TestUInt64.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestD4Enum.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestFloat32.h"
|
|
Packit |
a4aae4 |
#include "TestFloat64.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestStr.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "TestArray.h"
|
|
Packit |
a4aae4 |
#include "TestCommon.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using std::cerr;
|
|
Packit |
a4aae4 |
using std::endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
extern int test_variable_sleep_interval;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void TestArray::_duplicate(const TestArray &ts)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
d_series_values = ts.d_series_values;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
BaseType *
|
|
Packit |
a4aae4 |
TestArray::ptr_duplicate()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return new TestArray(*this);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestArray::TestArray(const string &n, BaseType *v, bool is_dap4) :
|
|
Packit |
a4aae4 |
Array(n, v, is_dap4), d_series_values(false)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestArray::TestArray(const string &n, const string &d, BaseType *v, bool is_dap4) :
|
|
Packit |
a4aae4 |
Array(n, d, v, is_dap4), d_series_values(false)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestArray::TestArray(const TestArray &rhs) :
|
|
Packit |
a4aae4 |
Array(rhs), TestCommon(rhs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
_duplicate(rhs);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestArray::~TestArray()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestArray &
|
|
Packit |
a4aae4 |
TestArray::operator=(const TestArray &rhs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (this == &rhs) return *this;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dynamic_cast<Array &>(*this) = rhs;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
_duplicate(rhs);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return *this;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This code calls 'output_values()' because print_val() does not test
|
|
Packit |
a4aae4 |
// the value of send_p(). We need to wrap a method around the calls to
|
|
Packit |
a4aae4 |
// print_val() to ensure that only values for variables with send_p() set
|
|
Packit |
a4aae4 |
// are called. In the serialize/deserialize case, the 'client' DDS only
|
|
Packit |
a4aae4 |
// has variables sent by the 'server' but in the intern_data() case, the
|
|
Packit |
a4aae4 |
// whole DDS is still present but only variables selected in the CE have
|
|
Packit |
a4aae4 |
// values.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
unsigned int TestArray::m_print_array(ostream &out, unsigned int index, unsigned int dims, unsigned int shape[])
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (dims == 1) {
|
|
Packit |
a4aae4 |
out << "{";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Added this test for zero-length arrays. jhrg 1/28/16
|
|
Packit |
a4aae4 |
if (shape[0] >= 1) {
|
|
Packit |
a4aae4 |
for (unsigned i = 0; i < shape[0] - 1; ++i) {
|
|
Packit |
a4aae4 |
dynamic_cast<TestCommon&>(*var(index++)).output_values(out);
|
|
Packit |
a4aae4 |
out << ", ";
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dynamic_cast<TestCommon&>(*var(index++)).output_values(out);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
out << "}";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return index;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
out << "{";
|
|
Packit |
a4aae4 |
// Fixed an off-by-one error in the following loop. Since the array
|
|
Packit |
a4aae4 |
// length is shape[dims-1]-1 *and* since we want one less dimension
|
|
Packit |
a4aae4 |
// than that, the correct limit on this loop is shape[dims-2]-1. From
|
|
Packit |
a4aae4 |
// Todd Karakasian.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// The saga continues; the loop test should be `i < shape[0]-1'. jhrg
|
|
Packit |
a4aae4 |
// 9/12/96.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Added this (primitive) guard against errors when a zero-length array
|
|
Packit |
a4aae4 |
// is declared with a shape like [0][4]. jhrg 1/28/16
|
|
Packit |
a4aae4 |
if (shape[0] > 0) {
|
|
Packit |
a4aae4 |
for (unsigned i = 0; i < shape[0] - 1; ++i) {
|
|
Packit |
a4aae4 |
index = m_print_array(out, index, dims - 1, shape + 1);
|
|
Packit |
a4aae4 |
out << ",";
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
index = m_print_array(out, index, dims - 1, shape + 1);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
out << "}";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return index;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void TestArray::output_values(std::ostream &out)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
//unsigned int *shape = new unsigned int[dimensions(true)];
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<unsigned int> shape(dimensions(true));
|
|
Packit |
a4aae4 |
unsigned int index = 0;
|
|
Packit |
a4aae4 |
for (Dim_iter i = dim_begin(); i != dim_end() && index < dimensions(true); ++i)
|
|
Packit |
a4aae4 |
shape[index++] = dimension_size(i, true);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
m_print_array(out, 0, dimensions(true), &shape[0]);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//delete[] shape;
|
|
Packit |
a4aae4 |
//shape = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Special names are ones that start with 'lat' or 'lon'. These indicate
|
|
Packit |
a4aae4 |
that the vector (this is only for vectors) is a vector of latitude or
|
|
Packit |
a4aae4 |
longitude values. */
|
|
Packit |
a4aae4 |
bool TestArray::m_name_is_special()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return (name().find("lat") != string::npos || name().find("lon") != string::npos);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void TestArray::m_build_special_values()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (name().find("lat_reversed") != string::npos) {
|
|
Packit |
a4aae4 |
int array_len = length();
|
|
Packit |
a4aae4 |
//double *lat_data = new double[array_len];
|
|
Packit |
a4aae4 |
vector<double> lat_data(array_len);
|
|
Packit |
a4aae4 |
for (int i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
lat_data[i] = -89 + (180 / array_len) * (i + 1);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
libdap::set_array_using_double(this, &lat_data[0], array_len);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else if (name().find("lat") != string::npos) {
|
|
Packit |
a4aae4 |
int array_len = length();
|
|
Packit |
a4aae4 |
// double *lat_data = new double[array_len];
|
|
Packit |
a4aae4 |
vector<double> lat_data(array_len);
|
|
Packit |
a4aae4 |
for (int i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
lat_data[i] = 90 - (180 / array_len) * (i + 1);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
libdap::set_array_using_double(this, &lat_data[0], array_len);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else if (name().find("lon") != string::npos) {
|
|
Packit |
a4aae4 |
int array_len = length();
|
|
Packit |
a4aae4 |
//double *lon_data = new double[array_len];
|
|
Packit |
a4aae4 |
vector<double> lon_data(array_len);
|
|
Packit |
a4aae4 |
for (int i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
lon_data[i] = (360 / array_len) * (i + 1);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
libdap::set_array_using_double(this, &lon_data[0], array_len);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Unrecognized name");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int TestArray::m_offset(int y, Dim_iter X, int x)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return y * dimension_size(X, false) + x;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* @brief Load an 2D array with values.
|
|
Packit |
a4aae4 |
* Use the read() function for the prototype element of the array to
|
|
Packit |
a4aae4 |
* get values and load them into an array, then constrain the array.
|
|
Packit |
a4aae4 |
* Thus if 'series values' are used and the array is constrained, the
|
|
Packit |
a4aae4 |
* result will 'make sense'
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param constrained_array
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
template<typename T, class C>
|
|
Packit |
a4aae4 |
void TestArray::m_constrained_matrix(vector<T>&constrained_array)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
int unconstrained_size = 1;
|
|
Packit |
a4aae4 |
Dim_iter d = dim_begin();
|
|
Packit |
a4aae4 |
while (d != dim_end())
|
|
Packit |
a4aae4 |
unconstrained_size *= dimension_size(d++, false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<T> whole_array(unconstrained_size);
|
|
Packit |
a4aae4 |
for (int i = 0; i < unconstrained_size; ++i) {
|
|
Packit |
a4aae4 |
T v;
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
if (var()->type() == dods_enum_c)
|
|
Packit |
a4aae4 |
static_cast<C*>(var())->value(&v);
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
v = static_cast<C*>(var())->value();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
whole_array[i] = v;
|
|
Packit |
a4aae4 |
var()->set_read_p(false); // pick up the next value
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "whole_array: "; copy(whole_array.begin(), whole_array.end(), ostream_iterator<T>(cerr, ", ")); cerr << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Dim_iter Y = dim_begin();
|
|
Packit |
a4aae4 |
Dim_iter X = Y + 1;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "dimension_start(Y): " << dimension_start(Y) << endl); DBG(cerr << "dimension_stop(Y): " << dimension_stop(Y) << endl); DBG(cerr << "dimension_start(X): " << dimension_start(X) << endl); DBG(cerr << "dimension_stop(X): " << dimension_stop(X) << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int constrained_size = 0;
|
|
Packit |
a4aae4 |
int y = dimension_start(Y);
|
|
Packit |
a4aae4 |
while (y < dimension_stop(Y) + 1) {
|
|
Packit |
a4aae4 |
int x = dimension_start(X);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while (x < dimension_stop(X) + 1) {
|
|
Packit |
a4aae4 |
constrained_array[constrained_size++] = whole_array[m_offset(y, X, x)];
|
|
Packit |
a4aae4 |
x += dimension_stride(X);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
y += dimension_stride(Y);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
template<typename T>
|
|
Packit |
a4aae4 |
void TestArray::m_enum_constrained_matrix(vector<T>&constrained_array)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
int unconstrained_size = 1;
|
|
Packit |
a4aae4 |
Dim_iter d = dim_begin();
|
|
Packit |
a4aae4 |
while (d != dim_end())
|
|
Packit |
a4aae4 |
unconstrained_size *= dimension_size(d++, false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<T> whole_array(unconstrained_size);
|
|
Packit |
a4aae4 |
for (int i = 0; i < unconstrained_size; ++i) {
|
|
Packit |
a4aae4 |
T v;
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
static_cast<D4Enum*>(var())->value(&v);
|
|
Packit |
a4aae4 |
whole_array[i] = v;
|
|
Packit |
a4aae4 |
var()->set_read_p(false); // pick up the next value
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "whole_array: "; copy(whole_array.begin(), whole_array.end(), ostream_iterator<T>(cerr, ", ")); cerr << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Dim_iter Y = dim_begin();
|
|
Packit |
a4aae4 |
Dim_iter X = Y + 1;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "dimension_start(Y): " << dimension_start(Y) << endl); DBG(cerr << "dimension_stop(Y): " << dimension_stop(Y) << endl); DBG(cerr << "dimension_start(X): " << dimension_start(X) << endl); DBG(cerr << "dimension_stop(X): " << dimension_stop(X) << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int constrained_size = 0;
|
|
Packit |
a4aae4 |
int y = dimension_start(Y);
|
|
Packit |
a4aae4 |
while (y < dimension_stop(Y) + 1) {
|
|
Packit |
a4aae4 |
int x = dimension_start(X);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while (x < dimension_stop(X) + 1) {
|
|
Packit |
a4aae4 |
constrained_array[constrained_size++] = whole_array[m_offset(y, X, x)];
|
|
Packit |
a4aae4 |
x += dimension_stride(X);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
y += dimension_stride(Y);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Load the variable's internal data buffer with values, simulating a read()
|
|
Packit |
a4aae4 |
* call to some data store. A private method.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
template<typename T, class C>
|
|
Packit |
a4aae4 |
void TestArray::m_cardinal_type_read_helper()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (get_series_values()) {
|
|
Packit |
a4aae4 |
// Special case code for vectors that have specific names.
|
|
Packit |
a4aae4 |
// This is used to test code that works with lat/lon data.
|
|
Packit |
a4aae4 |
if (dimensions() == 1 && m_name_is_special()) {
|
|
Packit |
a4aae4 |
m_build_special_values();
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else if (dimensions() == 2) {
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
m_constrained_matrix<T, C>(tmp);
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
for (int64_t i = 0, end = length(); i < end; ++i) {
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
tmp[i] = static_cast<C*>(var())->value();
|
|
Packit |
a4aae4 |
var()->set_read_p(false); // pick up the next value
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
// read a value into the Array's prototype element
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
T value = static_cast<C*>(var())->value();
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
for (int64_t i = 0, end = length(); i < end; ++i) {
|
|
Packit |
a4aae4 |
tmp[i] = value;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Load the variable's internal data buffer with values, simulating a read()
|
|
Packit |
a4aae4 |
* call to some data store. A private method.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
template<typename T>
|
|
Packit |
a4aae4 |
void TestArray::m_enum_type_read_helper()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (get_series_values()) {
|
|
Packit |
a4aae4 |
if (dimensions() == 2) {
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
m_enum_constrained_matrix<T>(tmp);
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
for (int64_t i = 0, end = length(); i < end; ++i) {
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
T v;
|
|
Packit |
a4aae4 |
static_cast<D4Enum*>(var())->value(&v);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
tmp[i] = v;
|
|
Packit |
a4aae4 |
var()->set_read_p(false); // pick up the next value
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
// read a value into the Array's prototype element
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
T value;
|
|
Packit |
a4aae4 |
static_cast<D4Enum*>(var())->value(&value);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<T> tmp(length());
|
|
Packit |
a4aae4 |
for (int64_t i = 0, end = length(); i < end; ++i) {
|
|
Packit |
a4aae4 |
tmp[i] = value;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
set_value(tmp, length());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool TestArray::read()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (read_p()) return true;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (test_variable_sleep_interval > 0) sleep(test_variable_sleep_interval);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int64_t array_len = length(); // elements in the array
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
switch (var()->type()) {
|
|
Packit |
a4aae4 |
// These are the DAP2 types and the classes that implement them all define
|
|
Packit |
a4aae4 |
// the old buf2val() and val2buf() methods. For the new DAP4 types see below.
|
|
Packit |
a4aae4 |
//case dods_byte_c:
|
|
Packit |
a4aae4 |
//case dods_uint8_c:
|
|
Packit |
a4aae4 |
case dods_int16_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_int16, Int16>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_uint16_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_uint16, UInt16>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_int32_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_int32, Int32>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_uint32_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_uint32, UInt32>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_float32_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_float32, Float32>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_float64_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_float64, Float64>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_int8_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_int8, Int8>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_byte_c:
|
|
Packit |
a4aae4 |
case dods_char_c:
|
|
Packit |
a4aae4 |
case dods_uint8_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_byte, Byte>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_int64_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_int64, Int64>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_uint64_c:
|
|
Packit |
a4aae4 |
m_cardinal_type_read_helper<dods_uint64, UInt64>();
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_enum_c:
|
|
Packit |
a4aae4 |
switch (static_cast<D4Enum*>(var())->element_type()) {
|
|
Packit |
a4aae4 |
case dods_byte_c:
|
|
Packit |
a4aae4 |
case dods_char_c:
|
|
Packit |
a4aae4 |
case dods_uint8_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_byte>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_int8_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_int8>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_int16_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_int16>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_uint16_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_uint16>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_int32_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_int32>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_uint32_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_uint32>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_int64_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_int64>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case dods_uint64_c:
|
|
Packit |
a4aae4 |
m_enum_type_read_helper<dods_uint64>();
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Enum with undefined type.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_str_c:
|
|
Packit |
a4aae4 |
case dods_url_c: {
|
|
Packit |
a4aae4 |
vector<string> tmp(array_len);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (get_series_values()) {
|
|
Packit |
a4aae4 |
for (int64_t i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
// URL isa Str
|
|
Packit |
a4aae4 |
tmp[i] = static_cast<Str*>(var())->value();
|
|
Packit |
a4aae4 |
var()->set_read_p(false); // pick up the next value
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
var()->read();
|
|
Packit |
a4aae4 |
string value = static_cast<Str*>(var())->value();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
for (unsigned i = 0; i < array_len; ++i)
|
|
Packit |
a4aae4 |
tmp[i] = value;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
set_value(tmp, array_len);
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_opaque_c:
|
|
Packit |
a4aae4 |
case dods_structure_c:
|
|
Packit |
a4aae4 |
vec_resize(array_len);
|
|
Packit |
a4aae4 |
for (unsigned i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
// Copy the prototype and read a value into it
|
|
Packit |
a4aae4 |
BaseType *elem = var()->ptr_duplicate();
|
|
Packit |
a4aae4 |
elem->read();
|
|
Packit |
a4aae4 |
// Load the new value into this object's array
|
|
Packit |
a4aae4 |
set_vec_nocopy(i, elem); // Use set_vec_nocopy() TODO (and below)
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case dods_sequence_c:
|
|
Packit |
a4aae4 |
// No sequence arrays in DAP2
|
|
Packit |
a4aae4 |
if (!is_dap4()) throw InternalErr(__FILE__, __LINE__, "Bad data type");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vec_resize(array_len);
|
|
Packit |
a4aae4 |
for (unsigned i = 0; i < array_len; ++i) {
|
|
Packit |
a4aae4 |
// Load the new BaseType (a D4Sequence) into the array element
|
|
Packit |
a4aae4 |
set_vec_nocopy(i, var()->ptr_duplicate());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// No Grids in DAP4; No arrays of arrays and no null-typed vars in DAP2 or 4
|
|
Packit |
a4aae4 |
case dods_grid_c:
|
|
Packit |
a4aae4 |
case dods_array_c:
|
|
Packit |
a4aae4 |
case dods_null_c:
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Bad data type");
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// set_read_p(true);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return true;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void TestArray::set_series_values(bool sv)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
dynamic_cast<TestCommon&>(*var()).set_series_values(sv);
|
|
Packit |
a4aae4 |
d_series_values = sv;
|
|
Packit |
a4aae4 |
}
|