Blame Grid.h

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