Blame tests/TestFunction.cc

Packit a4aae4
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) 2013 OPeNDAP, Inc.
Packit a4aae4
// Authors: Nathan Potter <npotter@opendap.org>
Packit a4aae4
//         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
#include "config.h"
Packit a4aae4
Packit a4aae4
#include <BaseType.h>
Packit a4aae4
#include <TestFloat64.h>
Packit a4aae4
#include <TestStr.h>
Packit a4aae4
#include <TestArray.h>
Packit a4aae4
Packit a4aae4
#include <Error.h>
Packit a4aae4
#include <DDS.h>
Packit a4aae4
Packit a4aae4
#include <debug.h>
Packit a4aae4
#include <util.h>
Packit a4aae4
Packit a4aae4
#include "TestFunction.h"
Packit a4aae4
Packit a4aae4
namespace libdap {
Packit a4aae4
Packit a4aae4
/**
Packit a4aae4
 * @brief scale a scalar or array variable
Packit a4aae4
 * This does not work for DAP2 Grids; only Array and scalar variables.
Packit a4aae4
 */
Packit a4aae4
void
Packit a4aae4
function_scale(int argc, BaseType * argv[], DDS &, BaseType **btpp)
Packit a4aae4
{
Packit a4aae4
    string info =
Packit a4aae4
    string("\n") +
Packit a4aae4
    "<function name=\"scale\" version=\"1.0\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions\">\n" +
Packit a4aae4
    "</function>";
Packit a4aae4
Packit a4aae4
    if (argc == 0) {
Packit a4aae4
        Str *response = new TestStr("info");
Packit a4aae4
        response->set_value(info);
Packit a4aae4
        *btpp = response;
Packit a4aae4
        return;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    // Check for 2 arguments
Packit a4aae4
    DBG(cerr << "argc = " << argc << endl);
Packit a4aae4
    if (argc != 2)
Packit a4aae4
        throw Error(malformed_expr,"Wrong number of arguments to scale().");
Packit a4aae4
Packit a4aae4
    double m = extract_double_value(argv[1]);
Packit a4aae4
Packit a4aae4
    DBG(cerr << "m: " << m << << endl);
Packit a4aae4
Packit a4aae4
    // Read the data, scale and return the result.
Packit a4aae4
    BaseType *dest = 0;
Packit a4aae4
    double *data;
Packit a4aae4
    if (argv[0]->is_vector_type()) {
Packit a4aae4
        TestArray &source = static_cast<TestArray&>(*argv[0]);
Packit a4aae4
        source.read();
Packit a4aae4
Packit a4aae4
        data = extract_double_array(&source);
Packit a4aae4
        int length = source.length();
Packit a4aae4
        for (int i = 0; i < length; ++i)
Packit a4aae4
            data[i] = data[i] * m;
Packit a4aae4
Packit a4aae4
        Array *result = new TestArray(source);
Packit a4aae4
Packit a4aae4
        result->add_var_nocopy(new TestFloat64(source.name()));
Packit a4aae4
        result->set_value(data, length);
Packit a4aae4
Packit a4aae4
        delete[] data; // set_value copies.
Packit a4aae4
Packit a4aae4
        dest = result;
Packit a4aae4
    }
Packit a4aae4
    else if (argv[0]->is_simple_type() && !(argv[0]->type() == dods_str_c || argv[0]->type() == dods_url_c)) {
Packit a4aae4
    	argv[0]->read();
Packit a4aae4
        double data = extract_double_value(argv[0]);
Packit a4aae4
Packit a4aae4
        data *= m;
Packit a4aae4
Packit a4aae4
        Float64 *fdest = new TestFloat64(argv[0]->name());
Packit a4aae4
Packit a4aae4
        fdest->set_value(data);
Packit a4aae4
        dest = fdest;
Packit a4aae4
    }
Packit a4aae4
    else {
Packit a4aae4
        throw Error(malformed_expr,"The scale() function works only for Arrays and scalars.");
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    *btpp = dest;
Packit a4aae4
    return;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
} // namespace libdap