/usr/include/libdap/D4Dimensions.h is in libdap-dev 3.18.2-2+deb9u1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | // -*- mode: c++; c-basic-offset:4 -*-
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
// Access Protocol.
// Copyright (c) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
#ifndef D4DIMENSIONS_H_
#define D4DIMENSIONS_H_
#include <string>
#include <vector>
// #include "XMLWriter.h"
using namespace std;
namespace libdap {
class D4Group;
class D4Dimensions;
class XMLWriter;
class D4Dimension {
string d_name;
unsigned long d_size;
D4Dimensions *d_parent; // This is used to get the Dimensions and then the Group object
bool d_constrained;
unsigned long long d_c_start, d_c_stride, d_c_stop;
bool d_used_by_projected_var;
public:
D4Dimension() : d_name(""), d_size(0), d_parent(0), d_constrained(false), d_c_start(0), d_c_stride(0),
d_c_stop(0), d_used_by_projected_var(false) {}
D4Dimension(const string &name, unsigned long size, D4Dimensions *d = 0) : d_name(name), d_size(size), d_parent(d),
d_constrained(false), d_c_start(0), d_c_stride(0), d_c_stop(0), d_used_by_projected_var(false) {}
string name() const {return d_name;}
void set_name(const string &name) { d_name = name; }
string fully_qualified_name() const;
unsigned long size() const { return d_size; }
void set_size(unsigned long size) { d_size = size; }
// Because we build these in the XML parser and it's all text...
void set_size(const string &size);
D4Dimensions *parent() const { return d_parent; }
void set_parent(D4Dimensions *d) { d_parent = d; }
bool constrained() const { return d_constrained; }
unsigned long long c_start() const { return d_c_start; }
unsigned long long c_stride() const { return d_c_stride; }
unsigned long long c_stop() const { return d_c_stop; }
bool used_by_projected_var() const { return d_used_by_projected_var; }
void set_used_by_projected_var(bool state) { d_used_by_projected_var = state; }
/**
* Set this Shared Diemension's constraint. While an Array Dimension object uses a
* stop value of -1 to indicate the end of the dimension, this method does not support
* that; the caller will have to sort out the correct end value for 'stop'.
* @param start Starting index (zero-based)
* @param stride The stride for the slice
* @param stop The stopping index (never greater than size -1)
*/
void set_constraint(unsigned long long start, unsigned long long stride, unsigned long long stop) {
d_c_start = start;
d_c_stride = stride;
d_c_stop = stop;
d_constrained = true;
}
void print_dap4(XMLWriter &xml) const;
};
/**
* This class holds information about dimensions. This can be used to store
* actual dimension information in an instance of BaseType and it can be
* used to store the definition of a dimension in an instance of Group.
*/
class D4Dimensions {
vector<D4Dimension*> d_dims;
D4Group *d_parent; // the group that holds this set of D4Dimensions; weak pointer, don't delete
protected:
// Note Code in Array depends on the order of these 'new' dimensions
// matching the 'old' dimensions they are derived from. See
// Array::update_dimension_pointers. jhrg 8/25/14
void m_duplicate(const D4Dimensions &rhs) {
D4DimensionsCIter i = rhs.d_dims.begin();
while (i != rhs.d_dims.end()) {
d_dims.push_back(new D4Dimension(**i++)); // deep copy
d_dims.back()->set_parent(this); // Set the Dimension's parent
}
d_parent = rhs.d_parent;
}
public:
/// Iterator used for D4Dimensions
typedef vector<D4Dimension*>::iterator D4DimensionsIter;
typedef vector<D4Dimension*>::const_iterator D4DimensionsCIter;
D4Dimensions() : d_parent(0) {}
D4Dimensions(D4Group *g) : d_parent(g) {}
D4Dimensions(const D4Dimensions &rhs) : d_parent(0) { m_duplicate(rhs); }
virtual ~D4Dimensions() {
D4DimensionsIter i = d_dims.begin();
while (i != d_dims.end())
delete *i++;
}
D4Dimensions &operator=(const D4Dimensions &rhs) {
if (this == &rhs) return *this;
m_duplicate(rhs);
return *this;
}
/// Does this D4Dimensions object actually have dimensions?
bool empty() const { return d_dims.empty(); }
D4Group *parent() const { return d_parent;}
void set_parent(D4Group *g) { d_parent = g; }
/** Append a new dimension.
* In DAP4 dimensions are either of a known size or are varying. For
* fixed-size dimensions, the value of varying should be false. For varying
* dimensions the value of 'size' will be ignored - any value can be used
* when called this method.
*
* @param dim Pointer to the D4Dimension object to add; deep copy
*/
void add_dim(D4Dimension *dim) { add_dim_nocopy(new D4Dimension(*dim)); }
/** Append a new dimension.
* @param dim Pointer to the D4Dimension object to add; copies the pointer
*/
void add_dim_nocopy(D4Dimension *dim) { dim->set_parent(this); d_dims.push_back(dim); }
/// Get an iterator to the start of the dimensions
D4DimensionsIter dim_begin() { return d_dims.begin(); }
/// Get an iterator to the end of the dimensions
D4DimensionsIter dim_end() { return d_dims.end(); }
D4Dimension *find_dim(const string &name);
/** Insert a dimension.
* Insert a dimension before the position specified by the iterator.
* @note Calling this method invalidates all iterators that reference this
* D4Dimension object.
* @param dim Inserted before i; deep copy
* @param i iterator
*/
void insert_dim(D4Dimension *dim, D4DimensionsIter i) {
insert_dim_nocopy(new D4Dimension(*dim), i);
}
/** Insert a dimension.
* @param dim Inserted before i; pointer copy
* @param i iterator
*/
void insert_dim_nocopy(D4Dimension *dim, D4DimensionsIter i) {
dim->set_parent(this);
d_dims.insert(i, dim);
}
void print_dap4(XMLWriter &xml, bool constrained = false) const;
};
} /* namespace libdap */
#endif /* D4DIMENSIONS_H_ */
|