|
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) 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 1994-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 |
// Interface to the Grid ctor class. Grids contain a single array (the `main'
|
|
Packit |
a4aae4 |
// array) of dimension N and N single dimension arrays (map arrays). For any
|
|
Packit |
a4aae4 |
// dimension n of the main array, the size of the nth map array must match
|
|
Packit |
a4aae4 |
// the size of the main array's nth dimension. Grids are used to map
|
|
Packit |
a4aae4 |
// non-integer scales to multidimensional point data.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// jhrg 9/15/94
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _grid_h
|
|
Packit |
a4aae4 |
#define _grid_h 1
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <vector>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _basetype_h
|
|
Packit |
a4aae4 |
#include "BaseType.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _array_h
|
|
Packit |
a4aae4 |
#include "Array.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _constructor_h
|
|
Packit |
a4aae4 |
#include "Constructor.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef constraint_evaluator_h
|
|
Packit |
a4aae4 |
#include "ConstraintEvaluator.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class D4Grup;
|
|
Packit |
a4aae4 |
class XMLWriter;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** The Grid data type is a collection of an Array and a set of ``Map''
|
|
Packit |
a4aae4 |
vectors. The Map vectors are one-dimensional arrays corresponding
|
|
Packit |
a4aae4 |
to each dimension of the central Array. Using this scheme, a Grid
|
|
Packit |
a4aae4 |
can represent, in a rectilinear array, data which is not in
|
|
Packit |
a4aae4 |
reality rectilinear. An example will help make it clear.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Assume that the following array contains measurements of some real
|
|
Packit |
a4aae4 |
quantity, conducted at nine different points in space:
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
A = [ 1 2 3 4 ]
|
|
Packit |
a4aae4 |
[ 2 4 6 8 ]
|
|
Packit |
a4aae4 |
[ 3 6 9 12]
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
To locate this Array in the real world, we could note the location
|
|
Packit |
a4aae4 |
of one corner of the grid, and the grid spacing. This would allow
|
|
Packit |
a4aae4 |
us to calculate the location of any of the other points of the
|
|
Packit |
a4aae4 |
Array.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
This approach will not work, however, unless the grid spacing is
|
|
Packit |
a4aae4 |
precisely regular. If the distance between Row 1 and Row 2 is not
|
|
Packit |
a4aae4 |
the same as the distance between Row 2 and Row 3, the scheme will
|
|
Packit |
a4aae4 |
break down. The solution is to equip the Array with two Map
|
|
Packit |
a4aae4 |
vectors that define the location of each row or column of the
|
|
Packit |
a4aae4 |
array:
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
A = [ 1 2 3 4 ] Row = [ 0 ]
|
|
Packit |
a4aae4 |
[ 2 4 6 8 ] [ 3 ]
|
|
Packit |
a4aae4 |
[ 3 6 9 12] [ 8 ]
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Column = [ 0 2 8 27]
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The real location of the point in the first row and column of the
|
|
Packit |
a4aae4 |
array is now exactly fixed at (0,0), and the point in the last row
|
|
Packit |
a4aae4 |
and last column is at (8,27).
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The Grid data type has two parts: an Array, and a singly-linked
|
|
Packit |
a4aae4 |
list of Map vectors to describe the Array. The access functions
|
|
Packit |
a4aae4 |
for this class include a function to return the Array
|
|
Packit |
a4aae4 |
(<tt>get_array()</tt>), and a set of functions for cycling through the
|
|
Packit |
a4aae4 |
list of Map vectors.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@todo Move, in some sense, the d_map_vars up to Constructor. Look at using
|
|
Packit |
a4aae4 |
Constructor's _var field for these.
|
|
Packit |
a4aae4 |
@todo Along the same lines as the previous item, consider removing the
|
|
Packit |
a4aae4 |
Part enum and adopting the convention that the first variable added is
|
|
Packit |
a4aae4 |
the array and any subsequent variables are maps.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@brief Holds the Grid data type.
|
|
Packit |
a4aae4 |
@see Array
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class Grid: public Constructor
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
private:
|
|
Packit |
a4aae4 |
//BaseType *d_array_var; // weak pointer to the
|
|
Packit |
a4aae4 |
bool d_is_array_set;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
protected: // subclasses need access [mjohnson 11 nov 2009]
|
|
Packit |
a4aae4 |
void m_duplicate(const Grid &s);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Grid(const string &n);
|
|
Packit |
a4aae4 |
Grid(const string &n, const string &d);
|
|
Packit |
a4aae4 |
Grid(const Grid &rhs;;
|
|
Packit |
a4aae4 |
virtual ~Grid();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
typedef std::vector<BaseType *>::const_iterator Map_citer ;
|
|
Packit |
a4aae4 |
typedef std::vector<BaseType *>::iterator Map_iter ;
|
|
Packit |
a4aae4 |
typedef std::vector<BaseType *>::reverse_iterator Map_riter ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Grid &operator=(const Grid &rhs;;
|
|
Packit |
a4aae4 |
virtual BaseType *ptr_duplicate();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void transform_to_dap4(D4Group *root, Constructor *container);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual bool is_dap2_only_type();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void add_var(BaseType *bt, Part part);
|
|
Packit |
a4aae4 |
virtual void add_var_nocopy(BaseType *bt, Part part);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void set_array(Array* p_new_arr);
|
|
Packit |
a4aae4 |
virtual Array* add_map(Array* p_new_map, bool add_copy);
|
|
Packit |
a4aae4 |
virtual Array* prepend_map(Array* p_new_map, bool add_copy);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
BaseType *array_var();
|
|
Packit |
a4aae4 |
Array *get_array();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// virtual unsigned int width(bool constrained = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual int components(bool constrained = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual bool projection_yields_grid();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void clear_constraint();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void print_decl(ostream &out, string space = " ",
|
|
Packit |
a4aae4 |
bool print_semi = true,
|
|
Packit |
a4aae4 |
bool constraint_info = false,
|
|
Packit |
a4aae4 |
bool constrained = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void print_xml(ostream &out, string space = " ",
|
|
Packit |
a4aae4 |
bool constrained = false);
|
|
Packit |
a4aae4 |
virtual void print_xml_writer(XMLWriter &xml, bool constrained = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void print_val(ostream &out, string space = "",
|
|
Packit |
a4aae4 |
bool print_decl_p = true);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void print_decl(FILE *out, string space = " ",
|
|
Packit |
a4aae4 |
bool print_semi = true,
|
|
Packit |
a4aae4 |
bool constraint_info = false,
|
|
Packit |
a4aae4 |
bool constrained = false);
|
|
Packit |
a4aae4 |
virtual void print_xml(FILE *out, string space = " ",
|
|
Packit |
a4aae4 |
bool constrained = false);
|
|
Packit |
a4aae4 |
virtual void print_val(FILE *out, string space = "",
|
|
Packit |
a4aae4 |
bool print_decl_p = true);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void transfer_attributes(AttrTable *at_container);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual bool check_semantics(string &msg, bool all = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Map_iter map_begin() ;
|
|
Packit |
a4aae4 |
Map_iter map_end() ;
|
|
Packit |
a4aae4 |
Map_riter map_rbegin() ;
|
|
Packit |
a4aae4 |
Map_riter map_rend() ;
|
|
Packit |
a4aae4 |
Map_iter get_map_iter(int i);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void dump(ostream &strm) const ;
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#endif // _grid_h
|
|
Packit |
a4aae4 |
|