Array.h
// -*- mode: c++; c-basic-offset:4 -*-
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
// Access Protocol.
// Copyright (c) 2002,2003 OPeNDAP, Inc.
// Author: James Gallagher <jgallagher@opendap.org>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
// (c) COPYRIGHT URI/MIT 1994-1999
// Please read the full copyright statement in the file COPYRIGHT_URI.
//
// Authors:
// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
// Class for array variables. The dimensions of the array are stored in the
// list SHAPE.
//
// jhrg 9/6/94
#ifndef _array_h
#define _array_h 1
#include <string>
#include <vector>
#ifndef _dods_limits_h
#include "dods-limits.h"
#endif
#ifndef _vector_h
#include "Vector.h"
#endif
//#include "D4Dimensions.h"
namespace libdap
{
class D4Group;
class D4Maps;
class XMLWriter;
class D4Dimension;
class D4Dimensions;
const int DODS_MAX_ARRAY = DODS_INT_MAX;
class Array: public Vector
{
public:
struct dimension
{
// In DAP2, the name and size of a dimension is stored here, along
// with information about any constraint. In DAP4, either the name
// and size are stored in the two fields below _or_ the name and
// size information comes from a dimension object defined in a
// group that is referenced by the 'dim' pointer. Do not free this
// pointer; it is shared between the array and the Group where the
// Dimension is defined. To keep Array manageable to implement, size
// will be set here using the value from 'dim' if it is not null.
int64_t size;
string name;
D4Dimension *dim;
// when a DMR is printed for a data response, if an array uses shared
// dimensions and those sdims have been sliced, make sure to use those
// and get the syntax correct. That's what this field does - in every
// case the array records the sizes of its dimensions and their slices
// regardless of whether they were provided explicitly in a CE or inherited
// from a sliced sdim.
bool use_sdim_for_slice;
int64_t start;
int64_t stop;
int64_t stride;
int64_t c_size;
dimension() : size(0), name(""), dim(0), use_sdim_for_slice(false) {
// this information changes with each constraint expression
start = 0;
stop = 0;
stride = 1;
c_size = size;
}
dimension(int64_t s, string n) : size(s), name(n), dim(0), use_sdim_for_slice(false) {
start = 0;
stop = size - 1;
stride = 1;
c_size = size;
}
explicit dimension(D4Dimension *d);
};
// The following two structs are for the direct IO optimization.
// The variable chunk and compression information need to be passed
// between two BES modules. The ideal approach is to use the
// dynamic_cast for a BES module to retrieve the information stored
// by another module. However, there are issues in the current BES
// that prevent us from implementing in this way.
// So we need to use libdap to do the job.
struct var_chunk_info_t{
unsigned int filter_mask;
unsigned long long chunk_direct_io_offset;
unsigned long long chunk_buffer_size;
vector<unsigned long long> chunk_coords;
};
struct var_storage_info {
string filter;
vector<unsigned int>deflate_levels;
vector<size_t> chunk_dims;
vector<var_chunk_info_t> var_chunk_info;
};
private:
D4Maps *d_maps = nullptr;
std::vector<dimension> _shape; // list of dimensions (i.e., the shape)
bool direct_io_flag = false;
var_storage_info vs_info;
void update_dimension_pointers(D4Dimensions *old_dims, D4Dimensions *new_dims);
friend class ArrayTest;
friend class D4Group;
protected:
void _duplicate(const Array &a);
uint64_t print_array(FILE *out, uint64_t index,
unsigned int dims, uint64_t shape[]);
uint64_t print_array(ostream &out, uint64_t index,
unsigned int dims, uint64_t shape[]);
std::vector<dimension> &shape(){
return _shape;
}
public:
typedef std::vector<dimension>::const_iterator Dim_citer;
typedef std::vector<dimension>::iterator Dim_iter;
Array(const string &n, BaseType *v, bool is_dap4 = false);
Array(const string &n, const string &d, BaseType *v, bool is_dap4 = false);
Array(const Array &rhs);
virtual ~Array();
Array &operator=(const Array &rhs);
BaseType *ptr_duplicate() override;
bool is_dap2_grid();
void transform_to_dap4(D4Group *root, Constructor *container) override;
std::vector<BaseType *> *transform_to_dap2(AttrTable *parent_attr_table) override;
void add_var(BaseType *v, Part p = nil) override;
void add_var_nocopy(BaseType *v, Part p = nil) override;
void append_dim(int size, const string &name = "");
void append_dim_ll(int64_t size, const string &name = "");
void append_dim(D4Dimension *dim);
void prepend_dim(int size, const string& name = "");
void prepend_dim(D4Dimension *dim);
void clear_all_dims();
void rename_dim(const string &oldName = "", const string &newName = "");
virtual void add_constraint(Dim_iter i, int start, int stride, int stop);
virtual void add_constraint_ll(Dim_iter i, int64_t start, int64_t stride, int64_t stop);
virtual void add_constraint(Dim_iter i, D4Dimension *dim);
virtual void reset_constraint();
virtual void clear_constraint(); // deprecated
virtual void update_length(int size = 0); // should be used internally only
virtual void update_length_ll(unsigned long long size = 0); // should be used internally only
Dim_iter dim_begin() ;
Dim_iter dim_end() ;
virtual int dimension_size(Dim_iter i, bool constrained = false);
virtual int dimension_start(Dim_iter i, bool constrained = false);
virtual int dimension_stop(Dim_iter i, bool constrained = false);
virtual int dimension_stride(Dim_iter i, bool constrained = false);
virtual int64_t dimension_size_ll(Dim_iter i, bool constrained = false);
virtual int64_t dimension_start_ll(Dim_iter i, bool constrained = false);
virtual int64_t dimension_stop_ll(Dim_iter i, bool constrained = false);
virtual int64_t dimension_stride_ll(Dim_iter i, bool constrained = false);
virtual string dimension_name(Dim_iter i);
virtual D4Dimension *dimension_D4dim(Dim_iter i);
virtual unsigned int dimensions(bool constrained = false);
virtual D4Maps *maps();
void print_dap4(XMLWriter &xml, bool constrained = false) override;
// These are all DAP2 output methods
void print_decl(ostream &out, string space = " ",
bool print_semi = true,
bool constraint_info = false,
bool constrained = false) override;
void print_xml(ostream &out, string space = " ",
bool constrained = false) override;
void print_xml_writer(XMLWriter &xml, bool constrained = false) override;
virtual void print_xml_writer_core(XMLWriter &out, bool constrained, string tag);
virtual void print_as_map_xml_writer(XMLWriter &xml, bool constrained);
virtual void print_xml_core(FILE *out, string space, bool constrained, string tag);
virtual void print_xml_core(ostream &out, string space, bool constrained, string tag);
// not used (?)
virtual void print_as_map_xml(ostream &out, string space = " ",
bool constrained = false);
void print_val(ostream &out, string space = "",
bool print_decl_p = true) override;
void print_xml(FILE *out, string space = " ",
bool constrained = false) override;
virtual void print_as_map_xml(FILE *out, string space = " ",
bool constrained = false);
void print_val(FILE *out, string space = "",
bool print_decl_p = true) override;
void print_decl(FILE *out, string space = " ",
bool print_semi = true,
bool constraint_info = false,
bool constrained = false) override;
bool check_semantics(string &msg, bool all = false) override;
bool is_dap4_projected(std::vector<std::string> &projected_dap4_inventory) override;
void dump(ostream &strm) const override;
// The following methods are for direct IO optimization.
bool get_dio_flag() const {return direct_io_flag; }
void set_dio_flag( bool dio_flag_value = true) { direct_io_flag = dio_flag_value; }
var_storage_info & get_var_storage_info() {return vs_info;}
void set_var_storage_info(const var_storage_info &my_vs_info);
};
} // namespace libdap
#endif // _array_h
libdap::Array
A multidimensional array of identical data types.
Definition Array.h:123
libdap::Array::print_dap4
void print_dap4(XMLWriter &xml, bool constrained=false) override
Print the DAP4 representation of an array.
Definition Array.cc:1082
libdap::Array::dimension_start
virtual int dimension_start(Dim_iter i, bool constrained=false)
Return the start index of a dimension.
Definition Array.cc:849
libdap::Array::clear_constraint
virtual void clear_constraint()
Clears the projection; add each projected dimension explicitly using add_constraint.
Definition Array.cc:639
libdap::Array::dim_end
Dim_iter dim_end()
Definition Array.cc:768
libdap::Array::dimension_stop
virtual int dimension_stop(Dim_iter i, bool constrained=false)
Return the stop index of the constraint.
Definition Array.cc:876
libdap::Array::dump
void dump(ostream &strm) const override
dumps information about this object
Definition Array.cc:1495
libdap::Array::update_length
virtual void update_length(int size=0)
Definition Array.cc:102
libdap::Array::is_dap4_projected
bool is_dap4_projected(std::vector< std::string > &projected_dap4_inventory) override
Definition Array.cc:1467
libdap::Array::add_constraint
virtual void add_constraint(Dim_iter i, int start, int stride, int stop)
Adds a constraint to an Array dimension.
Definition Array.cc:670
libdap::Array::dimension_name
virtual string dimension_name(Dim_iter i)
Returns the name of the specified dimension.
Definition Array.cc:951
libdap::Array::print_decl
void print_decl(ostream &out, string space=" ", bool print_semi=true, bool constraint_info=false, bool constrained=false) override
Prints a DDS entry for the Array.
Definition Array.cc:1163
libdap::Array::print_xml
void print_xml(ostream &out, string space=" ", bool constrained=false) override
Definition Array.cc:1201
libdap::Array::print_val
void print_val(ostream &out, string space="", bool print_decl_p=true) override
Prints the value of the variable.
Definition Array.cc:1395
libdap::Array::ptr_duplicate
BaseType * ptr_duplicate() override
Definition Array.cc:181
libdap::Array::append_dim
void append_dim(int size, const string &name="")
Add a dimension of a given size.
Definition Array.cc:533
libdap::Array::Dim_iter
std::vector< dimension >::iterator Dim_iter
Definition Array.h:241
libdap::Array::rename_dim
void rename_dim(const string &oldName="", const string &newName="")
Renames dimension.
Definition Array.cc:597
libdap::Array::transform_to_dap2
std::vector< BaseType * > * transform_to_dap2(AttrTable *parent_attr_table) override
Transforms this instance of a D4Array into the corresponding DAP2 object.
Definition Array.cc:308
libdap::Array::dimension_size
virtual int dimension_size(Dim_iter i, bool constrained=false)
Returns the size of the dimension.
Definition Array.cc:805
libdap::Array::clear_all_dims
void clear_all_dims()
Definition Array.cc:587
libdap::Array::Dim_citer
std::vector< dimension >::const_iterator Dim_citer
Definition Array.h:233
libdap::Array::add_var
void add_var(BaseType *v, Part p=nil) override
Add the BaseType pointer to this constructor type instance.
Definition Array.cc:481
libdap::Array::print_array
uint64_t print_array(FILE *out, uint64_t index, unsigned int dims, uint64_t shape[])
Print the value given the current constraint.
Definition Array.cc:1322
libdap::Array::print_as_map_xml
virtual void print_as_map_xml(ostream &out, string space=" ", bool constrained=false)
Definition Array.cc:1221
libdap::Array::print_xml_writer
void print_xml_writer(XMLWriter &xml, bool constrained=false) override
Definition Array.cc:1248
libdap::Array::reset_constraint
virtual void reset_constraint()
Reset constraint to select entire array.
Definition Array.cc:616
libdap::Array::set_var_storage_info
void set_var_storage_info(const var_storage_info &my_vs_info)
Set the variable storage information for direct IO optimization.
Definition Array.cc:1526
libdap::Array::~Array
virtual ~Array()
The Array destructor.
Definition Array.cc:175
libdap::Array::print_xml_core
virtual void print_xml_core(FILE *out, string space, bool constrained, string tag)
Definition Array.cc:1231
libdap::Array::prepend_dim
void prepend_dim(int size, const string &name="")
Definition Array.cc:566
libdap::Array::dim_begin
Dim_iter dim_begin()
Definition Array.cc:762
libdap::Array::transform_to_dap4
void transform_to_dap4(D4Group *root, Constructor *container) override
DAP2 to DAP4 transform.
Definition Array.cc:195
libdap::Array::check_semantics
bool check_semantics(string &msg, bool all=false) override
Check semantic features of the Array.
Definition Array.cc:1432
libdap::Array::dimensions
virtual unsigned int dimensions(bool constrained=false)
Return the total number of dimensions in the array.
Definition Array.cc:783
libdap::Array::dimension_stride
virtual int dimension_stride(Dim_iter i, bool constrained=false)
Returns the stride value of the constraint.
Definition Array.cc:904
libdap::AttrTable
Contains the attributes for a dataset.
Definition AttrTable.h:154
libdap::BaseType
The basic data type for the DODS DAP types.
Definition BaseType.h:120
libdap::BaseType::name
virtual string name() const
Returns the name of the class instance.
Definition BaseType.cc:317
libdap::Constructor
Definition Constructor.h:44
libdap::D4Dimension
Definition D4Dimensions.h:41
libdap::D4Dimensions
Definition D4Dimensions.h:101
libdap::D4Group
Definition D4Group.h:44
libdap::D4Maps
Definition D4Maps.h:119
libdap::Vector
Holds a one-dimensional collection of DAP2 data types.
Definition Vector.h:83
libdap::XMLWriter
Definition XMLWriter.h:39
libdap
top level DAP object to house generic methods
Definition AlarmHandler.h:36
libdap::Part
Part
Names the parts of multi-section constructor data types.
Definition Type.h:48
libdap::Array::dimension
Definition Array.h:136
libdap::Array::dimension::start
int64_t start
The constraint start index.
Definition Array.h:158
libdap::Array::dimension::stride
int64_t stride
The constraint stride.
Definition Array.h:160
libdap::Array::dimension::name
string name
The name of this dimension.
Definition Array.h:146
libdap::Array::dimension::dim
D4Dimension * dim
If not null, a weak pointer to the D4Dimension.
Definition Array.h:148
libdap::Array::dimension::size
int64_t size
The unconstrained dimension size.
Definition Array.h:145
libdap::Array::dimension::stop
int64_t stop
The constraint end index.
Definition Array.h:159
libdap::Array::dimension::use_sdim_for_slice
bool use_sdim_for_slice
Used to control printing the DMR in data responses.
Definition Array.h:156
libdap::Array::dimension::c_size
int64_t c_size
Size of dimension once constrained.
Definition Array.h:161
libdap::Array::var_chunk_info_t
Definition Array.h:188
libdap::Array::var_storage_info
Definition Array.h:195